--- /dev/null
+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