Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJuergen Haug2017-07-24 14:52:24 +0000
committerJuergen Haug2017-07-26 09:06:02 +0000
commite80049619335b2863c0535cf8f8d0f3bd784fb0f (patch)
tree0f1e2c606d9911fc138136e34467092798643cb7 /plugins/org.eclipse.etrice.core.room.ui/src
parent5e3d77e69e5c353ad11395813505959bb2df12aa (diff)
downloadorg.eclipse.etrice-e80049619335b2863c0535cf8f8d0f3bd784fb0f.tar.gz
org.eclipse.etrice-e80049619335b2863c0535cf8f8d0f3bd784fb0f.tar.xz
org.eclipse.etrice-e80049619335b2863c0535cf8f8d0f3bd784fb0f.zip
[targetLang] added content assist
Diffstat (limited to 'plugins/org.eclipse.etrice.core.room.ui/src')
-rw-r--r--plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/RoomUiModule.java8
-rw-r--r--plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/contentassist/RoomProposalProvider.java43
-rw-r--r--plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/highlight/RoomHighlightingConfiguration.java8
-rw-r--r--plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/highlight/RoomSemanticHighlightingCalculator.java49
-rw-r--r--plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/hover/RoomHoverProvider.xtend65
5 files changed, 158 insertions, 15 deletions
diff --git a/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/RoomUiModule.java b/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/RoomUiModule.java
index 69f910e00..df2230a4d 100644
--- a/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/RoomUiModule.java
+++ b/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/RoomUiModule.java
@@ -12,25 +12,26 @@
package org.eclipse.etrice.core.ui;
+import org.eclipse.etrice.core.common.ui.autoedit.BaseAutoEditStrategyProvider;
import org.eclipse.etrice.core.common.ui.hover.IKeywordHoverContentProvider;
import org.eclipse.etrice.core.common.ui.hover.KeywordEObjectTextHover;
import org.eclipse.etrice.core.common.ui.hover.KeywordHoverProvider;
import org.eclipse.etrice.core.common.ui.linking.GlobalNonPlatformURIEditorOpener;
import org.eclipse.etrice.core.ui.highlight.RoomHighlightingConfiguration;
import org.eclipse.etrice.core.ui.highlight.RoomSemanticHighlightingCalculator;
+import org.eclipse.etrice.core.ui.hover.RoomHoverProvider;
import org.eclipse.etrice.core.ui.internal.RoomActivator;
import org.eclipse.etrice.core.ui.linking.RoomHyperlinkHelper;
import org.eclipse.etrice.core.ui.outline.RoomOutlinePage;
import org.eclipse.etrice.doc.KeywordHoverContentProvider;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
+import org.eclipse.xtext.ui.editor.autoedit.AbstractEditStrategyProvider;
import org.eclipse.xtext.ui.editor.hover.IEObjectHover;
import org.eclipse.xtext.ui.editor.hover.IEObjectHoverProvider;
import org.eclipse.xtext.ui.editor.hyperlinking.IHyperlinkHelper;
import org.eclipse.xtext.ui.editor.syntaxcoloring.IHighlightingConfiguration;
import org.eclipse.xtext.ui.editor.syntaxcoloring.ISemanticHighlightingCalculator;
-import org.eclipse.etrice.core.common.ui.autoedit.BaseAutoEditStrategyProvider;
-import org.eclipse.xtext.ui.editor.autoedit.AbstractEditStrategyProvider;
import com.google.inject.Binder;
import com.google.inject.Injector;
@@ -84,11 +85,10 @@ public class RoomUiModule extends org.eclipse.etrice.core.ui.AbstractRoomUiModul
@Override
public Class<? extends IEObjectHover> bindIEObjectHover() {
- return KeywordEObjectTextHover.class;
+ return RoomHoverProvider.class;
}
public Class<? extends AbstractEditStrategyProvider> bindAbstractEditStrategyProvider() {
return BaseAutoEditStrategyProvider.class;
}
-
}
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 2c3ad47a3..255341b24 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
@@ -19,6 +19,7 @@ import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.etrice.core.common.base.AnnotationType;
+import org.eclipse.etrice.core.fsm.fSM.DetailCode;
import org.eclipse.etrice.core.naming.RoomNameProvider;
import org.eclipse.etrice.core.room.ActorClass;
import org.eclipse.etrice.core.room.ActorContainerClass;
@@ -32,6 +33,9 @@ import org.eclipse.etrice.core.room.RoomAnnotationTargetEnum;
import org.eclipse.etrice.core.room.RoomPackage;
import org.eclipse.etrice.core.room.StandardOperation;
import org.eclipse.etrice.core.room.util.RoomHelpers;
+import org.eclipse.etrice.expressions.detailcode.DefaultDetailExpressionProvider;
+import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider;
+import org.eclipse.etrice.expressions.ui.contentassist.RoomExpressionProposals;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.swt.graphics.Image;
@@ -219,18 +223,39 @@ public class RoomProposalProvider extends AbstractRoomProposalProvider {
return refs;
}
- @Override
- public void complete_DetailCode(EObject model, RuleCall ruleCall, ContentAssistContext context,
- ICompletionProposalAcceptor acceptor) {
- // TODO Auto-generated method stub
- super.complete_DetailCode(model, ruleCall, context, acceptor);
- }
+ @Inject
+ RoomExpressionProposals expressionProposals;
@Override
- public void complete_CC_STRING(EObject model, RuleCall ruleCall, ContentAssistContext context,
- ICompletionProposalAcceptor acceptor) {
- // TODO Auto-generated method stub
+ public void complete_CC_STRING(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ ActorClass ac = findActorClass(model);
+ if (ac == null) {
+ super.complete_CC_STRING(model, ruleCall, context, acceptor);
+ return;
+ }
+
+ String text = context.getCurrentNode().getText();
+ int localOffset = context.getOffset() - context.getCurrentNode().getOffset();
+ int globalOffset = context.getOffset();
+ if (context.getCurrentNode().getSemanticElement() instanceof DetailCode) {
+ IDetailExpressionProvider exprPovider = new DefaultDetailExpressionProvider(ac);
+ for(ICompletionProposal proposal : expressionProposals.createProposals(exprPovider, text, localOffset, globalOffset))
+ acceptor.accept(proposal);
+ }
+
super.complete_CC_STRING(model, ruleCall, context, acceptor);
}
+
+ private ActorClass findActorClass(EObject model) {
+ EObject parent = model;
+ while(parent != null) {
+ if(parent instanceof ActorClass){
+ return (ActorClass) parent;
+ }
+ parent = parent.eContainer();
+ }
+
+ return null;
+ }
}
diff --git a/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/highlight/RoomHighlightingConfiguration.java b/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/highlight/RoomHighlightingConfiguration.java
index 72185a2e5..a9b74e6b2 100644
--- a/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/highlight/RoomHighlightingConfiguration.java
+++ b/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/highlight/RoomHighlightingConfiguration.java
@@ -26,6 +26,7 @@ public class RoomHighlightingConfiguration extends BaseHighlightingConfig {
// provide an id string for the highlighting calculator
public static final String HL_ANNOTATION_ID = "hl_annotation";
+ public static final String HL_TARGET_LANG_KEYWORD_ID = "hl_targetlang_keyword";
// default fonts used by this specific highlighting (defaults)
// private static FontData defaultAnnotationBlockFont = new
@@ -36,6 +37,7 @@ public class RoomHighlightingConfiguration extends BaseHighlightingConfig {
public void configure(IHighlightingConfigurationAcceptor acceptor) {
super.configure(acceptor);
acceptor.acceptDefaultHighlighting(HL_ANNOTATION_ID, "Annotation", typeAnnotationBlock());
+ acceptor.acceptDefaultHighlighting(HL_TARGET_LANG_KEYWORD_ID, "Target Language Keyword", targetLangKeyword());
}
// method for calculating an actual text styles
@@ -47,5 +49,11 @@ public class RoomHighlightingConfiguration extends BaseHighlightingConfig {
// textStyle.setFontData(defaultCommentFont);
return textStyle;
}
+
+ public TextStyle targetLangKeyword() {
+ TextStyle textStyle = new TextStyle();
+ textStyle.setStyle(SWT.BOLD);
+ return textStyle;
+ }
}
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 0617dcd4f..1f059031a 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
@@ -12,19 +12,52 @@
package org.eclipse.etrice.core.ui.highlight;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
import org.eclipse.emf.ecore.EObject;
import org.eclipse.etrice.core.common.ui.highlight.BaseSemanticHighlighter;
+import org.eclipse.etrice.core.fsm.fSM.DetailCode;
+import org.eclipse.etrice.core.services.RoomGrammarAccess;
import org.eclipse.xtext.RuleCall;
import org.eclipse.xtext.nodemodel.INode;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.ui.editor.syntaxcoloring.IHighlightedPositionAcceptor;
+import com.google.common.base.CharMatcher;
+import com.google.inject.Inject;
+
/**
* @author Henrik Rentz-Reichert
*
*/
public class RoomSemanticHighlightingCalculator extends BaseSemanticHighlighter {
+ @Inject
+ RoomGrammarAccess grammar;
+
+ private static String[] fgKeywords = { "while", "do", "for", "if", "else",
+ "break", "continue", "switch", "case", "default", "static", "return",
+ "struct", "union", "sizeof", "explicit", "export", "extern", "goto",
+ "this", "throw", "try", "catch", "new", "delete",
+ "public", "private", "protected", "sizeof",
+ "typedef", "virtual", "class", "using", "template", "volatile", "mutable", "friend", "inline",
+ "typeid", "typename", "namespace",
+ "const", "int", "float", "double", "short", "long", "unsigned", "signed", "void", "true", "false"};
+
+ private List<Pattern> keywordPattern = new ArrayList<Pattern>();
+
+ protected List<Pattern> getKeywordPatterns() {
+ if(keywordPattern.isEmpty()) {
+ for(String keyword : fgKeywords)
+ keywordPattern.add(Pattern.compile(keyword));
+ }
+
+ return keywordPattern;
+ }
+
// @Override
public void provideHighlightingFor(XtextResource resource, IHighlightedPositionAcceptor acceptor) {
super.provideHighlightingFor(resource, acceptor);
@@ -37,13 +70,25 @@ public class RoomSemanticHighlightingCalculator extends BaseSemanticHighlighter
EObject obj = node.getGrammarElement();
if (obj instanceof RuleCall) {
RuleCall ruleCall = (RuleCall) obj;
- String name = ruleCall.getRule().getName();
- if (name.equals("Annotation")) {
+ if(ruleCall.getRule() == grammar.getAnnotationRule()){
acceptor.addPosition(
node.getOffset(),
node.getLength(),
RoomHighlightingConfiguration.HL_ANNOTATION_ID);
}
+ else if(node.getParent().getSemanticElement() instanceof DetailCode && ruleCall.getRule() == grammar.getCC_STRINGRule()) {
+ final String text = node.getText();
+ for(Pattern keywordPattern : getKeywordPatterns()){
+ Matcher matcher = keywordPattern.matcher(text);
+ while(matcher.find()){
+ boolean leftNotId = !Character.isJavaIdentifierPart(text.charAt(matcher.start()-1));
+ boolean rightNotId = !Character.isJavaIdentifierPart(text.charAt(matcher.end()+1));
+ if(leftNotId && rightNotId){
+ acceptor.addPosition(node.getOffset() + matcher.start(), matcher.end() - matcher.start(), RoomHighlightingConfiguration.HL_TARGET_LANG_KEYWORD_ID);
+ }
+ }
+ }
+ }
}
}
}
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
new file mode 100644
index 000000000..fcdad63a9
--- /dev/null
+++ b/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/hover/RoomHoverProvider.xtend
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * 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:
+ * Juergen Haug (initial contribution)
+ *
+ *******************************************************************************/
+
+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.room.ActorClass
+import org.eclipse.etrice.core.services.RoomGrammarAccess
+import org.eclipse.etrice.expressions.detailcode.DefaultDetailExpressionProvider
+import org.eclipse.etrice.expressions.detailcode.DetailExpressionAssistParser
+import org.eclipse.jface.text.Document
+import org.eclipse.jface.text.Region
+import org.eclipse.xtext.RuleCall
+import org.eclipse.xtext.nodemodel.util.NodeModelUtils
+import org.eclipse.xtext.resource.XtextResource
+import org.eclipse.xtext.util.Tuples
+
+class RoomHoverProvider extends KeywordEObjectTextHover {
+
+ @Inject
+ RoomGrammarAccess grammar
+
+ override protected getXtextElementAt(XtextResource resource, int offset) {
+ // work in progress - show eObject for detail code
+// val parseResult = resource.parseResult
+// if(parseResult !== null) {
+// 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 exprProvider = new DefaultDetailExpressionProvider(findActorClass(leafNode.semanticElement))
+// val parser = new DetailExpressionAssistParser(new Document(leafNode.text), offset - leafNode.offset, exprProvider)
+// val resolved = parser?.resolveLatestCompleted
+// println(resolved)
+// if(resolved?.data instanceof EObject)
+// return Tuples.create(resolved.data as EObject, new Region(offset, resolved.id.length))
+// }
+// }
+// }
+//
+ super.getXtextElementAt(resource, offset)
+ }
+
+ def private ActorClass findActorClass(EObject model) {
+ var parent = model;
+ while(parent !== null) {
+ if(parent instanceof ActorClass){
+ return parent as ActorClass;
+ }
+ parent = parent.eContainer
+ }
+ }
+
+} \ No newline at end of file

Back to the top