X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.scl.ui%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fui%2Feditor2%2FOpenDeclaration.java;h=378840397759e1fbdbdc3714b2c3c930c01fa32b;hp=522b8d3ed22a4e097ad0e98722abad9e331e8612;hb=84b211a0aa05c956d33e038a1106bb0464ce373a;hpb=d70b5f7a4cdeea05c7526560303feffeb03596b0 diff --git a/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/editor2/OpenDeclaration.java b/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/editor2/OpenDeclaration.java index 522b8d3ed..378840397 100644 --- a/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/editor2/OpenDeclaration.java +++ b/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/editor2/OpenDeclaration.java @@ -1,103 +1,117 @@ -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.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 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); - String moduleName = lineAtCaret.substring(p1+1, p2); - OpenSCLModule.openModule(moduleName); - } - 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); - if(value != null) - OpenSCLDefinition.openDefinition(value); - } - return null; - } - -} +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 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; + } + +}