diff options
author | Juergen Haug | 2017-07-24 14:52:24 +0000 |
---|---|---|
committer | Juergen Haug | 2017-07-26 09:06:02 +0000 |
commit | e80049619335b2863c0535cf8f8d0f3bd784fb0f (patch) | |
tree | 0f1e2c606d9911fc138136e34467092798643cb7 /plugins/org.eclipse.etrice.core.room.ui/src | |
parent | 5e3d77e69e5c353ad11395813505959bb2df12aa (diff) | |
download | org.eclipse.etrice-e80049619335b2863c0535cf8f8d0f3bd784fb0f.tar.gz org.eclipse.etrice-e80049619335b2863c0535cf8f8d0f3bd784fb0f.tar.xz org.eclipse.etrice-e80049619335b2863c0535cf8f8d0f3bd784fb0f.zip |
[targetLang] added content assist
Change-Id: I9283e13dcc64d3b3805e538689e5e305cda77a1c
Diffstat (limited to 'plugins/org.eclipse.etrice.core.room.ui/src')
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 |