-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 extractAt(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
- \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 identifierAtCaret = extractAt(styledText.getText(), styledText.getCaretOffset());\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
- 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.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;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class OpenDeclaration extends AbstractHandler {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(OpenDeclaration.class);
+
+ 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.scheduleOpenModule(moduleName);
+ }
+ } catch (InvalidModulePathException e) {
+ LOGGER.error("Could not open declaration {} {}", input.getModuleName(), lineAtCaret, e);
+ }
+ }
+ 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.scheduleOpenDefinition(value.getName().module, value.definitionLocation);
+ }
+ return null;
+ }
+
+}