diff options
Diffstat (limited to 'plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui')
5 files changed, 149 insertions, 64 deletions
diff --git a/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/contentassist/RoomProposalProvider.java b/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/contentassist/RoomProposalProvider.java index 2bb423390..30b9f23df 100644 --- a/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/contentassist/RoomProposalProvider.java +++ b/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/contentassist/RoomProposalProvider.java @@ -226,17 +226,21 @@ public class RoomProposalProvider extends AbstractRoomProposalProvider { @Inject RoomExpressionProposalProvider expressionProposalAdapter; + //@Inject private DCUtil util; @Override public void complete_CC_STRING(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { - String text = context.getCurrentNode().getText(); - int localOffset = context.getOffset() - context.getCurrentNode().getOffset(); - int globalOffset = context.getOffset(); if (context.getCurrentNode().getSemanticElement() instanceof DetailCode) { + String text = context.getCurrentNode().getText(); + int localOffset = context.getOffset() - context.getCurrentNode().getOffset(); + int globalOffset = context.getOffset(); DetailCode detailCode = (DetailCode) context.getCurrentNode().getSemanticElement(); IDetailExpressionProvider exprPovider = UIExpressionUtil.getExpressionProvider(detailCode); for(ICompletionProposal proposal : expressionProposalAdapter.createProposals(exprPovider, text, localOffset, globalOffset)) acceptor.accept(proposal); + + // new implementation TODO + //util.getProposals(context.getCurrentNode(), context.getOffset()); } super.complete_CC_STRING(model, ruleCall, context, acceptor); diff --git a/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/highlight/HighlightingAstVisitor.xtend b/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/highlight/HighlightingAstVisitor.xtend new file mode 100644 index 000000000..f20a4621d --- /dev/null +++ b/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/highlight/HighlightingAstVisitor.xtend @@ -0,0 +1,91 @@ +/******************************************************************************* + * Copyright (c) 2011 protos software gmbh (http://www.protos.de). + * 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 + * + * CONTRIBUTORS: + * Henrik Rentz-Reichert (initial contribution) + * + *******************************************************************************/ + +package org.eclipse.etrice.core.ui.highlight + +import org.eclipse.etrice.core.room.Attribute +import org.eclipse.etrice.core.room.InterfaceItem +import org.eclipse.etrice.core.room.MessageData +import org.eclipse.etrice.core.room.Operation +import org.eclipse.etrice.core.room.VarDecl +import org.eclipse.etrice.dctools.fsm.ast.nodes.DCAstIdentifierNode +import org.eclipse.etrice.dctools.fsm.ast.nodes.DCAstNode +import org.eclipse.etrice.dctools.fsm.ast.nodes.DCAstOtherNode +import org.eclipse.etrice.dctools.fsm.ast.util.IDCAstNodeVisitor +import org.eclipse.xtext.ide.editor.syntaxcoloring.IHighlightedPositionAcceptor +import org.eclipse.xtext.nodemodel.INode +import org.eclipse.etrice.dctools.ast.DCUtil +import org.eclipse.etrice.dctools.fsm.ast.nodes.DCAstOperationCallNode +import org.eclipse.etrice.core.room.Message + +class HighlightingAstVisitor implements IDCAstNodeVisitor { + + IHighlightedPositionAcceptor acceptor + int baseOffset + + static def highlight(INode node, IHighlightedPositionAcceptor acceptor, DCUtil util) { + val ast = util.parseAndLink(node) + val offset = util.getDelimiterAdjustedOffset(node) + val visitor = new HighlightingAstVisitor(acceptor, offset) + ast.visit(visitor) + } + + private new(IHighlightedPositionAcceptor acceptor, int baseOffset) { + this.acceptor = acceptor + this.baseOffset = baseOffset + } + + override boolean visitBegin(DCAstNode node) { + var int begin + var int length + val highlightId = switch node { + DCAstOtherNode: { + begin = node.token.begin + length = node.token.length + switch node.token.token.kind { + case COMMENT: RoomHighlightingConfiguration.COMMENT_ID + case STRING: RoomHighlightingConfiguration.STRING_ID + case NUMBER: RoomHighlightingConfiguration.NUMBER_ID + case KEYWORD: RoomHighlightingConfiguration.KEYWORD_ID + default: null + } + } + DCAstIdentifierNode: { + begin = node.token.begin + length = node.token.length + switch DCUtil.getLinkedObject(node) { + Attribute, + MessageData, + VarDecl: RoomHighlightingConfiguration.HL_EXPR_ATTRIBUTE_ID + InterfaceItem: RoomHighlightingConfiguration.HL_EXPR_INTERFACE_ITEM_ID + Operation: RoomHighlightingConfiguration.HL_EXPR_OPERATION_ID + default: null + } + } + DCAstOperationCallNode: { + begin = node.idNode.token.begin + length = node.idNode.token.length + switch node.linkedObject { + Message: RoomHighlightingConfiguration.HL_EXPR_OPERATION_ID + default: null + } + } + } + if (highlightId !== null) { + acceptor.addPosition(baseOffset + begin, length, highlightId) + } + return true + } + + override void visitEnd(DCAstNode node) { + } +} diff --git a/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/highlight/RoomSemanticHighlightingCalculator.java b/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/highlight/RoomSemanticHighlightingCalculator.java index fff548b74..8c915a7af 100644 --- a/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/highlight/RoomSemanticHighlightingCalculator.java +++ b/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/highlight/RoomSemanticHighlightingCalculator.java @@ -15,25 +15,18 @@ package org.eclipse.etrice.core.ui.highlight; import org.eclipse.emf.ecore.EObject; import org.eclipse.etrice.core.common.ui.highlight.BaseSemanticHighlighter; import org.eclipse.etrice.core.converter.RoomValueConverterService; -import org.eclipse.etrice.core.fsm.fSM.DetailCode; import org.eclipse.etrice.core.services.RoomGrammarAccess; -import org.eclipse.etrice.core.ui.util.UIExpressionUtil; -import org.eclipse.etrice.core.ui.util.UIExpressionUtil.ExpressionCache; -import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider; -import org.eclipse.etrice.expressions.ui.highlight.ExpressionRuleFactory; -import org.eclipse.etrice.expressions.ui.highlight.TargetLanguageRuleFactory; -import org.eclipse.jface.text.Document; -import org.eclipse.jface.text.rules.IRule; -import org.eclipse.jface.text.rules.IToken; -import org.eclipse.jface.text.rules.RuleBasedScanner; -import org.eclipse.jface.text.rules.Token; +import org.eclipse.etrice.dctools.ast.DCUtil; +import org.eclipse.etrice.dctools.fsm.ast.DCLanguage; +import org.eclipse.etrice.ui.behavior.fsm.Activator; +import org.eclipse.etrice.ui.behavior.fsm.actioneditor.preferences.PreferenceConstants; +import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.xtext.RuleCall; import org.eclipse.xtext.ide.editor.syntaxcoloring.IHighlightedPositionAcceptor; import org.eclipse.xtext.nodemodel.INode; import org.eclipse.xtext.resource.XtextResource; import org.eclipse.xtext.util.CancelIndicator; -import com.google.common.collect.Iterables; import com.google.inject.Inject; /** @@ -41,19 +34,24 @@ import com.google.inject.Inject; * */ public class RoomSemanticHighlightingCalculator extends BaseSemanticHighlighter { - - @Inject - RoomGrammarAccess grammar; - @Inject - RoomValueConverterService converterService; + @Inject RoomGrammarAccess grammar; + @Inject RoomValueConverterService converterService; + @Inject DCUtil detailCodeUtil; + DCLanguage language = null; + + public RoomSemanticHighlightingCalculator() { + } @Override public void provideHighlightingFor(XtextResource resource, IHighlightedPositionAcceptor acceptor, CancelIndicator cancelIndicator) { if (resource == null || resource.getParseResult() == null) return; + + if (language==null) { + setLanguage(); + } - ExpressionCache expressionCache = new ExpressionCache(); INode root = resource.getParseResult().getRootNode(); for (INode node : root.getAsTreeIterable()) { if(cancelIndicator.isCanceled()) @@ -68,39 +66,22 @@ public class RoomSemanticHighlightingCalculator extends BaseSemanticHighlighter acceptor.addPosition(node.getOffset(), node.getLength(), RoomHighlightingConfiguration.HL_ANNOTATION_ID); } else if(ruleCall.getRule() == grammar.getCC_STRINGRule()) { - detailCodeHighlight(node, acceptor, expressionCache); + HighlightingAstVisitor.highlight(node, acceptor, detailCodeUtil); } } } } - - protected void detailCodeHighlight(INode node, IHighlightedPositionAcceptor acceptor, ExpressionCache cache) { - final String text = converterService.getCC_StringConverter().stripDelim(node.getText()); - final int offset = node.getOffset() + converterService.getCC_StringConverter().getDelim().length(); - - DetailCode dc = null; - if(node.getParent().getSemanticElement() instanceof DetailCode) { - dc = (DetailCode) node.getParent().getSemanticElement(); + + private void setLanguage() { + IPreferenceStore preferenceStore = Activator.getDefault().getPreferenceStore(); + String lang = preferenceStore.getString(PreferenceConstants.EDITOR_LANGUAGE); + if (lang.equals(PreferenceConstants.JAVA_LANGUAGE)) { + language = DCLanguage.JAVA_LANGUAGE; } - IDetailExpressionProvider exprProvider = UIExpressionUtil.getExpressionProvider(dc, null, cache); - XtextHighlightStyles styles = new XtextHighlightStyles(); - RuleBasedScanner scanner = new RuleBasedScanner(); - scanner.setRules(Iterables.toArray(Iterables.concat( - TargetLanguageRuleFactory.getGeneralLiteralRules(styles), - ExpressionRuleFactory.getInitialExpressionRules(exprProvider, styles), - TargetLanguageRuleFactory.getGeneralKeywordRules(styles)) - , IRule.class)); - scanner.setRange(new Document(text), 0, text.length()); - - IToken lastToken = null; - while(lastToken != Token.EOF) { - lastToken = scanner.nextToken(); - if(lastToken != null && lastToken.getData() != null) { - acceptor.addPosition(offset + scanner.getTokenOffset(), scanner.getTokenLength(), (String) lastToken.getData()); - } + else { + language = DCLanguage.CPP_LANGUAGE; } - + detailCodeUtil.setLanguage(language); } - } diff --git a/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/hover/RoomHoverProvider.xtend b/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/hover/RoomHoverProvider.xtend index 8a0234f4c..1d61abca7 100644 --- a/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/hover/RoomHoverProvider.xtend +++ b/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/hover/RoomHoverProvider.xtend @@ -13,11 +13,10 @@ package org.eclipse.etrice.core.ui.hover import com.google.inject.Inject -import org.eclipse.emf.ecore.EObject import org.eclipse.etrice.core.common.ui.hover.KeywordEObjectTextHover import org.eclipse.etrice.core.fsm.fSM.DetailCode import org.eclipse.etrice.core.services.RoomGrammarAccess -import org.eclipse.etrice.core.ui.util.UIExpressionUtil +import org.eclipse.etrice.dctools.ast.DCUtil import org.eclipse.jface.text.Region import org.eclipse.xtext.RuleCall import org.eclipse.xtext.nodemodel.util.NodeModelUtils @@ -26,8 +25,8 @@ import org.eclipse.xtext.util.Tuples class RoomHoverProvider extends KeywordEObjectTextHover { - @Inject - RoomGrammarAccess grammar + @Inject RoomGrammarAccess grammar + @Inject DCUtil util override protected getXtextElementAt(XtextResource resource, int offset) { // lookup expression @@ -36,9 +35,13 @@ class RoomHoverProvider extends KeywordEObjectTextHover { val leafNode = NodeModelUtils.findLeafNodeAtOffset(parseResult.rootNode, offset) if(leafNode?.grammarElement instanceof RuleCall) { if((leafNode.grammarElement as RuleCall).rule == grammar.CC_STRINGRule && leafNode.semanticElement instanceof DetailCode){ - val exprFeature = UIExpressionUtil.findAtOffset(leafNode, offset) - if(exprFeature?.data instanceof EObject) - return Tuples.create(exprFeature.data as EObject, new Region(offset, exprFeature.id.length)) +// println("RoomHoverProvider at offset " + offset + " " + leafNode.offset + " " + leafNode.text.substring(offset - leafNode.offset)) + val result = util.findAtOffset(leafNode, offset) + if (result!==null) { +// val begin = result.begin +// println("RoomHoverProvider hit " + (leafNode.offset + result.begin) +" " + result.length + " " + leafNode.text.substring(begin, begin + result.length)) + return Tuples.create(result.object, new Region(leafNode.offset + result.begin, result.length)) + } } } } diff --git a/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/linking/RoomHyperlinkHelper.java b/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/linking/RoomHyperlinkHelper.java index 6e2c361e3..c04199f13 100644 --- a/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/linking/RoomHyperlinkHelper.java +++ b/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/linking/RoomHyperlinkHelper.java @@ -21,8 +21,8 @@ import org.eclipse.etrice.core.room.ActorRef; import org.eclipse.etrice.core.room.RefSegment; import org.eclipse.etrice.core.room.util.RoomHelpers; import org.eclipse.etrice.core.services.RoomGrammarAccess; -import org.eclipse.etrice.core.ui.util.UIExpressionUtil; -import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider.ExpressionFeature; +import org.eclipse.etrice.dctools.ast.DCUtil; +import org.eclipse.etrice.dctools.ast.DCUtil.FindResult; import org.eclipse.jface.text.Region; import org.eclipse.xtext.AbstractRule; import org.eclipse.xtext.RuleCall; @@ -42,6 +42,7 @@ public class RoomHyperlinkHelper extends ImportAwareHyperlinkHelper { @Inject private RoomGrammarAccess grammar; @Inject private RoomHelpers roomHelpers; + @Inject private DCUtil util; @Override public void createHyperlinksByOffset(XtextResource resource, int offset, IHyperlinkAcceptor acceptor) { @@ -67,12 +68,16 @@ public class RoomHyperlinkHelper extends ImportAwareHyperlinkHelper { } } - if(leaf.getGrammarElement() instanceof RuleCall) { - if(((RuleCall) leaf.getGrammarElement()).getRule() == grammar.getCC_STRINGRule() && leaf.getSemanticElement() instanceof DetailCode) { - ExpressionFeature exprFeature = UIExpressionUtil.findAtOffset(leaf, offset); - if(exprFeature != null && exprFeature.getData() instanceof EObject) { - Region region = new Region(leaf.getOffset(), leaf.getLength()); - createHyperlinksTo(resource, region, (EObject) exprFeature.getData(), acceptor); + if (leaf.getGrammarElement() instanceof RuleCall) { + if (((RuleCall) leaf.getGrammarElement()).getRule() == grammar.getCC_STRINGRule() + && leaf.getSemanticElement() instanceof DetailCode) { + // System.out.println("RoomHyperlinkHelper at offset " + offset + " " + leaf.getOffset() + " " + leaf.getText().substring(offset - leaf.getOffset())); + FindResult result = util.findAtOffset(leaf, offset); + if (result != null) { + // int begin = result.getBegin(); + // System.out.println("RoomHyperlinkHelper hit " + (leaf.getOffset() + result.getBegin()) +" " + result.getLength() + " " + leaf.getText().substring(begin, begin + result.getLength())); + Region region = new Region(leaf.getOffset() + result.getBegin(), result.getLength()); + createHyperlinksTo(resource, region, result.getObject(), acceptor); } } } @@ -85,12 +90,13 @@ public class RoomHyperlinkHelper extends ImportAwareHyperlinkHelper { ActorContainerClass lastAcContainer = roomHelpers.getParentContainer(aim); ActorRef lastRef = null; for (RefSegment ref : aim.getPath().getRefs()) { - for (ActorRef r : lastAcContainer.getActorRefs()) + for (ActorRef r : lastAcContainer.getActorRefs()) { if (r.getName().equals(ref.getRef())) { lastRef = r; lastAcContainer = lastRef.getType(); break; } + } } return lastRef; |