1 package net.sourceforge.jenesis4java.impl;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 import java.util.ArrayList;
41 import java.util.Collections;
42 import java.util.List;
43
44 import net.sourceforge.jenesis4java.Catch;
45 import net.sourceforge.jenesis4java.CodeWriter;
46 import net.sourceforge.jenesis4java.FormalParameter;
47 import net.sourceforge.jenesis4java.ReplacingVisitor;
48 import net.sourceforge.jenesis4java.Type;
49 import net.sourceforge.jenesis4java.impl.util.VisitorUtils;
50
51
52
53
54 class MCatch extends MStatement.BlockStatement implements Catch {
55
56 private List<FormalParameter> formalParameters;
57
58 MCatch(MVM vm, Type type, String name) {
59 super(vm);
60 formalParameters = new ArrayList<>(1);
61 formalParameters.add(createFormalParameter(type, name));
62 }
63
64 @Override
65 public FormalParameter getThrowable() {
66 return formalParameters.get(0);
67 }
68
69 @Override
70 public MCatch setThrowable(Type type, String name) {
71 formalParameters.clear();
72 formalParameters.add(createFormalParameter(type, name));
73 return this;
74 }
75
76 @Override
77 public List<FormalParameter> getThrowables() {
78 return Collections.unmodifiableList(formalParameters);
79 }
80
81 @Override
82 public Catch addThrowable(Type type, String name) {
83 formalParameters.add(createFormalParameter(type, name));
84 return this;
85 }
86
87 @Override
88 public CodeWriter toCode(CodeWriter out) {
89 appendCommentsAndLabel(out);
90 if (!out.isLineNew()) {
91 out.space();
92 }
93 out.write("catch (");
94 boolean first = true;
95 for (FormalParameter fp : formalParameters) {
96 if (!first) {
97 out.write(" | ");
98 }
99 first = false;
100 out.write(fp.getType());
101 }
102 out.space();
103 out.write(formalParameters.get(0).getName());
104 out.write(')');
105 writeBlock(out, vm.getStyle("catch"));
106 return out;
107 }
108
109 @Override
110 public void visit(ReplacingVisitor visitor) {
111 super.visit(visitor);
112 VisitorUtils.visit(formalParameters, this, visitor);
113 }
114
115 private MDeclaration.MFormalParameter createFormalParameter(Type type, String name) {
116 return new MDeclaration.MFormalParameter(vm, type, name);
117 }
118 }