Skip to content

Commit 4ee1b34

Browse files
author
angelozerr
committed
Implement WTP Validator with TypeScript gerrr. See
#27
1 parent ff2f36d commit 4ee1b34

File tree

6 files changed

+110
-15
lines changed

6 files changed

+110
-15
lines changed

eclipse/ts.eclipse.ide.core/src/ts/eclipse/ide/core/TypeScriptCorePlugin.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import ts.eclipse.ide.internal.core.resources.watcher.ResourcesWatcher;
3737
import ts.resources.ConfigurableTypeScriptResourcesManager;
3838
import ts.resources.TypeScriptResourcesManager;
39+
import ts.utils.FileUtils;
3940

4041
/**
4142
* The activator class controls the plug-in life cycle
@@ -210,4 +211,8 @@ public static IResourcesWatcher getResourcesWatcher() {
210211
return ResourcesWatcher.getInstance();
211212
}
212213

214+
public static String getFileName(IResource file) {
215+
return FileUtils.normalizeSlashes(file.getLocation().toString());
216+
}
217+
213218
}

eclipse/ts.eclipse.ide.core/src/ts/eclipse/ide/internal/core/resources/IDETypeScriptFile.java

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@
1818

1919
import ts.TypeScriptException;
2020
import ts.client.Location;
21+
import ts.eclipse.ide.core.TypeScriptCorePlugin;
2122
import ts.eclipse.ide.core.resources.IIDETypeScriptFile;
2223
import ts.eclipse.ide.core.resources.IIDETypeScriptProject;
2324
import ts.resources.AbstractTypeScriptFile;
2425
import ts.resources.SynchStrategy;
25-
import ts.utils.FileUtils;
2626

2727
/**
2828
* {@link IIDETypeScriptFile} implementation.
@@ -36,17 +36,17 @@ public class IDETypeScriptFile extends AbstractTypeScriptFile implements IIDETyp
3636
public IDETypeScriptFile(IResource file, IDocument document, IIDETypeScriptProject tsProject) {
3737
super(tsProject);
3838
this.file = file;
39-
this.document = document;
40-
this.document.addDocumentListener(this);
41-
}
42-
43-
public static String getFileName(IResource file) {
44-
return FileUtils.normalizeSlashes(file.getLocation().toString());
39+
if (document != null) {
40+
this.document = document;
41+
this.document.addDocumentListener(this);
42+
} else {
43+
this.document = null;
44+
}
4545
}
4646

4747
@Override
4848
public String getName() {
49-
return getFileName(file);
49+
return TypeScriptCorePlugin.getFileName(file);
5050
}
5151

5252
@Override
@@ -84,7 +84,9 @@ public void documentChanged(DocumentEvent event) {
8484

8585
@Override
8686
public void close() throws TypeScriptException {
87-
this.document.removeDocumentListener(this);
87+
if (this.document != null) {
88+
this.document.removeDocumentListener(this);
89+
}
8890
super.close();
8991
}
9092

@@ -106,11 +108,17 @@ public Location getLocation(int position) throws TypeScriptException {
106108

107109
@Override
108110
public String getContents() {
109-
return document.get();
111+
if (document != null) {
112+
return document.get();
113+
}
114+
return null;
110115
}
111116

112117
@Override
113118
public int getPosition(int line, int offset) throws TypeScriptException {
119+
if (document == null) {
120+
return -1;
121+
}
114122
try {
115123
return document.getLineOffset(line - 1) + offset - 1;
116124
} catch (BadLocationException e) {

eclipse/ts.eclipse.ide.core/src/ts/eclipse/ide/internal/core/resources/IDETypeScriptProject.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ public void load() throws IOException {
9595

9696
@Override
9797
public synchronized IIDETypeScriptFile openFile(IResource file, IDocument document) throws TypeScriptException {
98-
String fileName = IDETypeScriptFile.getFileName(file);
98+
String fileName = TypeScriptCorePlugin.getFileName(file);
9999
IIDETypeScriptFile tsFile = (IIDETypeScriptFile) super.getOpenedFile(fileName);
100100
if (tsFile == null) {
101101
tsFile = new IDETypeScriptFile(file, document, this);
@@ -108,7 +108,7 @@ public synchronized IIDETypeScriptFile openFile(IResource file, IDocument docume
108108

109109
@Override
110110
public void closeFile(IResource file) throws TypeScriptException {
111-
String fileName = IDETypeScriptFile.getFileName(file);
111+
String fileName = TypeScriptCorePlugin.getFileName(file);
112112
IIDETypeScriptFile tsFile = (IIDETypeScriptFile) super.getOpenedFile(fileName);
113113
if (tsFile != null) {
114114
tsFile.close();

eclipse/ts.eclipse.ide.validator.core/src/ts/eclipse/ide/validator/core/validation/TypeScriptValidationHelper.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@
1111

1212
public class TypeScriptValidationHelper {
1313

14-
public static void validate(IIDETypeScriptFile tsFile, ITypeScriptProject tsProject, IReporter reporter,
15-
IValidator validator) {
14+
public static void validate(IIDETypeScriptFile tsFile, IReporter reporter, IValidator validator) {
1615
int delay = 0;
1716
try {
17+
ITypeScriptProject tsProject = tsFile.getProject();
1818
ITypeScriptGeterrCollector collector = new TypeScriptReporterCollector(tsFile, reporter, validator);
1919
tsProject.geterr(tsFile, delay, collector);
2020
} catch (Exception e) {

eclipse/ts.eclipse.ide.validator.core/src/ts/eclipse/ide/validator/internal/core/validation/TypeScriptValidator.java

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,103 @@
11
package ts.eclipse.ide.validator.internal.core.validation;
22

3+
import org.eclipse.core.resources.IProject;
4+
import org.eclipse.core.resources.IResource;
5+
import org.eclipse.core.runtime.CoreException;
6+
import org.eclipse.core.runtime.IProgressMonitor;
37
import org.eclipse.core.runtime.IStatus;
48
import org.eclipse.core.runtime.Status;
59
import org.eclipse.core.runtime.jobs.ISchedulingRule;
610
import org.eclipse.wst.validation.AbstractValidator;
11+
import org.eclipse.wst.validation.ValidationResult;
12+
import org.eclipse.wst.validation.ValidationState;
713
import org.eclipse.wst.validation.internal.core.ValidationException;
814
import org.eclipse.wst.validation.internal.provisional.core.IReporter;
915
import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;
1016
import org.eclipse.wst.validation.internal.provisional.core.IValidatorJob;
1117

18+
import ts.TypeScriptException;
19+
import ts.eclipse.ide.core.TypeScriptCorePlugin;
20+
import ts.eclipse.ide.core.resources.IIDETypeScriptFile;
21+
import ts.eclipse.ide.core.resources.IIDETypeScriptProject;
22+
import ts.eclipse.ide.validator.core.validation.TypeScriptValidationHelper;
23+
import ts.eclipse.ide.validator.internal.core.Trace;
24+
1225
/**
1326
* WTP TypeScript Validator V2 to validate TypeScript. This validator can be
1427
* called when project is Build or Validate at hand (with Validate context
1528
* menu).
1629
*/
1730
public class TypeScriptValidator extends AbstractValidator implements IValidatorJob {
1831

32+
private static final String TYPESCRIPT_VALIDATOR_CONTEXT = "ts.eclipse.ide.validator.internal.core.validation.validatorContext"; //$NON-NLS-1$
33+
34+
@Override
35+
public void validationStarting(IProject project, ValidationState state, IProgressMonitor monitor) {
36+
if (project != null && TypeScriptCorePlugin.hasTypeScriptNature(project)) {
37+
try {
38+
IIDETypeScriptProject tsProject = TypeScriptCorePlugin.getTypeScriptProject(project, false);
39+
state.put(TYPESCRIPT_VALIDATOR_CONTEXT, tsProject);
40+
super.validationStarting(project, state, monitor);
41+
} catch (CoreException e) {
42+
Trace.trace(Trace.SEVERE, "Error while TypeScript start validation.", e);
43+
}
44+
}
45+
}
46+
47+
@Override
48+
public void validationFinishing(IProject project, ValidationState state, IProgressMonitor monitor) {
49+
if (project != null && TypeScriptCorePlugin.hasTypeScriptNature(project)) {
50+
super.validationFinishing(project, state, monitor);
51+
state.put(TYPESCRIPT_VALIDATOR_CONTEXT, null);
52+
}
53+
}
54+
55+
/**
56+
* Perform the validation using version 2 of the validation framework.
57+
*/
58+
@Override
59+
public ValidationResult validate(IResource resource, int kind, ValidationState state, IProgressMonitor monitor) {
60+
ValidationResult result = new ValidationResult();
61+
IIDETypeScriptProject tsProject = (IIDETypeScriptProject) state.get(TYPESCRIPT_VALIDATOR_CONTEXT);
62+
if (tsProject != null && TypeScriptCorePlugin.canConsumeTsserver(resource)) {
63+
IReporter reporter = result.getReporter(monitor);
64+
65+
// Here we call geterr from tsserver for the given file IResource.
66+
// geterr works only if file is opened. So we need to open the file
67+
// (even if it is not opened in an editor) and close it after.
68+
IIDETypeScriptFile tsFile = null;
69+
boolean wasOpened = false;
70+
try {
71+
String fileName = TypeScriptCorePlugin.getFileName(resource);
72+
// open ts file if needed
73+
tsFile = (IIDETypeScriptFile) tsProject.getOpenedFile(fileName);
74+
if (tsFile != null) {
75+
wasOpened = true;
76+
} else {
77+
try {
78+
tsFile = tsProject.openFile(resource, null);
79+
} catch (TypeScriptException e) {
80+
e.printStackTrace();
81+
}
82+
}
83+
if (tsFile != null) {
84+
// Validate ts file
85+
TypeScriptValidationHelper.validate(tsFile, reporter, this);
86+
}
87+
} finally {
88+
// close ts file if needed
89+
if (!wasOpened && tsFile != null) {
90+
try {
91+
tsFile.close();
92+
} catch (TypeScriptException e) {
93+
e.printStackTrace();
94+
}
95+
}
96+
}
97+
}
98+
return result;
99+
}
100+
19101
@Override
20102
public void cleanup(IReporter reporter) {
21103
// do nothing

eclipse/ts.eclipse.ide.validator.ui/src/ts/eclipse/ide/validator/internal/ui/validation/TypeScriptSourceValidator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public void validate(IValidationContext helper, IReporter reporter) throws Valid
5050
try {
5151
IIDETypeScriptProject tsProject = TypeScriptCorePlugin.getTypeScriptProject(file.getProject());
5252
IIDETypeScriptFile tsFile = tsProject.openFile(file, document);
53-
TypeScriptValidationHelper.validate(tsFile, tsProject, reporter, this);
53+
TypeScriptValidationHelper.validate(tsFile, reporter, this);
5454
} catch (Exception e) {
5555
Trace.trace(Trace.SEVERE, "Error while TypeScript validation.", e);
5656
}

0 commit comments

Comments
 (0)