Code cleanup.
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/ProtobufUiModule.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/ProtobufUiModule.java
index 76d3e0e..74c569e 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/ProtobufUiModule.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/ProtobufUiModule.java
@@ -154,6 +154,6 @@
if (w == null || !(plugin instanceof ProtobufActivator)) {
return;
}
- w.getPartService().addPartListener(new ValidateOnActivation());
+ w.getPartService().addPartListener(new ValidateFileOnActivation());
}
}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/hyperlinking/ProtobufHyperlinkDetector.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/hyperlinking/ProtobufHyperlinkDetector.java
index 2df6944..ea34dc1 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/hyperlinking/ProtobufHyperlinkDetector.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/hyperlinking/ProtobufHyperlinkDetector.java
@@ -8,22 +8,20 @@
*/
package com.google.eclipse.protobuf.ui.editor.hyperlinking;
-import static com.google.eclipse.protobuf.protobuf.ProtobufPackage.Literals.IMPORT__IMPORT_URI;
import static org.eclipse.emf.common.util.URI.createURI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.text.*;
import org.eclipse.jface.text.hyperlink.*;
import org.eclipse.xtext.CrossReference;
-import org.eclipse.xtext.nodemodel.INode;
import org.eclipse.xtext.resource.*;
import org.eclipse.xtext.ui.editor.hyperlinking.DefaultHyperlinkDetector;
import org.eclipse.xtext.ui.editor.model.IXtextDocument;
import org.eclipse.xtext.util.concurrent.IUnitOfWork;
-import com.google.eclipse.protobuf.model.util.INodes;
import com.google.eclipse.protobuf.protobuf.Import;
import com.google.eclipse.protobuf.ui.editor.FileOpener;
+import com.google.eclipse.protobuf.ui.util.Imports;
import com.google.inject.Inject;
@@ -38,7 +36,7 @@
@Inject private EObjectAtOffsetHelper eObjectAtOffsetHelper;
@Inject private FileOpener fileOpener;
- @Inject private INodes nodes;
+ @Inject private Imports imports;
@Override public IHyperlink[] detectHyperlinks(ITextViewer textViewer, final IRegion region,
final boolean canShowMultipleHyperlinks) {
@@ -62,7 +60,7 @@
return NO_HYPERLINKS;
}
Import anImport = (Import) resolved;
- String importUri = rawUriIn(anImport);
+ String importUri = imports.uriAsEnteredByUser(anImport);
if (importUri == null) {
return NO_HYPERLINKS;
}
@@ -81,18 +79,6 @@
});
}
- private String rawUriIn(Import anImport) {
- INode node = nodes.firstNodeForFeature(anImport, IMPORT__IMPORT_URI);
- if (node == null) {
- return null;
- }
- String text = node.getText();
- if (text == null || text.length() < 3) {
- return null;
- }
- return text.substring(1, text.length() - 1); // remove quotes
- }
-
private IRegion importUriRegion(IXtextDocument document, int offset, String importUri) throws BadLocationException {
int lineNumber = document.getLineOfOffset(offset);
int lineLength = document.getLineLength(lineNumber);
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ProtobufValidation.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ProtobufValidation.java
new file mode 100644
index 0000000..74a81c8
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ProtobufValidation.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2011 Google Inc.
+ *
+ * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 which accompanies this distribution, and is available at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package com.google.eclipse.protobuf.ui.validation;
+
+import static org.eclipse.xtext.EcoreUtil2.getAllContentsOfType;
+
+import java.util.List;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.part.FileEditorInput;
+import org.eclipse.xtext.resource.XtextResource;
+import org.eclipse.xtext.resource.impl.ListBasedDiagnosticConsumer;
+import org.eclipse.xtext.ui.editor.XtextEditor;
+import org.eclipse.xtext.ui.editor.model.*;
+import org.eclipse.xtext.util.concurrent.IUnitOfWork;
+
+import com.google.eclipse.protobuf.protobuf.Import;
+import com.google.eclipse.protobuf.ui.ProtobufPlugIn;
+import com.google.eclipse.protobuf.ui.util.Imports;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+final class ProtobufValidation {
+ static void validate(IEditorPart editor) {
+ if (!(editor instanceof XtextEditor) || !(editor.getEditorInput() instanceof FileEditorInput)) {
+ return;
+ }
+ XtextEditor xtextEditor = (XtextEditor) editor;
+ if (!ProtobufPlugIn.languageName().equals(xtextEditor.getLanguageName())) {
+ return;
+ }
+ validate(xtextEditor);
+ }
+
+ private static void validate(XtextEditor editor) {
+ final IXtextDocument document = editor.getDocument();
+ if (!(document instanceof XtextDocument)) {
+ return;
+ }
+ document.readOnly(new IUnitOfWork.Void<XtextResource>() {
+ @Override public void process(XtextResource resource) {
+ EObject root = rootOf(resource);
+ if (root == null) {
+ return;
+ }
+ resetUriInImports(root);
+ resource.getLinker().linkModel(root, new ListBasedDiagnosticConsumer());
+ ((XtextDocument) document).checkAndUpdateAnnotations();
+ }
+ });
+ }
+
+ private static EObject rootOf(XtextResource resource) {
+ return resource == null ? null : resource.getParseResult().getRootASTElement();
+ }
+
+ private static void resetUriInImports(EObject root) {
+ List<Import> imports = getAllContentsOfType(root, Import.class);
+ for (Import anImport : imports) {
+ resetUri(anImport);
+ }
+ }
+
+ private static void resetUri(Import anImport) {
+ Imports imports = ProtobufPlugIn.getInstance(Imports.class);
+ String uri = imports.uriAsEnteredByUser(anImport);
+ if (uri == null) {
+ return;
+ }
+ anImport.setImportURI(uri);
+ }
+
+ private ProtobufValidation() {}
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ValidateOnActivation.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ValidateFileOnActivation.java
similarity index 95%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ValidateOnActivation.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ValidateFileOnActivation.java
index 38da096..a61053a 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ValidateOnActivation.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ValidateFileOnActivation.java
@@ -10,7 +10,7 @@
package com.google.eclipse.protobuf.ui.validation;
import static com.google.eclipse.protobuf.ui.preferences.general.core.GeneralPreferences.generalPreferences;
-import static com.google.eclipse.protobuf.ui.validation.Validation.validate;
+import static com.google.eclipse.protobuf.ui.validation.ProtobufValidation.validate;
import org.eclipse.core.resources.IProject;
import org.eclipse.ui.*;
@@ -25,7 +25,7 @@
*
* @author alruiz@google.com (Alex Ruiz)
*/
-public class ValidateOnActivation implements IPartListener2 {
+public class ValidateFileOnActivation implements IPartListener2 {
/**
* Validates the active active editor in the given part that contains a .proto file in the Workspace.
* @param partRef the part that was activated.
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/Validation.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/Validation.java
deleted file mode 100644
index 477a07b..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/Validation.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (c) 2011 Google Inc.
- *
- * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse
- * Public License v1.0 which accompanies this distribution, and is available at
- *
- * http://www.eclipse.org/legal/epl-v10.html
- */
-package com.google.eclipse.protobuf.ui.validation;
-
-import static com.google.eclipse.protobuf.protobuf.ProtobufPackage.Literals.IMPORT__IMPORT_URI;
-import static com.google.eclipse.protobuf.ui.ProtobufPlugIn.languageName;
-import static org.eclipse.xtext.EcoreUtil2.getAllContentsOfType;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.xtext.nodemodel.INode;
-import org.eclipse.xtext.resource.XtextResource;
-import org.eclipse.xtext.resource.impl.ListBasedDiagnosticConsumer;
-import org.eclipse.xtext.ui.editor.XtextEditor;
-import org.eclipse.xtext.ui.editor.model.*;
-import org.eclipse.xtext.util.concurrent.IUnitOfWork;
-
-import com.google.eclipse.protobuf.conversion.STRINGValueConverter;
-import com.google.eclipse.protobuf.model.util.INodes;
-import com.google.eclipse.protobuf.protobuf.Import;
-import com.google.eclipse.protobuf.ui.ProtobufPlugIn;
-
-/**
- * @author alruiz@google.com (Alex Ruiz)
- */
-final class Validation {
- static void validate(IEditorPart editor) {
- XtextEditor protoEditor = asProtoEditor(editor);
- if (protoEditor == null) {
- return;
- }
- validate(protoEditor);
- }
-
- private static XtextEditor asProtoEditor(IEditorPart editor) {
- XtextEditor xtextEditor = asXtextEditor(editor);
- if (xtextEditor == null) {
- return null;
- }
- if (!languageName().equals(xtextEditor.getLanguageName())) {
- return null;
- }
- return xtextEditor;
- }
-
- private static XtextEditor asXtextEditor(IEditorPart editor) {
- if (!isXtextEditorContainingWorkspaceFile(editor)) {
- return null;
- }
- return (XtextEditor) editor;
- }
-
- private static boolean isXtextEditorContainingWorkspaceFile(IEditorPart editor) {
- return editor instanceof XtextEditor && editor.getEditorInput() instanceof FileEditorInput;
- }
-
- private static void validate(XtextEditor editor) {
- final IXtextDocument document = editor.getDocument();
- if (!(document instanceof XtextDocument)) {
- return;
- }
- document.readOnly(new IUnitOfWork.Void<XtextResource>() {
- @Override public void process(XtextResource resource) {
- EObject root = rootOf(resource);
- if (root == null) {
- return;
- }
- resetImports(root);
- resource.getLinker().linkModel(root, new ListBasedDiagnosticConsumer());
- ((XtextDocument) document).checkAndUpdateAnnotations();
- }
- });
- }
-
- private static EObject rootOf(XtextResource resource) {
- if (resource == null) {
- return null;
- }
- return resource.getParseResult().getRootASTElement();
- }
-
- private static void resetImports(EObject root) {
- List<Import> imports = getAllContentsOfType(root, Import.class);
- for (Import anImport : imports) {
- resetUri(anImport);
- }
- }
-
- private static void resetUri(Import anImport) {
- String uri = uriAsEnteredInEditor(anImport);
- if (uri == null) {
- return;
- }
- anImport.setImportURI(uri);
- }
-
- private static String uriAsEnteredInEditor(Import anImport) {
- INode node = nodes().firstNodeForFeature(anImport, IMPORT__IMPORT_URI);
- if (node == null) {
- return null;
- }
- String text = node.getText();
- if (text == null) {
- return null;
- }
- STRINGValueConverter converter = ProtobufPlugIn.getInstance(STRINGValueConverter.class);
- return converter.toValue(text, node);
- }
-
- private static INodes nodes() {
- return ProtobufPlugIn.getInstance(INodes.class);
- }
-
- private Validation() {}
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ValidationTrigger.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ValidationTrigger.java
index aa07a44..5370560 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ValidationTrigger.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ValidationTrigger.java
@@ -9,7 +9,7 @@
package com.google.eclipse.protobuf.ui.validation;
import static com.google.common.base.Objects.equal;
-import static com.google.eclipse.protobuf.ui.validation.Validation.validate;
+import static com.google.eclipse.protobuf.ui.validation.ProtobufValidation.validate;
import java.net.URI;
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ImportValidator.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ImportValidator.java
index bddd692..4f06f51 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ImportValidator.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ImportValidator.java
@@ -10,13 +10,16 @@
import static com.google.common.collect.Lists.newArrayList;
import static com.google.eclipse.protobuf.protobuf.ProtobufPackage.Literals.IMPORT__IMPORT_URI;
-import static com.google.eclipse.protobuf.validation.Messages.importingNonProto2;
+import static com.google.eclipse.protobuf.validation.Messages.*;
+import static java.lang.String.format;
+import static org.eclipse.xtext.util.Strings.isEmpty;
import static org.eclipse.xtext.util.Tuples.pair;
import java.util.*;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.*;
+import org.eclipse.xtext.scoping.impl.ImportUriResolver;
import org.eclipse.xtext.util.Pair;
import org.eclipse.xtext.validation.*;
@@ -25,7 +28,7 @@
import com.google.inject.Inject;
/**
- * Verifies that imports only refer to "proto2" files.
+ * Verifies that "imports" contain correct values.
*
* @author alruiz@google.com (Alex Ruiz)
*/
@@ -33,12 +36,13 @@
@Inject private ModelFinder finder;
@Inject private Protobufs protobufs;
@Inject private Resources resources;
+ @Inject private ImportUriResolver uriResolver;
@Override public void register(EValidatorRegistrar registrar) {}
/**
- * Verifies that the imports in the given root only refer to "proto2" files. If non-proto2 imports are found, this
- * validator creates warning markers for such imports.
+ * Verifies that "imports" in the given root only refer to "proto2" files. If non-proto2 "imports" are found, this
+ * validator creates warning markers for such "imports".
* @param root the root containing the imports to check.
*/
@Check public void checkNonProto2Imports(Protobuf root) {
@@ -58,7 +62,7 @@
for (Import anImport : finder.importsIn(root)) {
Resource imported = resources.importedResource(anImport, resourceSet);
checked.add(imported.getURI());
- if (!isProto2(imported)) {
+ if (!protobufs.isProto2(finder.rootOf(imported))) {
hasNonProto2 = true;
warnNonProto2ImportFoundIn(anImport);
continue;
@@ -76,7 +80,7 @@
}
}
- private boolean hasNonProto2(Pair<Import, Resource> toCheck, Set<URI> checked, ResourceSet resourceSet) {
+ private boolean hasNonProto2(Pair<Import, Resource> toCheck, Set<URI> alreadyChecked, ResourceSet resourceSet) {
Protobuf root = finder.rootOf(toCheck.getSecond());
if (!protobufs.isProto2(root)) {
return false;
@@ -84,27 +88,49 @@
List<Pair<Import, Resource>> resourcesToCheck = newArrayList();
for (Import anImport : finder.importsIn(root)) {
Resource imported = resources.importedResource(anImport, resourceSet);
- if (checked.contains(imported.getURI())) {
+ if (alreadyChecked.contains(imported.getURI())) {
continue;
}
- if (!isProto2(imported)) {
+ if (!protobufs.isProto2(finder.rootOf(imported))) {
return true;
}
resourcesToCheck.add(pair(toCheck.getFirst(), imported));
}
for (Pair<Import, Resource> p : resourcesToCheck) {
- if (hasNonProto2(p, checked, resourceSet)) {
+ if (hasNonProto2(p, alreadyChecked, resourceSet)) {
return true;
}
}
return false;
}
- private boolean isProto2(Resource r) {
- return protobufs.isProto2(finder.rootOf(r));
- }
-
private void warnNonProto2ImportFoundIn(Import anImport) {
acceptWarning(importingNonProto2, anImport, IMPORT__IMPORT_URI, INSIGNIFICANT_INDEX, null);
}
+
+ /**
+ * Verifies that the URI of the given "import" has been resolved. If the URI has not been resolved, the validator
+ * creates an error marker for the given "import."
+ * @param anImport the given "import."
+ */
+ @Check public void checkUriIsResolved(Import anImport) {
+ if (isResolved(anImport)) {
+ return;
+ }
+ uriResolver.apply(anImport);
+ if (!isResolved(anImport)) {
+ error(format(importNotFound, anImport.getImportURI()), IMPORT__IMPORT_URI);
+ }
+ }
+
+ private boolean isResolved(Import anImport) {
+ String importUri = anImport.getImportURI();
+ if (!isEmpty(importUri)) {
+ URI uri = URI.createURI(importUri);
+ if (!isEmpty(uri.scheme())) {
+ return true;
+ }
+ }
+ return false;
+ }
}
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ProtobufJavaValidator.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ProtobufJavaValidator.java
index c948992..9dac7b3 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ProtobufJavaValidator.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ProtobufJavaValidator.java
@@ -11,12 +11,9 @@
import static com.google.eclipse.protobuf.protobuf.ProtobufPackage.Literals.*;
import static com.google.eclipse.protobuf.validation.Messages.*;
import static java.lang.String.format;
-import static org.eclipse.xtext.util.Strings.isEmpty;
-import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.naming.*;
-import org.eclipse.xtext.scoping.impl.ImportUriResolver;
import org.eclipse.xtext.validation.*;
import com.google.eclipse.protobuf.grammar.Syntaxes;
@@ -39,7 +36,6 @@
@Inject private NameResolver nameResolver;
@Inject private Protobufs protobufs;
@Inject private IQualifiedNameProvider qualifiedNameProvider;
- @Inject private ImportUriResolver uriResolver;
@Check public void checkIsProto2(Protobuf protobuf) {
if (!protobufs.isProto2(protobuf)) {
@@ -47,32 +43,6 @@
}
}
- @Check public void checkImportIsResolved(Import anImport) {
- if (retryUntilItIsResolved(anImport)) {
- return;
- }
- error(format(importNotFound, anImport.getImportURI()), IMPORT__IMPORT_URI);
- }
-
- private boolean retryUntilItIsResolved(Import anImport) {
- if (isResolved(anImport)) {
- return true;
- }
- uriResolver.apply(anImport);
- return isResolved(anImport);
- }
-
- private boolean isResolved(Import anImport) {
- String importUri = anImport.getImportURI();
- if (!isEmpty(importUri)) {
- URI uri = URI.createURI(importUri);
- if (!isEmpty(uri.scheme())) {
- return true;
- }
- }
- return false;
- }
-
@Check public void checkSyntaxIsProto2(Syntax syntax) {
String name = syntax.getName();
if (Syntaxes.proto2().equals(name)) {