/
CodeBuilderFragment2.java
210 lines (189 loc) · 7.3 KB
/
CodeBuilderFragment2.java
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
/*
* $Id$
*
* SARL is an general-purpose agent programming language.
* More details on http://www.sarl.io
*
* Copyright (C) 2014-2016 the original authors or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.sarl.lang.mwe2.codebuilder;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Set;
import com.google.inject.Inject;
import com.google.inject.Injector;
import org.apache.log4j.Logger;
import org.eclipse.xtext.GrammarUtil;
import org.eclipse.xtext.util.Strings;
import org.eclipse.xtext.xbase.lib.Pure;
import org.eclipse.xtext.xtext.generator.AbstractStubGeneratingFragment;
import org.eclipse.xtext.xtext.generator.AbstractXtextGeneratorFragment;
import org.eclipse.xtext.xtext.generator.IXtextGeneratorFragment;
import org.eclipse.xtext.xtext.generator.Issues;
import org.eclipse.xtext.xtext.generator.model.GuiceModuleAccess.BindingFactory;
import org.eclipse.xtext.xtext.generator.model.project.IBundleProjectConfig;
import org.eclipse.xtext.xtext.generator.model.project.IXtextProjectConfig;
import io.sarl.lang.mwe2.codebuilder.extractor.CodeElementExtractor;
import io.sarl.lang.mwe2.codebuilder.fragments.AbstractAppenderBuilderFragment;
import io.sarl.lang.mwe2.codebuilder.fragments.AbstractBuilderBuilderFragment;
import io.sarl.lang.mwe2.codebuilder.fragments.AbstractSubCodeBuilderFragment;
import io.sarl.lang.mwe2.codebuilder.fragments.BuilderFactoryFragment;
import io.sarl.lang.mwe2.codebuilder.fragments.DocumentationBuilderFragment;
import io.sarl.lang.mwe2.codebuilder.fragments.ScriptBuilderFragment;
/**
* A {@link AbstractXtextGeneratorFragment} that enables to create a code builder for the generated language.
*
* <p>The generated builder could be used for helping to create Eobjects from scratch
* (in ui wizard for example).
*
* @author $Author: sgalland$
* @version $FullVersion$
* @mavengroupid $GroupId$
* @mavenartifactid $ArtifactId$
*/
public class CodeBuilderFragment2 extends AbstractStubGeneratingFragment {
private static final Logger LOG = Logger.getLogger(CodeBuilderFragment2.class);
private Collection<AbstractSubCodeBuilderFragment> subFragments;
@Inject
private CodeElementExtractor grammarExtractor;
/** Replies the language name.
*
* @return the language name.
*/
@Pure
public String getLanguageName() {
return Strings.toFirstUpper(GrammarUtil.getSimpleName(getGrammar()).toLowerCase());
}
@Override
public void initialize(Injector injector) {
super.initialize(injector);
this.grammarExtractor.initialize(getGrammar());
this.subFragments = initializeSubGenerators(injector);
for (final IXtextGeneratorFragment subFragment : this.subFragments) {
subFragment.initialize(injector);
}
}
/** Initialize the sub generators.
*
* @param injector the injector.
* @return the list of the generators.
*/
@SuppressWarnings("static-method")
protected Collection<AbstractSubCodeBuilderFragment> initializeSubGenerators(Injector injector) {
final Collection<AbstractSubCodeBuilderFragment> fragments = new ArrayList<>();
fragments.add(injector.getInstance(BuilderFactoryFragment.class));
fragments.add(injector.getInstance(DocumentationBuilderFragment.class));
fragments.add(injector.getInstance(AbstractBuilderBuilderFragment.class));
fragments.add(injector.getInstance(AbstractAppenderBuilderFragment.class));
fragments.add(injector.getInstance(ScriptBuilderFragment.class));
return fragments;
}
@Override
public void checkConfiguration(Issues issues) {
super.checkConfiguration(issues);
if (this.subFragments == null) {
issues.addError("Sub generators are not created"); //$NON-NLS-1$
} else {
for (final IXtextGeneratorFragment subFragment : this.subFragments) {
subFragment.checkConfiguration(issues);
}
}
}
@Override
@SuppressWarnings("checkstyle:npathcomplexity")
public void generate() {
LOG.info("Generating the code builder for " + getLanguageName()); //$NON-NLS-1$
final IXtextProjectConfig generalProjectConfig = getProjectConfig();
final IBundleProjectConfig ideProjectConfig = generalProjectConfig.getGenericIde();
if (!ideProjectConfig.isEnabled()) {
LOG.debug("Generic IDE project is disabled. Skipping the generation of the code builder."); //$NON-NLS-1$
return;
}
BuilderFactoryFragment fragment = null;
for (final AbstractSubCodeBuilderFragment subFragment : this.subFragments) {
if (subFragment instanceof BuilderFactoryFragment) {
fragment = (BuilderFactoryFragment) subFragment;
} else {
subFragment.generate();
}
}
if (fragment != null) {
fragment.generate();
}
if (isGenerateStub()) {
if (isGenerateXtendStub()) {
for (final AbstractSubCodeBuilderFragment subFragment : this.subFragments) {
subFragment.generateXtendStubs();
}
} else {
for (final AbstractSubCodeBuilderFragment subFragment : this.subFragments) {
subFragment.generateJavaStubs();
}
}
}
createRuntimeBindings().contributeTo(getLanguage().getRuntimeGenModule());
createEclipseBindings().contributeTo(getLanguage().getEclipsePluginGenModule());
createIdeaBindings().contributeTo(getLanguage().getIdeaGenModule());
createWebBindings().contributeTo(getLanguage().getWebGenModule());
final Set<String> exportedPackages = getProjectConfig().getRuntime().getManifest().getExportedPackages();
for (final AbstractSubCodeBuilderFragment subFragment : this.subFragments) {
subFragment.getExportedPackages(exportedPackages);
}
}
/** Create the runtime bindings for the builders.
*
* @return the bindings.
*/
protected BindingFactory createRuntimeBindings() {
final BindingFactory factory = new BindingFactory(getClass().getName());
for (final AbstractSubCodeBuilderFragment subFragment : this.subFragments) {
subFragment.generateRuntimeBindings(factory);
}
return factory;
}
/** Create the Eclipse bindings for the builders.
*
* @return the bindings.
*/
protected BindingFactory createEclipseBindings() {
final BindingFactory factory = new BindingFactory(getClass().getName());
for (final AbstractSubCodeBuilderFragment subFragment : this.subFragments) {
subFragment.generateEclipseBindings(factory);
}
return factory;
}
/** Create the IDEA bindings for the builders.
*
* @return the bindings.
*/
protected BindingFactory createIdeaBindings() {
final BindingFactory factory = new BindingFactory(getClass().getName());
for (final AbstractSubCodeBuilderFragment subFragment : this.subFragments) {
subFragment.generateIdeaBindings(factory);
}
return factory;
}
/** Create the Web-interface bindings for the builders.
*
* @return the bindings.
*/
protected BindingFactory createWebBindings() {
final BindingFactory factory = new BindingFactory(getClass().getName());
for (final AbstractSubCodeBuilderFragment subFragment : this.subFragments) {
subFragment.generateWebBindings(factory);
}
return factory;
}
}