Skip to content

Commit fec42ea

Browse files
committed
adds standalone validator
1 parent 431c40c commit fec42ea

File tree

6 files changed

+208
-6
lines changed

6 files changed

+208
-6
lines changed

com.minres.coredsl.tests/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@
66
/xtend-gen/
77
/bin/
88
/build/
9+
/ws/

com.minres.coredsl/src/com/minres/coredsl/CoreDslRuntimeModule.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import com.minres.coredsl.converter.CoreDslTerminalConverters;
1313
import com.minres.coredsl.scoping.CoreDslGlobalScopeProvider;
1414
import com.minres.coredsl.scoping.CoreDslResourceDescriptionStrategy;
15-
import com.minres.coredsl.scoping.CoreDslScopeProvider;
1615
import com.minres.coredsl.validation.CoreDslValidator;
1716
import com.minres.coredsl.validation.XtCoreDslValidator;
1817

@@ -37,11 +36,6 @@ public Class<? extends IDefaultResourceDescriptionStrategy> bindIDefaultResource
3736
// return XtextResourceDescriptionStrategy.class;
3837
}
3938

40-
@Override
41-
public Class<? extends IScopeProvider> bindIScopeProvider() {
42-
return CoreDslScopeProvider.class;
43-
}
44-
4539
@Override
4640
@SingletonBinding(eager = true)
4741
public Class<? extends CoreDslValidator> bindCoreDslValidator() {
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.minres.coredsl.scoping;
2+
3+
import java.io.File;
4+
import java.io.IOException;
5+
import java.util.Map;
6+
7+
import org.eclipse.emf.common.util.URI;
8+
import org.eclipse.emf.ecore.EObject;
9+
import org.eclipse.emf.ecore.EStructuralFeature;
10+
import org.eclipse.emf.ecore.plugin.EcorePlugin;
11+
import org.eclipse.xtext.resource.IResourceDescription;
12+
import org.eclipse.xtext.scoping.impl.ImportUriResolver;
13+
14+
import com.google.inject.Inject;
15+
import com.minres.coredsl.coreDsl.Import;
16+
17+
public class IncludeUriResolver extends ImportUriResolver {
18+
19+
@Inject
20+
IResourceDescription.Manager descriptionManager;
21+
22+
@Override
23+
public String resolve(EObject object) {
24+
if(object instanceof Import) {
25+
Import imp = (Import)object;
26+
URI uri = URI.createURI(imp.getImportURI());
27+
if(!uri.isRelative()) return imp.getImportURI();
28+
try {
29+
URI includedUri = uri.resolve(imp.eResource().getURI());
30+
if(!includedUri.isFile() || new File(includedUri.toFileString()).exists())
31+
return includedUri.toString();
32+
} catch (IllegalArgumentException e) {}
33+
for (Map.Entry<String, URI> element : EcorePlugin.getPlatformResourceMap().entrySet()) {
34+
try {
35+
URI includedUri = uri.resolve(element.getValue());
36+
return includedUri.toString();
37+
} catch (IllegalArgumentException e1) { }
38+
}
39+
String currentPath = "";
40+
try {
41+
currentPath = new File(".").getCanonicalPath();
42+
} catch (IOException e) {}
43+
URI includedUri = uri.resolve(URI.createFileURI(currentPath + "/"));
44+
return includedUri.toString();
45+
}
46+
return getResolver().apply(object);
47+
}
48+
49+
@Override
50+
public EStructuralFeature getAttribute(EObject object) {
51+
return getResolver().getAttribute(object);
52+
}
53+
54+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.minres.coredsl.validator
2+
3+
import com.google.inject.Binder
4+
import com.minres.coredsl.CoreDslRuntimeModule
5+
import org.eclipse.xtext.generator.IFileSystemAccess2
6+
import org.eclipse.xtext.generator.JavaIoFileSystemAccess
7+
import org.eclipse.xtext.scoping.impl.ImportUriResolver
8+
import com.minres.coredsl.scoping.IncludeUriResolver
9+
10+
/**
11+
* Use this class to register components to be used at runtime / without the Equinox extension registry.
12+
*/
13+
@SuppressWarnings("all") class CoreDslValidatorModule extends CoreDslRuntimeModule {
14+
override void configure(Binder binder) {
15+
super.configure(binder);
16+
binder.bind(IFileSystemAccess2)
17+
.to(JavaIoFileSystemAccess)
18+
binder.bind(ImportUriResolver).to(IncludeUriResolver);
19+
}
20+
21+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/*
2+
* generated by Xtext 2.26.0
3+
*/
4+
package com.minres.coredsl.validator;
5+
6+
import com.google.inject.Guice;
7+
import com.google.inject.Injector;
8+
import com.minres.coredsl.CoreDslStandaloneSetup;
9+
10+
/**
11+
* Initialization support for running Xtext languages as language servers.
12+
*/
13+
public class CoreDslValidatorSetup extends CoreDslStandaloneSetup {
14+
15+
@Override
16+
public Injector createInjector() {
17+
return Guice.createInjector(new CoreDslValidatorModule());
18+
}
19+
20+
}
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package com.minres.coredsl.validator
2+
3+
import java.io.File
4+
import java.util.concurrent.Callable
5+
import org.apache.log4j.Logger
6+
import picocli.CommandLine.Parameters
7+
import picocli.CommandLine.Option
8+
import picocli.CommandLine
9+
import com.google.inject.Inject
10+
import com.google.inject.Provider
11+
import org.eclipse.emf.ecore.resource.ResourceSet
12+
import org.eclipse.xtext.validation.IResourceValidator
13+
import org.eclipse.xtext.generator.GeneratorDelegate
14+
import org.eclipse.xtext.generator.JavaIoFileSystemAccess
15+
import org.eclipse.emf.mwe.utils.ProjectMapping
16+
import org.eclipse.emf.mwe.utils.StandaloneSetup
17+
import org.eclipse.xtext.resource.XtextResourceSet
18+
import org.eclipse.xtext.resource.XtextResource
19+
import org.eclipse.xtext.diagnostics.Severity;
20+
import org.eclipse.xtext.validation.Issue;
21+
import org.eclipse.xtext.validation.CheckMode;
22+
import org.eclipse.xtext.util.CancelIndicator;
23+
import org.eclipse.emf.common.util.URI
24+
import org.eclipse.xtext.parser.ParseException
25+
import org.eclipse.xtext.generator.GeneratorContext
26+
import org.eclipse.xtext.generator.IFileSystemAccess
27+
import java.lang.reflect.MalformedParametersException
28+
import org.apache.log4j.Level
29+
import org.eclipse.emf.ecore.resource.Resource
30+
import org.eclipse.emf.ecore.resource.Resource.Diagnostic
31+
import com.minres.coredsl.CoreDslStandaloneSetup
32+
import java.util.ArrayList
33+
34+
class Main implements Callable<Integer> {
35+
36+
@Parameters(paramLabel="input_file", arity="1..*", description="one ore more files to process")
37+
public File[] files;
38+
39+
@Option(names=#["-r", "--repository"], description="one ore more repository directories")
40+
public String[] repositories;
41+
42+
@Option(names=#["-v", "--verbose"], description="verbose output")
43+
public Boolean verbose = false;
44+
45+
def static main(String[] args) {
46+
val ret = new CommandLine(new Main()).execute(args);
47+
System.exit(ret)
48+
}
49+
50+
override Integer call() throws Exception {
51+
Logger.rootLogger.level = verbose ? Level.DEBUG : Level.INFO
52+
val injector = new CoreDslValidatorSetup().createInjectorAndDoEMFRegistration
53+
injector.getInstance(ValidatorMain).run(this)
54+
return 0;
55+
}
56+
}
57+
58+
class ValidatorMain {
59+
60+
static val logger = Logger.getLogger(typeof(ValidatorMain));
61+
62+
@Inject Provider<ResourceSet> resourceSetProvider
63+
64+
@Inject IResourceValidator validator
65+
66+
def run(Main params) {
67+
params.repositories.forEach[repository, idx|
68+
val projectMapping = new ProjectMapping
69+
projectMapping.projectName = "Repository:"+idx
70+
projectMapping.path = repository
71+
new StandaloneSetup().addProjectMapping(projectMapping)
72+
]
73+
try {
74+
for (file : params.files) {
75+
// Load the resource
76+
val resourceSet = resourceSetProvider.get as XtextResourceSet
77+
resourceSet.addLoadOption(XtextResource.OPTION_RESOLVE_ALL, Boolean.TRUE);
78+
val resource = resourceSet.getResource(URI.createFileURI(file.absolutePath), true)
79+
// Validate the resource
80+
val issues = new ArrayList<Issue>
81+
for (Diagnostic diag : resource.getErrors()) {
82+
val issue = new Issue.IssueImpl();
83+
issue.setSeverity(Severity.ERROR);
84+
issue.setMessage(diag.getMessage());
85+
issue.setLineNumber(diag.getLine());
86+
issue.setUriToProblem(resource.getURI());
87+
issues.add(issue);
88+
}
89+
if (issues.isEmpty())
90+
issues += validator.validate(resource, CheckMode.ALL, CancelIndicator.NullImpl);
91+
92+
if (!issues.empty) {
93+
val errors = issues.filter[it.severity == Severity.ERROR]
94+
val warnings = issues.filter[it.severity == Severity.WARNING]
95+
if (!errors.empty) {
96+
logger.error("Error validating " + resource.URI)
97+
issues.forEach[logger.error(it)]
98+
throw new ParseException("error validating " + resource.URI)
99+
} else if (!warnings.empty) {
100+
logger.warn("There are warnings validating " + resource.URI)
101+
issues.forEach[logger.warn(it)]
102+
}
103+
}
104+
logger.info('Code validation for ' + file + ' finished')
105+
}
106+
} catch (MalformedParametersException | IllegalArgumentException | ParseException e) {
107+
logger.error("Command line error " + e.message, e)
108+
return -1
109+
}
110+
return 0
111+
}
112+
}

0 commit comments

Comments
 (0)