-
Notifications
You must be signed in to change notification settings - Fork 316
/
AbstractExecutableBuilder.xtend
145 lines (124 loc) · 4.33 KB
/
AbstractExecutableBuilder.xtend
1
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/*******************************************************************************
* Copyright (c) 2013, 2016 itemis AG (http://www.itemis.eu) and others.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/
package org.eclipse.xtend.ide.codebuilder
import com.google.common.collect.Lists
import com.google.inject.Inject
import java.util.Collections
import java.util.List
import java.util.Set
import org.eclipse.emf.ecore.EObject
import org.eclipse.jface.viewers.StyledString
import org.eclipse.swt.graphics.Image
import org.eclipse.xtend.lib.annotations.Accessors
import org.eclipse.xtext.common.types.JvmTypeParameter
import org.eclipse.xtext.common.types.xtext.ui.JdtVariableCompletions
import org.eclipse.xtext.xbase.compiler.ISourceAppender
import org.eclipse.xtext.xbase.typesystem.references.LightweightTypeReference
/**
* @author Jan Koehnlein
*/
abstract class AbstractExecutableBuilder extends AbstractCodeBuilder {
public static val DEFAULT_BODY = 'throw new UnsupportedOperationException("TODO: auto-generated method stub")'
@Inject extension JdtVariableCompletions
@Inject extension CodeBuilderFactory
@Accessors List<AbstractParameterBuilder> parameterBuilders = emptyList
@Accessors List<LightweightTypeReference> exceptions = emptyList
@Accessors List<JvmTypeParameter> typeParameters = emptyList
@Accessors var (ISourceAppender)=>void bodyGenerator
@Accessors boolean varArgsFlag
def appendBody(ISourceAppender appendable, String statementSeparator) {
appendable.append(' {').increaseIndentation.newLine
if (bodyGenerator !== null)
bodyGenerator.apply(appendable)
else
appendable.append(defaultBody)
appendable.append(statementSeparator).decreaseIndentation.newLine.append('}')
}
def protected String defaultBody() {
DEFAULT_BODY
}
override setContext(EObject ctx) {
super.setContext(ctx)
parameterBuilders.forEach[context = ctx]
}
def newParameterBuilder() {
if(parameterBuilders.empty)
parameterBuilders = newArrayList
val builder = createParameterBuilder(owner)
builder.context = context
parameterBuilders.add(builder)
builder
}
def protected appendParameters(ISourceAppender appendable) {
appendable.append("(")
val notAllowed = newHashSet
if(!parameterBuilders.isEmpty)
parameterBuilders.lastOrNull.varArgsFlag = varArgsFlag
for (i : 0 ..< parameterBuilders.size) {
val parameterBuilder = parameterBuilders.get(i)
val acceptor = new VariableNameAcceptor(notAllowed)
if(parameterBuilder.name === null) {
getVariableProposals(parameterBuilder.type.identifier, context,
JdtVariableCompletions.VariableType.PARAMETER, notAllowed, acceptor)
parameterBuilder.name = acceptor.variableName
}
parameterBuilder.build(appendable)
if (i != parameterBuilders.size - 1)
appendable.append(", ")
}
appendable.append(")")
}
def protected appendThrowsClause(ISourceAppender appendable) {
val iterator = exceptions.iterator
if (iterator.hasNext()) {
appendable.append(" throws ")
do {
val typeRef = iterator.next()
if (typeRef !== null) {
appendable.appendType(typeRef, "Exception")
}
if (iterator.hasNext())
appendable.append(", ")
} while (iterator.hasNext())
}
appendable
}
override getImage() {
switch visibility {
case PRIVATE: 'methpri_obj.gif'
case PROTECTED: 'methpro_obj.gif'
case PUBLIC: 'methpub_obj.gif'
default: 'methdef_obj.gif'
}
}
override isValid() {
parameterBuilders.forall[isValid]
&& !exceptions.contains(null)
&& !typeParameters.contains(null)
&& super.isValid
}
}
class VariableNameAcceptor implements JdtVariableCompletions.CompletionDataAcceptor {
val Set<String> notallowed
val Set<String> variableNames = newHashSet()
new(Set<String> notallowed) {
this.notallowed = notallowed;
}
override accept(String replaceText, StyledString label, Image img) {
variableNames.add(replaceText);
notallowed.add(replaceText);
}
def getVariableName() {
val candidates = Lists.newArrayList(variableNames);
Collections.sort(candidates, [left, right|left.length() - right.length()])
if (candidates.size > 0)
return candidates.get(0)
return ""
}
}