]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/editor2/OpenDeclaration.java
(refs #7386) Minor SCL tools improvements
[simantics/platform.git] / bundles / org.simantics.scl.ui / src / org / simantics / scl / ui / editor2 / OpenDeclaration.java
index 522b8d3ed22a4e097ad0e98722abad9e331e8612..378840397759e1fbdbdc3714b2c3c930c01fa32b 100644 (file)
-package org.simantics.scl.ui.editor2;\r
-\r
-\r
-import org.eclipse.core.commands.AbstractHandler;\r
-import org.eclipse.core.commands.ExecutionEvent;\r
-import org.eclipse.core.commands.ExecutionException;\r
-import org.eclipse.swt.custom.StyledText;\r
-import org.eclipse.swt.widgets.Control;\r
-import org.eclipse.ui.IEditorPart;\r
-import org.eclipse.ui.PlatformUI;\r
-import org.simantics.scl.compiler.elaboration.modules.SCLValue;\r
-import org.simantics.scl.ui.editor.completion.SCLTextEditorEnvironment;\r
-\r
-public class OpenDeclaration extends AbstractHandler {\r
-\r
-    private static boolean isIdentifierPart(char c) {\r
-        return Character.isJavaIdentifierPart(c) || c=='.';\r
-    }\r
-    \r
-    private static String extractIdentifierAt(String text, int caretPos) {\r
-        int startPos = caretPos;\r
-        while(startPos > 0 && isIdentifierPart(text.charAt(startPos-1)))\r
-            --startPos;\r
-        int endPos = caretPos;\r
-        while(endPos < text.length() && isIdentifierPart(text.charAt(endPos)))\r
-            ++endPos;\r
-        return text.substring(startPos, endPos);\r
-    }\r
-    \r
-    private static final String SYMBOL_CHARS = "!$%&*+/<=>?@\\^|-:~.";\r
-    \r
-    private static boolean isSymbolPart(char c) {\r
-        for(int i=0;i<SYMBOL_CHARS.length();++i)\r
-            if(SYMBOL_CHARS.charAt(i) == c)\r
-                return true;\r
-        return false;\r
-    }\r
-    \r
-    private static String extractSymbolAt(String text, int caretPos) {\r
-        int startPos = caretPos;\r
-        while(startPos > 0 && isSymbolPart(text.charAt(startPos-1)))\r
-            --startPos;\r
-        int endPos = caretPos;\r
-        while(endPos < text.length() && isSymbolPart(text.charAt(endPos)))\r
-            ++endPos;\r
-        return text.substring(startPos, endPos);\r
-    }\r
-    \r
-    public static String extractIdentifierOrSymbolAt(String text, int caretPos) {\r
-        String result = extractIdentifierAt(text, caretPos);\r
-        if(!result.isEmpty())\r
-            return result;\r
-        return extractSymbolAt(text, caretPos);\r
-    }\r
-    \r
-    private static String extractLineAt(String text, int caretPos) {\r
-        int startPos = caretPos;\r
-        while(startPos > 0 && !isNewline(text.charAt(startPos-1)))\r
-            --startPos;\r
-        int endPos = caretPos;\r
-        while(endPos < text.length() && !isNewline(text.charAt(endPos)))\r
-            ++endPos;\r
-        return text.substring(startPos, endPos);\r
-    }\r
-    \r
-    private static boolean isNewline(char c) {\r
-        return c=='\n' || c=='\r';\r
-    }\r
-\r
-    @Override\r
-    public Object execute(ExecutionEvent event) throws ExecutionException {\r
-        IEditorPart editor = \r
-                PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();\r
-        if(!(editor instanceof SCLModuleEditor2))\r
-            return null;\r
-        SCLModuleEditor2 moduleEditor = (SCLModuleEditor2)editor;\r
-        StyledText styledText = (StyledText)moduleEditor.getAdapter(Control.class);\r
-        String text = styledText.getText();\r
-        int caretOffset = styledText.getCaretOffset();\r
-        \r
-        // Find the line where the caret is\r
-        String lineAtCaret = extractLineAt(text, caretOffset);\r
-        if(lineAtCaret.startsWith("import ") || lineAtCaret.startsWith("include ")) {\r
-            int p1 = lineAtCaret.indexOf('"', 6);\r
-            int p2 = lineAtCaret.indexOf('"', p1+1);\r
-            String moduleName = lineAtCaret.substring(p1+1, p2);\r
-            OpenSCLModule.openModule(moduleName);\r
-        }\r
-        else {\r
-            // Try to find an identifier at caret\r
-            String identifierAtCaret = extractIdentifierOrSymbolAt(text, caretOffset);\r
-            if(identifierAtCaret.isEmpty())\r
-                return null;\r
-            SCLTextEditorEnvironment editorEnvironment = moduleEditor.getSCLTextEditorEnvironment();\r
-            editorEnvironment.updateEnvironment(moduleEditor.getDocument());\r
-            SCLValue value = editorEnvironment.getValue(identifierAtCaret);\r
-            if(value != null)\r
-                OpenSCLDefinition.openDefinition(value);\r
-        }\r
-        return null;\r
-    }\r
-\r
-}\r
+package org.simantics.scl.ui.editor2;
+
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.PlatformUI;
+import org.simantics.scl.compiler.elaboration.modules.SCLValue;
+import org.simantics.scl.compiler.errors.Locations;
+import org.simantics.scl.compiler.module.InvalidModulePathException;
+import org.simantics.scl.compiler.module.ModuleUtils;
+import org.simantics.scl.compiler.source.ModuleSource;
+import org.simantics.scl.osgi.SCLOsgi;
+import org.simantics.scl.ui.editor.completion.SCLTextEditorEnvironment;
+
+public class OpenDeclaration extends AbstractHandler {
+
+    private static boolean isIdentifierPart(char c) {
+        return Character.isJavaIdentifierPart(c) || c=='.';
+    }
+    
+    private static String extractIdentifierAt(String text, int caretPos) {
+        int startPos = caretPos;
+        while(startPos > 0 && isIdentifierPart(text.charAt(startPos-1)))
+            --startPos;
+        int endPos = caretPos;
+        while(endPos < text.length() && isIdentifierPart(text.charAt(endPos)))
+            ++endPos;
+        return text.substring(startPos, endPos);
+    }
+    
+    private static final String SYMBOL_CHARS = "!$%&*+/<=>?@\\^|-:~.";
+    
+    private static boolean isSymbolPart(char c) {
+        for(int i=0;i<SYMBOL_CHARS.length();++i)
+            if(SYMBOL_CHARS.charAt(i) == c)
+                return true;
+        return false;
+    }
+    
+    private static String extractSymbolAt(String text, int caretPos) {
+        int startPos = caretPos;
+        while(startPos > 0 && isSymbolPart(text.charAt(startPos-1)))
+            --startPos;
+        int endPos = caretPos;
+        while(endPos < text.length() && isSymbolPart(text.charAt(endPos)))
+            ++endPos;
+        return text.substring(startPos, endPos);
+    }
+    
+    public static String extractIdentifierOrSymbolAt(String text, int caretPos) {
+        String result = extractIdentifierAt(text, caretPos);
+        if(!result.isEmpty())
+            return result;
+        return extractSymbolAt(text, caretPos);
+    }
+    
+    private static String extractLineAt(String text, int caretPos) {
+        int startPos = caretPos;
+        while(startPos > 0 && !isNewline(text.charAt(startPos-1)))
+            --startPos;
+        int endPos = caretPos;
+        while(endPos < text.length() && !isNewline(text.charAt(endPos)))
+            ++endPos;
+        return text.substring(startPos, endPos);
+    }
+    
+    private static boolean isNewline(char c) {
+        return c=='\n' || c=='\r';
+    }
+
+    @Override
+    public Object execute(ExecutionEvent event) throws ExecutionException {
+        IEditorPart editor = 
+                PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
+        if(!(editor instanceof SCLModuleEditor2))
+            return null;
+        SCLModuleEditor2 moduleEditor = (SCLModuleEditor2)editor;
+        StyledText styledText = (StyledText)moduleEditor.getAdapter(Control.class);
+        String text = styledText.getText();
+        int caretOffset = styledText.getCaretOffset();
+        
+        // Find the line where the caret is
+        String lineAtCaret = extractLineAt(text, caretOffset);
+        if(lineAtCaret.startsWith("import ") || lineAtCaret.startsWith("include ")) {
+            int p1 = lineAtCaret.indexOf('"', 6);
+            int p2 = lineAtCaret.indexOf('"', p1+1);
+            SCLModuleEditorInput input = (SCLModuleEditorInput)moduleEditor.getEditorInput();
+            try {
+                   String moduleName = ModuleUtils.resolveAbsolutePath(input.getModuleName(), lineAtCaret.substring(p1+1, p2));
+               ModuleSource source = SCLOsgi.SOURCE_REPOSITORY.getModuleSource(moduleName, null);
+                if (source != null) {
+                       OpenSCLModule.openModule(moduleName);
+                }
+            } catch (InvalidModulePathException e) {
+               // Nothing to do
+            }
+        }
+        else {
+            // Try to find an identifier at caret
+            String identifierAtCaret = extractIdentifierOrSymbolAt(text, caretOffset);
+            if(identifierAtCaret.isEmpty())
+                return null;
+            SCLTextEditorEnvironment editorEnvironment = moduleEditor.getSCLTextEditorEnvironment();
+            editorEnvironment.updateEnvironment(moduleEditor.getDocument());
+            SCLValue value = editorEnvironment.getValue(identifierAtCaret);
+            System.out.println("identifierAtCaret = " + identifierAtCaret + " [" + Locations.beginOf(value.definitionLocation) + ", " + Locations.endOf(value.definitionLocation) + "]");
+            if(value != null)
+                OpenSCLDefinition.openDefinition(value);
+        }
+        return null;
+    }
+
+}