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 | |
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
61 files changed, 1861 insertions, 164 deletions
diff --git a/plugins/org.eclipse.etrice.core.common.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.etrice.core.common.ui/META-INF/MANIFEST.MF index 3663ffd1b..8a6ba1b45 100644 --- a/plugins/org.eclipse.etrice.core.common.ui/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.etrice.core.common.ui/META-INF/MANIFEST.MF @@ -27,6 +27,7 @@ Export-Package: org.eclipse.etrice.core.common.ui.autoedit, org.eclipse.etrice.core.common.ui.contentassist.antlr, org.eclipse.etrice.core.common.ui.contentassist.antlr.internal, org.eclipse.etrice.core.common.ui.editor, + org.eclipse.etrice.core.common.ui.highlight, org.eclipse.etrice.core.common.ui.hover, org.eclipse.etrice.core.common.ui.internal, org.eclipse.etrice.core.common.ui.labeling, diff --git a/plugins/org.eclipse.etrice.core.common/src/org/eclipse/etrice/core/common/converter/CC_StringConveter.java b/plugins/org.eclipse.etrice.core.common/src/org/eclipse/etrice/core/common/converter/CC_StringConveter.java index b1c3a14ee..a5ec9d311 100644 --- a/plugins/org.eclipse.etrice.core.common/src/org/eclipse/etrice/core/common/converter/CC_StringConveter.java +++ b/plugins/org.eclipse.etrice.core.common/src/org/eclipse/etrice/core/common/converter/CC_StringConveter.java @@ -5,25 +5,39 @@ import org.eclipse.etrice.core.common.util.CCStringIndentation; import org.eclipse.xtext.conversion.ValueConverterException; import org.eclipse.xtext.conversion.impl.AbstractLexerBasedConverter; import org.eclipse.xtext.nodemodel.INode; -import org.eclipse.xtext.util.Strings; public class CC_StringConveter extends AbstractLexerBasedConverter<String> { public final static String DELIM = "'''"; - public final static String NEW_LINE = Strings.newLine(); + final static String CRLF = "\r\n"; + final static String LF = "\n"; @Override protected String toEscapedString(String value) { - return DELIM + NEW_LINE + value + NEW_LINE + DELIM; + String lineEnding = getLineEnding(value); + return DELIM + lineEnding + value + lineEnding + DELIM; } public String toValue(String string, INode node) { if (string == null) return null; try { - return new CCStringIndentation(string.substring(DELIM.length(), string.length() - DELIM.length())).removeIndentation(); + return new CCStringIndentation(stripDelim(string)).removeIndentation(); } catch (IllegalArgumentException e) { throw new ValueConverterException(e.getMessage(), node, e); } } + + static public String stripDelim(String ccstring) { + if(ccstring.startsWith(DELIM) && ccstring.endsWith(DELIM)) + return ccstring.substring(DELIM.length(), ccstring.length() - DELIM.length()); + + return ccstring; + } + + static public String getLineEnding(String ccstring) { + if (ccstring.indexOf(CRLF) >= 0) + return CRLF; + return LF; + } } diff --git a/plugins/org.eclipse.etrice.core.common/src/org/eclipse/etrice/core/common/util/CCStringIndentation.java b/plugins/org.eclipse.etrice.core.common/src/org/eclipse/etrice/core/common/util/CCStringIndentation.java index 1c86eea98..c2111347e 100644 --- a/plugins/org.eclipse.etrice.core.common/src/org/eclipse/etrice/core/common/util/CCStringIndentation.java +++ b/plugins/org.eclipse.etrice.core.common/src/org/eclipse/etrice/core/common/util/CCStringIndentation.java @@ -7,17 +7,17 @@ import org.eclipse.etrice.core.common.converter.CC_StringConveter; import org.eclipse.xtext.util.Strings; public class CCStringIndentation { - - protected final static String NEW_LINE = CC_StringConveter.NEW_LINE; private String ccString; private List<String> splittedLines; private boolean ignoreFirst; private boolean ignoreLast; + private String lineEnding; public CCStringIndentation(String ccString){ this.ccString = ccString; - this.splittedLines = Strings.split(ccString, NEW_LINE); + this.lineEnding = CC_StringConveter.getLineEnding(ccString); + this.splittedLines = Strings.split(ccString, lineEnding); this.ignoreFirst = splittedLines.size() > 1 && splittedLines.get(0).isEmpty(); this.ignoreLast = splittedLines.size() > 1 && splittedLines.get(splittedLines.size() - 1).trim().isEmpty(); } @@ -56,7 +56,7 @@ public class CCStringIndentation { String line = lines.get(i); if (i == 0 && ignoreFirst) { - offset += line.length() + NEW_LINE.length(); + offset += line.length() + lineEnding.length(); continue; } @@ -69,9 +69,9 @@ public class CCStringIndentation { else pos = new int[] { offset, line.length() }; if (i < lines.size() - 1) - pos[1] += NEW_LINE.length(); + pos[1] += lineEnding.length(); - offset += line.length() + NEW_LINE.length(); + offset += line.length() + lineEnding.length(); offsetLengthLines.add(pos); } @@ -110,13 +110,8 @@ public class CCStringIndentation { for (String line : lines) wsLines.add(Strings.getLeadingWhiteSpace(line)); - String minIndent = wsLines.get(0); - for (int i = 0; i < lines.size(); i++) { - if (!lines.get(i).isEmpty() && wsLines.get(i).length() < minIndent.length()) - minIndent = wsLines.get(i); - } - - String commonIndent = minIndent; + final String baseIndent = wsLines.get(0); + String commonIndent = baseIndent; for(String wsLine : wsLines){ if(!wsLine.isEmpty()) commonIndent = com.google.common.base.Strings.commonPrefix(commonIndent, wsLine); @@ -125,10 +120,10 @@ public class CCStringIndentation { if (!consistent) return commonIndent; - int afterMinIndentIndex = minIndent.length(); + int afterMinIndentIndex = baseIndent.length(); // 1. check if every line contains the minIndent - if(!minIndent.equals(commonIndent)) + if(!baseIndent.equals(commonIndent)) return null; // 2. check if there is still space between minIndent and first terminal @@ -146,7 +141,7 @@ public class CCStringIndentation { return null; } - return minIndent; + return baseIndent; } } diff --git a/plugins/org.eclipse.etrice.core.fsm/src/org/eclipse/etrice/core/fsm/validation/FSMJavaValidator.java b/plugins/org.eclipse.etrice.core.fsm/src/org/eclipse/etrice/core/fsm/validation/FSMJavaValidator.java index 9300930cd..68b23015d 100644 --- a/plugins/org.eclipse.etrice.core.fsm/src/org/eclipse/etrice/core/fsm/validation/FSMJavaValidator.java +++ b/plugins/org.eclipse.etrice.core.fsm/src/org/eclipse/etrice/core/fsm/validation/FSMJavaValidator.java @@ -5,10 +5,12 @@ package org.eclipse.etrice.core.fsm.validation; import java.util.ArrayList; import java.util.Collection; +import java.util.List; import org.eclipse.emf.common.util.TreeIterator; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; +import org.eclipse.etrice.core.common.converter.CC_StringConveter; import org.eclipse.etrice.core.common.util.CCStringIndentation; import org.eclipse.etrice.core.fsm.fSM.ChoicePoint; import org.eclipse.etrice.core.fsm.fSM.DetailCode; @@ -23,8 +25,13 @@ import org.eclipse.etrice.core.fsm.fSM.StateGraph; import org.eclipse.etrice.core.fsm.fSM.StateGraphItem; import org.eclipse.etrice.core.fsm.fSM.TrPoint; import org.eclipse.etrice.core.fsm.fSM.Transition; +import org.eclipse.etrice.core.fsm.services.FSMGrammarAccess; import org.eclipse.etrice.core.fsm.validation.FSMValidationUtilXtend.Result; -import org.eclipse.xtext.util.Strings; +import org.eclipse.xtext.RuleCall; +import org.eclipse.xtext.nodemodel.ICompositeNode; +import org.eclipse.xtext.nodemodel.ILeafNode; +import org.eclipse.xtext.nodemodel.INode; +import org.eclipse.xtext.nodemodel.util.NodeModelUtils; import org.eclipse.xtext.validation.Check; import com.google.common.collect.ArrayListMultimap; @@ -118,6 +125,9 @@ public class FSMJavaValidator extends org.eclipse.etrice.core.fsm.validation.Abs } } + @Inject + FSMGrammarAccess grammar; + @Check public void checkDetailCode(DetailCode dc) { if (dc.getLines().isEmpty()) @@ -130,10 +140,15 @@ public class FSMJavaValidator extends org.eclipse.etrice.core.fsm.validation.Abs // warning("multi line string", dc, FSMPackage.Literals.DETAIL_CODE__LINES, dc.getLines().indexOf(line), MULTI_LINE_DETAILCODE); // } - for(String line : dc.getLines()){ - CCStringIndentation ccStringIndent = new CCStringIndentation(line); - if(!ccStringIndent.validateIndentation()) - warning("Inconsistent indentation", dc, FSMPackage.Literals.DETAIL_CODE__LINES, dc.getLines().indexOf(line)); + List<INode> lineNodes = NodeModelUtils.findNodesForFeature(dc, FSMPackage.Literals.DETAIL_CODE__LINES); + for(INode lineNode : lineNodes){ + if(lineNode.getGrammarElement() instanceof RuleCall){ + if(((RuleCall)lineNode.getGrammarElement()).getRule() == grammar.getCC_STRINGRule()) { + CCStringIndentation ccStringIndent = new CCStringIndentation(CC_StringConveter.stripDelim(lineNode.getText())); + if(!ccStringIndent.validateIndentation()) + warning("Inconsistent indentation", dc, FSMPackage.Literals.DETAIL_CODE__LINES, lineNodes.indexOf(lineNode)); + } + } } } diff --git a/plugins/org.eclipse.etrice.core.room.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.etrice.core.room.ui/META-INF/MANIFEST.MF index e7fcb83aa..5ed19a39e 100644 --- a/plugins/org.eclipse.etrice.core.room.ui/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.etrice.core.room.ui/META-INF/MANIFEST.MF @@ -22,7 +22,8 @@ Require-Bundle: org.eclipse.etrice.core.fsm.ui;bundle-version="1.1.1", org.eclipse.compare, org.eclipse.core.filesystem;bundle-version="1.3.0", org.eclipse.help, - com.google.inject + com.google.inject, + org.eclipse.etrice.expressions.ui Import-Package: org.apache.log4j Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Export-Package: org.eclipse.etrice.core.ui, 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 diff --git a/plugins/org.eclipse.etrice.core.room.ui/xtend-gen/org/eclipse/etrice/core/ui/hover/RoomHoverProvider.java b/plugins/org.eclipse.etrice.core.room.ui/xtend-gen/org/eclipse/etrice/core/ui/hover/RoomHoverProvider.java new file mode 100644 index 000000000..04fbae275 --- /dev/null +++ b/plugins/org.eclipse.etrice.core.room.ui/xtend-gen/org/eclipse/etrice/core/ui/hover/RoomHoverProvider.java @@ -0,0 +1,45 @@ +/** + * 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.room.ActorClass; +import org.eclipse.etrice.core.services.RoomGrammarAccess; +import org.eclipse.jface.text.IRegion; +import org.eclipse.xtext.resource.XtextResource; +import org.eclipse.xtext.util.Pair; + +@SuppressWarnings("all") +public class RoomHoverProvider extends KeywordEObjectTextHover { + @Inject + private RoomGrammarAccess grammar; + + @Override + protected Pair<EObject, IRegion> getXtextElementAt(final XtextResource resource, final int offset) { + return super.getXtextElementAt(resource, offset); + } + + private ActorClass findActorClass(final EObject model) { + EObject parent = model; + while ((parent != null)) { + { + if ((parent instanceof ActorClass)) { + return ((ActorClass) parent); + } + EObject _eContainer = parent.eContainer(); + parent = _eContainer; + } + } + return null; + } +} diff --git a/plugins/org.eclipse.etrice.expressions.ui/.classpath b/plugins/org.eclipse.etrice.expressions.ui/.classpath new file mode 100644 index 000000000..13a6c6528 --- /dev/null +++ b/plugins/org.eclipse.etrice.expressions.ui/.classpath @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<classpath> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> + <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> + <classpathentry kind="src" path="src"/> + <classpathentry kind="src" path="xtend-gen"/> + <classpathentry kind="output" path="bin"/> +</classpath> diff --git a/plugins/org.eclipse.etrice.expressions.ui/.gitignore b/plugins/org.eclipse.etrice.expressions.ui/.gitignore new file mode 100644 index 000000000..1a7726dc2 --- /dev/null +++ b/plugins/org.eclipse.etrice.expressions.ui/.gitignore @@ -0,0 +1,4 @@ +bin +*._trace +*.smap +*.xtendbin diff --git a/plugins/org.eclipse.etrice.expressions.ui/.project b/plugins/org.eclipse.etrice.expressions.ui/.project new file mode 100644 index 000000000..391dbeab0 --- /dev/null +++ b/plugins/org.eclipse.etrice.expressions.ui/.project @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>org.eclipse.etrice.expressions.ui</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.xtext.ui.shared.xtextBuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.jdt.core.javabuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.pde.ManifestBuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.pde.SchemaBuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.pde.PluginNature</nature> + <nature>org.eclipse.jdt.core.javanature</nature> + <nature>org.eclipse.xtext.ui.shared.xtextNature</nature> + </natures> +</projectDescription> diff --git a/plugins/org.eclipse.etrice.expressions.ui/.settings/org.eclipse.jdt.core.prefs b/plugins/org.eclipse.etrice.expressions.ui/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..0c68a61dc --- /dev/null +++ b/plugins/org.eclipse.etrice.expressions.ui/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/plugins/org.eclipse.etrice.expressions.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.etrice.expressions.ui/META-INF/MANIFEST.MF new file mode 100644 index 000000000..272f1f3c2 --- /dev/null +++ b/plugins/org.eclipse.etrice.expressions.ui/META-INF/MANIFEST.MF @@ -0,0 +1,18 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: eTrice Expressions UI +Bundle-SymbolicName: org.eclipse.etrice.expressions.ui;singleton:=true +Bundle-Version: 1.1.1.qualifier +Bundle-RequiredExecutionEnvironment: JavaSE-1.8 +Require-Bundle: org.eclipse.jface.text, + org.eclipse.xtext.xbase.lib, + org.eclipse.xtend.lib, + org.eclipse.xtend.lib.macro, + org.eclipse.xtext.ui, + org.eclipse.etrice.core.room, + org.eclipse.etrice.core.fsm +Export-Package: org.eclipse.etrice.expressions.detailcode, + org.eclipse.etrice.expressions.ui, + org.eclipse.etrice.expressions.ui.contentassist, + org.eclipse.etrice.expressions.ui.highlight + diff --git a/plugins/org.eclipse.etrice.expressions.ui/build.properties b/plugins/org.eclipse.etrice.expressions.ui/build.properties new file mode 100644 index 000000000..b2b1eadba --- /dev/null +++ b/plugins/org.eclipse.etrice.expressions.ui/build.properties @@ -0,0 +1,2 @@ +output.. = bin/ +bin.includes = META-INF/ diff --git a/plugins/org.eclipse.etrice.expressions.ui/icons/rt_method.png b/plugins/org.eclipse.etrice.expressions.ui/icons/rt_method.png Binary files differnew file mode 100644 index 000000000..6de31cfd2 --- /dev/null +++ b/plugins/org.eclipse.etrice.expressions.ui/icons/rt_method.png diff --git a/plugins/org.eclipse.etrice.expressions.ui/icons/rt_method.svg b/plugins/org.eclipse.etrice.expressions.ui/icons/rt_method.svg new file mode 100644 index 000000000..34aaf41bc --- /dev/null +++ b/plugins/org.eclipse.etrice.expressions.ui/icons/rt_method.svg @@ -0,0 +1,132 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="16" + height="16" + id="svg2" + version="1.1" + inkscape:version="0.91 r13725" + sodipodi:docname="rt_method.svg" + inkscape:export-filename="C:\Users\Juergen\Desktop\rt_method5.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"> + <defs + id="defs4"> + <linearGradient + id="linearGradient10798-1-9-3-7-6-8-9-0-9-1"> + <stop + style="stop-color:#75ba7a;stop-opacity:1;" + offset="0" + id="stop10800-5-2-1-8-20-6-4-9-8-2" /> + <stop + id="stop10806-6-8-5-3-9-24-8-4-3-2" + offset="0.5" + style="stop-color:#418a4d;stop-opacity:1" /> + <stop + style="stop-color:#a4c589;stop-opacity:1" + offset="1" + id="stop10802-1-5-3-0-4-8-4-2-9-2" /> + </linearGradient> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="16" + inkscape:cx="10.700152" + inkscape:cy="19.117127" + inkscape:document-units="px" + inkscape:current-layer="g6438" + showgrid="true" + inkscape:window-width="1839" + inkscape:window-height="862" + inkscape:window-x="33" + inkscape:window-y="74" + inkscape:window-maximized="0" + showguides="true" + inkscape:guide-bbox="true" + inkscape:snap-global="false"> + <inkscape:grid + type="xygrid" + id="grid3949" /> + <sodipodi:guide + position="13.183594,14.550781" + orientation="0,1" + id="guide4724" /> + </sodipodi:namedview> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + style="display:inline" + transform="translate(0,-1036.3622)"> + <g + transform="matrix(0.27903303,0,0,0.27903303,-100.53208,912.07901)" + style="display:inline" + id="g11331-3-1-1"> + <g + id="g13408-8" + style="fill:#737986;fill-opacity:1;stroke:#595e68;stroke-opacity:1" /> + </g> + <g + transform="matrix(-1,0,0,1,16.12959,8.0140628)" + style="display:inline" + id="g6124-3"> + <g + transform="scale(-1,1)" + style="font-size:13.58917427px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Sans" + id="text6430" /> + <g + transform="scale(-1,1)" + style="font-size:13.58917427px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Sans" + id="g6438"> + <ellipse + style="display:inline;fill:#989e99;fill-opacity:1;stroke:#5c5c5c;stroke-width:0.97602451;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path10796-2-6-2" + cx="-9.1460485" + cy="1037.255" + rx="3.5332656" + ry="3.5995569" /> + <g + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.75px;line-height:125%;font-family:Verdana;-inkscape-font-specification:'Verdana, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="text4695"> + <path + d="m -3.1425433,1030.6666 -2.174683,8e-4 0,3.8959 -0.8032227,0 0,-4.7723 2.3925781,0 0.5853272,0.01 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.75px;line-height:125%;font-family:Verdana;-inkscape-font-specification:'Verdana, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1" + id="path4720" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccccc" /> + <path + d="m -0.10287046,1034.5829 -0.96984864,0 -1.4780273,-0.01 -0.013062,-3.9037 -0.5426025,0 0,-0.8663 0.5426025,0 0,-1.4575 0.8032227,0 0,1.4575 1.65771484,0 0,0.8663 -1.65771484,0 0.01709,3.1511 1.64062503,0.013 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.75px;line-height:125%;font-family:Verdana;-inkscape-font-specification:'Verdana, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1" + id="path4722" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccccccccccccc" /> + </g> + </g> + </g> + </g> +</svg> diff --git a/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/detailcode/DefaultDetailExpressionProvider.xtend b/plugins/org.eclipse.etrice.expressions.ui/src/org/eclipse/etrice/expressions/detailcode/DefaultDetailExpressionProvider.xtend index 8a72ed9ff..3a0437b73 100644 --- a/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/detailcode/DefaultDetailExpressionProvider.xtend +++ b/plugins/org.eclipse.etrice.expressions.ui/src/org/eclipse/etrice/expressions/detailcode/DefaultDetailExpressionProvider.xtend @@ -9,7 +9,7 @@ * Juergen Haug (initial contribution) * *******************************************************************************/ -package org.eclipse.etrice.ui.behavior.detailcode +package org.eclipse.etrice.expressions.detailcode import java.util.List import org.eclipse.etrice.core.room.Attribute @@ -18,6 +18,9 @@ import org.eclipse.etrice.core.room.InterfaceItem import org.eclipse.etrice.core.room.Port import org.eclipse.etrice.core.room.SAP import org.eclipse.etrice.core.room.SPP +import org.eclipse.etrice.expressions.detailcode.GuardDetailExpressionProvider +import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider.ExpressionFeature +import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider.ExpressionPostfix import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor /** diff --git a/plugins/org.eclipse.etrice.expressions.ui/src/org/eclipse/etrice/expressions/detailcode/DetailExpressionAssistParser.xtend b/plugins/org.eclipse.etrice.expressions.ui/src/org/eclipse/etrice/expressions/detailcode/DetailExpressionAssistParser.xtend new file mode 100644 index 000000000..b5cd66ead --- /dev/null +++ b/plugins/org.eclipse.etrice.expressions.ui/src/org/eclipse/etrice/expressions/detailcode/DetailExpressionAssistParser.xtend @@ -0,0 +1,161 @@ +/******************************************************************************* + * Copyright (c) 2015 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.expressions.detailcode + +import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider +import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider.ExpressionFeature +import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider.ExpressionPostfix +import org.eclipse.jface.text.BadLocationException +import org.eclipse.jface.text.IDocument +import org.eclipse.jface.text.rules.IWordDetector +import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor +import org.eclipse.xtext.util.Strings + +@FinalFieldsConstructor +class DetailExpressionAssistParser { + + val IDocument document + val int invocationOffset + val IDetailExpressionProvider provider + + val IWordDetector anyIdScanner = new IWordDetector() { + + override isWordPart(char c) { + Character.isJavaIdentifierPart(c) + } + + override isWordStart(char c) { + Character.isJavaIdentifierStart(c) + } + + } + + def String computeIdentifierPrefix(int offset) throws BadLocationException { + var start = offset - 1 + while (start >= 0 && anyIdScanner.isWordPart(document.getChar(start))) + start-- + + start++ + return document.get(start, offset - start) + } + + def ExpressionFeature computeExpressionFeature(int offset) throws BadLocationException{ + var ExpressionPostfix postfixResult + var char openingChar + var char closingChar + switch document.getChar(offset-1).toString { + case ')': { + postfixResult = ExpressionPostfix.PARENTHESES + openingChar = '(' + closingChar = ')' + } + case ']': { + postfixResult = ExpressionPostfix.BRACKETS + openingChar = '[' + closingChar = ']' + } + default: + postfixResult = ExpressionPostfix.NONE + } + + var start = offset + if (postfixResult != ExpressionPostfix.NONE) { + start-- + var counter = 1 + while (start > 0 && counter > 0) { + start-- + switch document.getChar(start) { + case openingChar: counter-- + case closingChar: counter++ + } + } + if (counter > 0) + postfixResult = null + } + + var String idResult + try { + idResult = computeIdentifierPrefix(start) + } catch (BadLocationException e) { + } + + return new ExpressionFeature(idResult, postfixResult) + } + + /** + * Try to resolve latest complete ExpressionFeature, e.g.: + * <ul> + * <li>port0.m_ => port0</li> + * <li> port0. => port0 </li> + * <li>port0 => null</li> + * </ul> + */ + def ExpressionFeature resolveLatestCompleted() { + var lastSeparatorPos = invocationOffset - 1 + + // skip invocationPrefix + try { + val invocationPrefix = computeIdentifierPrefix(invocationOffset) + lastSeparatorPos -= invocationPrefix.length + } catch (BadLocationException e) { + } + + // backward parsing + val parsedFeatures = newLinkedList + try { + while (document.getChar(lastSeparatorPos) == IDetailExpressionProvider.SEPARATOR) { + val parseResult = computeExpressionFeature(lastSeparatorPos) + if (!parseResult.isValid) + return null + parsedFeatures.push(parseResult) + lastSeparatorPos -= (parseResult.id.length() + 1) + + } + } catch (BadLocationException e) { + } + + if (parsedFeatures.empty) + return null + + // forward matching + val firstParseResult = parsedFeatures.pop + var lastMatch = provider.initialFeatures.findFirst[matches(firstParseResult)] + while (lastMatch != null && !parsedFeatures.isEmpty()) { + val nextParseResult = parsedFeatures.pop + lastMatch = provider.getContextFeatures(lastMatch).findFirst[matches(nextParseResult)] + } + + return lastMatch + } + + def boolean isContextExpression() { + try { + document.getChar(invocationOffset - 1) == IDetailExpressionProvider.SEPARATOR || anyIdScanner.isWordPart(document.getChar(invocationOffset - 1)) + } + catch (BadLocationException e) { + false + } + } + + /** + * non-empty id + not-null suffix + */ + private def boolean isValid(ExpressionFeature feature) { + !Strings.isEmpty(feature.id) && feature.postfix != null + } + + private def boolean matches(ExpressionFeature f1, ExpressionFeature f2) { + f1.id == f2.id && f1.postfix == f2.postfix + } + +} diff --git a/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/detailcode/GuardDetailExpressionProvider.xtend b/plugins/org.eclipse.etrice.expressions.ui/src/org/eclipse/etrice/expressions/detailcode/GuardDetailExpressionProvider.xtend index f37993328..b8654aae4 100644 --- a/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/detailcode/GuardDetailExpressionProvider.xtend +++ b/plugins/org.eclipse.etrice.expressions.ui/src/org/eclipse/etrice/expressions/detailcode/GuardDetailExpressionProvider.xtend @@ -9,7 +9,7 @@ * Juergen Haug (initial contribution) * *******************************************************************************/ -package org.eclipse.etrice.ui.behavior.detailcode +package org.eclipse.etrice.expressions.detailcode import com.google.common.base.Function import com.google.common.base.Strings @@ -20,20 +20,18 @@ import org.eclipse.etrice.core.room.ActorClass import org.eclipse.etrice.core.room.Attribute import org.eclipse.etrice.core.room.DataClass import org.eclipse.etrice.core.room.InterfaceItem +import org.eclipse.etrice.core.room.Message +import org.eclipse.etrice.core.room.Operation import org.eclipse.etrice.core.room.Port +import org.eclipse.etrice.core.room.SAP import org.eclipse.etrice.core.room.VarDecl import org.eclipse.etrice.core.room.util.RoomHelpers -import org.eclipse.etrice.ui.behavior.fsm.detailcode.IDetailExpressionProvider -import org.eclipse.etrice.ui.behavior.support.SupportUtil import org.eclipse.xtend.lib.annotations.AccessorType import org.eclipse.xtend.lib.annotations.Accessors +import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor import org.eclipse.xtext.util.SimpleAttributeResolver import static extension org.eclipse.xtend.lib.annotations.AccessorType.* -import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor -import org.eclipse.etrice.core.room.SAP -import org.eclipse.etrice.core.room.Operation -import org.eclipse.etrice.core.room.Message /** * Defines expression for fsm guards of an ActorClass @@ -47,8 +45,8 @@ class GuardDetailExpressionProvider implements IDetailExpressionProvider { // ctor protected val ActorClass actorClass - protected val extension RoomHelpers roomHelpers = SupportUtil.getInstance.roomHelpers - protected val Function<EObject, String> nameProvider = SimpleAttributeResolver.NAME_RESOLVER + protected val extension RoomHelpers roomHelpers = new RoomHelpers + protected val nameProvider = SimpleAttributeResolver.NAME_RESOLVER // optional @Accessors(AccessorType.PUBLIC_SETTER) protected VarDecl transitionEventData @@ -57,12 +55,12 @@ class GuardDetailExpressionProvider implements IDetailExpressionProvider { val List<ExpressionFeature> scope = newArrayList if(transitionEventData != null) { - scope += transitionEventData.createExprFeature(ExpressionPostfix.NONE) + scope += transitionEventData.createExprFeature(IDetailExpressionProvider.ExpressionPostfix.NONE) } scope += actorClass.allInterfaceItems.filter[isEventDriven || !isConjugated].map[ switch it { - Port case isReplicated: createExprFeature(ExpressionPostfix.BRACKETS) - default: createExprFeature(ExpressionPostfix.NONE) + Port case isReplicated: createExprFeature(IDetailExpressionProvider.ExpressionPostfix.BRACKETS) + default: createExprFeature(IDetailExpressionProvider.ExpressionPostfix.NONE) }] scope += actorClass.latestOperations.map[createExprFeature] scope += actorClass.allAttributes.map[createExprFeature] @@ -101,19 +99,19 @@ class GuardDetailExpressionProvider implements IDetailExpressionProvider { def ExpressionFeature createExprFeature(Operation it){ // assuming all operations have parenthesis - createExprFeature(ExpressionPostfix.PARENTHESES) + createExprFeature(IDetailExpressionProvider.ExpressionPostfix.PARENTHESES) } def ExpressionFeature createExprFeature(Message it){ // assuming all message have parenthesis - createExprFeature(ExpressionPostfix.PARENTHESES) + createExprFeature(IDetailExpressionProvider.ExpressionPostfix.PARENTHESES) } def ExpressionFeature createExprFeature(Attribute it){ // assuming all attributes have brackets or not depending on size switch (size) { - case size > 1: createExprFeature(ExpressionPostfix.BRACKETS) - default: createExprFeature(ExpressionPostfix.NONE) + case size > 1: createExprFeature(IDetailExpressionProvider.ExpressionPostfix.BRACKETS) + default: createExprFeature(IDetailExpressionProvider.ExpressionPostfix.NONE) } } diff --git a/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/detailcode/IDetailExpressionProvider.xtend b/plugins/org.eclipse.etrice.expressions.ui/src/org/eclipse/etrice/expressions/detailcode/IDetailExpressionProvider.xtend index 9db27e1db..edefd48b2 100644 --- a/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/detailcode/IDetailExpressionProvider.xtend +++ b/plugins/org.eclipse.etrice.expressions.ui/src/org/eclipse/etrice/expressions/detailcode/IDetailExpressionProvider.xtend @@ -10,8 +10,9 @@ * *******************************************************************************/ -package org.eclipse.etrice.ui.behavior.fsm.detailcode +package org.eclipse.etrice.expressions.detailcode +import com.google.common.collect.ImmutableList import java.util.List import org.eclipse.xtend.lib.annotations.Accessors @@ -50,4 +51,17 @@ interface IDetailExpressionProvider { PARENTHESES, BRACKETS } + + static class EmptyDetailExpressionProvider implements IDetailExpressionProvider { + + val List<ExpressionFeature> EMPTY_LIST = ImmutableList.of + + override List<ExpressionFeature> getInitialFeatures() { + return EMPTY_LIST; + } + + override List<ExpressionFeature> getContextFeatures(ExpressionFeature ctx) { + return EMPTY_LIST; + } + } } diff --git a/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/detailcode/RuntimeDetailExpressionProvider.xtend b/plugins/org.eclipse.etrice.expressions.ui/src/org/eclipse/etrice/expressions/detailcode/RuntimeDetailExpressionProvider.xtend index 3101c2281..e4818c74d 100644 --- a/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/detailcode/RuntimeDetailExpressionProvider.xtend +++ b/plugins/org.eclipse.etrice.expressions.ui/src/org/eclipse/etrice/expressions/detailcode/RuntimeDetailExpressionProvider.xtend @@ -1,4 +1,4 @@ -package org.eclipse.etrice.ui.behavior.detailcode +package org.eclipse.etrice.expressions.detailcode import org.eclipse.emf.ecore.EObject import org.eclipse.etrice.core.room.InterfaceItem diff --git a/plugins/org.eclipse.etrice.expressions.ui/src/org/eclipse/etrice/expressions/ui/DetailExpressionUIProvider.xtend b/plugins/org.eclipse.etrice.expressions.ui/src/org/eclipse/etrice/expressions/ui/DetailExpressionUIProvider.xtend new file mode 100644 index 000000000..315001206 --- /dev/null +++ b/plugins/org.eclipse.etrice.expressions.ui/src/org/eclipse/etrice/expressions/ui/DetailExpressionUIProvider.xtend @@ -0,0 +1,180 @@ +/******************************************************************************* + * Copyright (c) 2015 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.expressions.ui + +import com.google.common.base.Strings +import com.google.inject.Inject +import org.eclipse.core.runtime.Assert +import org.eclipse.emf.ecore.EObject +import org.eclipse.etrice.core.room.Attribute +import org.eclipse.etrice.core.room.InterfaceItem +import org.eclipse.etrice.core.room.Message +import org.eclipse.etrice.core.room.Operation +import org.eclipse.etrice.core.room.Port +import org.eclipse.etrice.core.room.SPP +import org.eclipse.etrice.core.room.VarDecl +import org.eclipse.etrice.core.room.util.RoomHelpers +import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider.ExpressionFeature +import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider.ExpressionPostfix +import org.eclipse.etrice.expressions.detailcode.RuntimeDetailExpressionProvider +import org.eclipse.etrice.expressions.detailcode.RuntimeDetailExpressionProvider.RuntimeMethodExpressionData +import org.eclipse.jface.viewers.ILabelProvider +import org.eclipse.swt.graphics.Image +import org.eclipse.swt.graphics.Point +import com.google.inject.Singleton +import org.eclipse.swt.graphics.RGB + +@Singleton +class DetailExpressionUIProvider{ + + static val String IMAGE_RT_METHOD = "icons/rt_method.png" + + @Inject + protected ILabelProvider labelProvider + + @Inject + protected RoomHelpers roomHelpers + + /** + * Return postfix string and its selection (relative start, length) + */ + def Pair<String, Point> getPostfixReplacement(ExpressionFeature feature) { + feature.assertNotNull + + var String[] brackets = switch feature.postfix { + case PARENTHESES: #['(', ')'] + case BRACKETS: #['[', ']'] + default: return "" -> null + } + var String replacement = switch data : feature.data { + Operation: + data.arguments.map[name].join(', ') + Message case data.data != null: + data.data.name + Attribute, // fall through + InterfaceItem: + '0' + default: + '' + } + + val selection = if(!replacement.empty) new Point(1, replacement.length) + brackets.head + replacement + brackets.last -> selection + } + + /** + * Return completion string and its selection (relative start, length) + */ + def Pair<String, Point> getCompletion(ExpressionFeature feature) { + feature.assertNotNull + + var postfix = getPostfixReplacement(feature) + var point = postfix.value + if (point != null) + point.x += feature.id.length + + return feature.id + postfix.key -> point + } + + def String getID(ExpressionFeature feature) { + feature.assertNotNull + + return switch feature.data { + InterfaceItem: + HighlightConstants.INTERFACE_ITEM + Attribute: + HighlightConstants.ATTRIBUTE + Operation: + HighlightConstants.OPERATION + EObject: + HighlightConstants.SPECIAL_FEATURE // unknown model object == special + RuntimeMethodExpressionData: + HighlightConstants.OPERATION + } + } + + /** + * Text format: + * {@code completionInfo : typedInfo - classInfo} + */ + def String getDisplayString(ExpressionFeature feature) { + feature.assertNotNull + + val data = feature.data + + var completionInfo = feature.id + feature.getPostfixReplacement.key + var typedInfo = "" + var classInfo = if(data instanceof EObject) data.eClass.name else "" + switch data { + Attribute: + typedInfo = data.type.type.name + InterfaceItem: + typedInfo = roomHelpers.getProtocol(data).name + RuntimeMethodExpressionData case feature.id == RuntimeDetailExpressionProvider.RT_METHOD_GET_REPLICATION: + typedInfo = 'int' + VarDecl: { + typedInfo = data.refType.type.name + classInfo = "" + } + default: { + val label = labelProvider.getText(data) + + // if label starts with completion then label might be better + if(!Strings.commonPrefix(label, completionInfo).empty) completionInfo = label + } + } + + // mark port as broadcast + if (feature.postfix == ExpressionPostfix.NONE) { + switch data { + SPP case data.isEventDriven/* fall through */, + Port case data.isReplicated && data.isEventDriven: + completionInfo = completionInfo + " (broadcast)" + } + } + + if(!typedInfo.empty) typedInfo = " : " + typedInfo + if(!classInfo.empty) classInfo = " - " + classInfo + + return completionInfo + typedInfo + classInfo + } + + def Image getImage(ExpressionFeature feature) { + feature.assertNotNull + + switch feature.data { + EObject: labelProvider.getImage(feature.data) +// RuntimeMethodExpressionData: Activator.getImage(IMAGE_RT_METHOD) + } + } + +// /** +// * Filter by prefix +// */ +// def getContextFeaturesWithPrefix(ExpressionFeature ctx, String prefix) { +// delegate.getContextFeatures(ctx).filter[id.startsWith(prefix)] +// } +// +// /** +// * Filter by prefix +// */ +// def getInitialFeaturesWithPrefix(String prefix) { +// delegate.initialFeatures.filter[id.startsWith(prefix)] +// } + + def protected assertNotNull(ExpressionFeature feature) { + Assert.isTrue(!Strings.isNullOrEmpty(feature.id)) + Assert.isNotNull(feature.postfix) + Assert.isNotNull(feature.data) + } + +} diff --git a/plugins/org.eclipse.etrice.expressions.ui/src/org/eclipse/etrice/expressions/ui/HighlightConstants.xtend b/plugins/org.eclipse.etrice.expressions.ui/src/org/eclipse/etrice/expressions/ui/HighlightConstants.xtend new file mode 100644 index 000000000..8c34d4393 --- /dev/null +++ b/plugins/org.eclipse.etrice.expressions.ui/src/org/eclipse/etrice/expressions/ui/HighlightConstants.xtend @@ -0,0 +1,29 @@ +/******************************************************************************* + * 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@protos.de (initial contribution) + * + *******************************************************************************/ + +package org.eclipse.etrice.expressions.ui + +import org.eclipse.swt.graphics.RGB + +class HighlightConstants { + + public static val String INTERFACE_ITEM = 'room_InterfaceItem' + public static val String ATTRIBUTE = 'room_Attribute' + public static val String OPERATION = 'room_Operation' + public static val String SPECIAL_FEATURE = 'room_EObject' + + // Standard coloring eclipse + public static final RGB COLOR_TARGET_KEYWORD = new RGB(127, 0, 85); + public static final RGB COLLOR_COMMENT = new RGB(63, 127, 95); + public static final RGB COLOR_STRING = new RGB(42, 0, 255); + public static final RGB COLOR_NUMBER = new RGB(125, 125, 125); // new RGB(0, 0, 0); +} diff --git a/plugins/org.eclipse.etrice.expressions.ui/src/org/eclipse/etrice/expressions/ui/contentassist/RoomExpressionProposals.xtend b/plugins/org.eclipse.etrice.expressions.ui/src/org/eclipse/etrice/expressions/ui/contentassist/RoomExpressionProposals.xtend new file mode 100644 index 000000000..06aa448a2 --- /dev/null +++ b/plugins/org.eclipse.etrice.expressions.ui/src/org/eclipse/etrice/expressions/ui/contentassist/RoomExpressionProposals.xtend @@ -0,0 +1,88 @@ +/******************************************************************************* + * 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.expressions.ui.contentassist + +import com.google.inject.Inject +import java.util.List +import org.eclipse.emf.ecore.EObject +import org.eclipse.etrice.core.room.ActorClass +import org.eclipse.etrice.expressions.detailcode.DefaultDetailExpressionProvider +import org.eclipse.etrice.expressions.detailcode.DetailExpressionAssistParser +import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider.ExpressionFeature +import org.eclipse.etrice.expressions.ui.DetailExpressionUIProvider +import org.eclipse.jface.text.Document +import org.eclipse.jface.text.contentassist.ICompletionProposal +import org.eclipse.jface.viewers.StyledString +import org.eclipse.swt.graphics.Image +import org.eclipse.xtext.ui.editor.contentassist.ConfigurableCompletionProposal +import org.eclipse.xtext.ui.editor.contentassist.PrefixMatcher +import org.eclipse.xtext.util.Strings +import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider + +class RoomExpressionProposals { + + @Inject + DetailExpressionUIProvider uiExpressionProvider + + @Inject + PrefixMatcher prefixMatcher + + def List<ICompletionProposal> createProposals(IDetailExpressionProvider exprProvider, String text, int offset, int globalOffset) { + val parser = new DetailExpressionAssistParser(new Document(text), offset, exprProvider) + val availableFeatures = newArrayList => [ + if(parser.isContextExpression) { + val contextFeature = parser?.resolveLatestCompleted + it += if(contextFeature !== null) exprProvider.getContextFeatures(contextFeature) else exprProvider.initialFeatures + } else { + it += exprProvider.initialFeatures + } + ] + + val prefix = parser.computeIdentifierPrefix(offset) + availableFeatures.filter[id.startsWith(prefix)].map[ feature | + val displayString = new StyledString(uiExpressionProvider.getDisplayString(feature)) + val image = uiExpressionProvider.getImage(feature) + val prop = doCreateProposal(feature.id, displayString, image, prefix, globalOffset) => [ + processPostfix(feature) + ] + + return prop as ICompletionProposal + ].toList + } + + def protected ConfigurableCompletionProposal doCreateProposal(String proposal, StyledString displayString, Image image, String prefix, int globalOffset) { + new ConfigurableCompletionProposal(proposal, globalOffset - prefix.length, prefix.length, proposal.length, image, displayString, null, null) => [ + matcher = prefixMatcher + autoInsertable = false + // TODO adjust length to existing text + replaceContextLength = proposal.length + ] + } + + def protected processPostfix(ConfigurableCompletionProposal proposal, ExpressionFeature feature){ + proposal => [ + val postfix = uiExpressionProvider.getPostfixReplacement(feature) + if(!Strings.isEmpty(postfix.key)) { + if(postfix.value != null) { + selectionStart = replacementOffset + replacementString.length + postfix.value.x + cursorPosition = cursorPosition + postfix.value.x + selectionLength = postfix.value.y + } else { + cursorPosition = cursorPosition + postfix.key.length + } + replacementString = replacementString + postfix.key + } + ] + } + +}
\ No newline at end of file diff --git a/plugins/org.eclipse.etrice.expressions.ui/src/org/eclipse/etrice/expressions/ui/highlight/RoomExpressionHighlighter.xtend b/plugins/org.eclipse.etrice.expressions.ui/src/org/eclipse/etrice/expressions/ui/highlight/RoomExpressionHighlighter.xtend new file mode 100644 index 000000000..354e5b533 --- /dev/null +++ b/plugins/org.eclipse.etrice.expressions.ui/src/org/eclipse/etrice/expressions/ui/highlight/RoomExpressionHighlighter.xtend @@ -0,0 +1,41 @@ +/******************************************************************************* + * 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.expressions.ui.highlight + +import com.google.inject.Inject +import java.util.List +import org.eclipse.etrice.expressions.ui.DetailExpressionUIProvider +import org.eclipse.xtend.lib.annotations.Accessors + +class RoomExpressionHighlighter { + + @Accessors + static class HighlightResult { + val int offset + val int length + val String id + } + + @Inject + DetailExpressionUIProvider expressionProvider + + def List<HighlightResult> getHighlighting(String text, int offset) { + val result = newArrayList + + + + + + result + } +} diff --git a/plugins/org.eclipse.etrice.ui.behavior/xtend-gen/org/eclipse/etrice/ui/behavior/detailcode/DefaultDetailExpressionProvider.java b/plugins/org.eclipse.etrice.expressions.ui/xtend-gen/org/eclipse/etrice/expressions/detailcode/DefaultDetailExpressionProvider.java index eed350739..9d4ce8916 100644 --- a/plugins/org.eclipse.etrice.ui.behavior/xtend-gen/org/eclipse/etrice/ui/behavior/detailcode/DefaultDetailExpressionProvider.java +++ b/plugins/org.eclipse.etrice.expressions.ui/xtend-gen/org/eclipse/etrice/expressions/detailcode/DefaultDetailExpressionProvider.java @@ -8,7 +8,7 @@ * CONTRIBUTORS: * Juergen Haug (initial contribution) */ -package org.eclipse.etrice.ui.behavior.detailcode; +package org.eclipse.etrice.expressions.detailcode; import com.google.common.base.Objects; import com.google.common.collect.Iterables; @@ -28,8 +28,8 @@ import org.eclipse.etrice.core.room.RefableType; import org.eclipse.etrice.core.room.SAP; import org.eclipse.etrice.core.room.SPP; import org.eclipse.etrice.core.room.StandardOperation; -import org.eclipse.etrice.ui.behavior.detailcode.GuardDetailExpressionProvider; -import org.eclipse.etrice.ui.behavior.fsm.detailcode.IDetailExpressionProvider; +import org.eclipse.etrice.expressions.detailcode.GuardDetailExpressionProvider; +import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider; import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor; import org.eclipse.xtext.xbase.lib.CollectionLiterals; import org.eclipse.xtext.xbase.lib.Functions.Function1; diff --git a/plugins/org.eclipse.etrice.expressions.ui/xtend-gen/org/eclipse/etrice/expressions/detailcode/DetailExpressionAssistParser.java b/plugins/org.eclipse.etrice.expressions.ui/xtend-gen/org/eclipse/etrice/expressions/detailcode/DetailExpressionAssistParser.java new file mode 100644 index 000000000..7212a636d --- /dev/null +++ b/plugins/org.eclipse.etrice.expressions.ui/xtend-gen/org/eclipse/etrice/expressions/detailcode/DetailExpressionAssistParser.java @@ -0,0 +1,221 @@ +/** + * Copyright (c) 2015 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.expressions.detailcode; + +import com.google.common.base.Objects; +import java.util.LinkedList; +import java.util.List; +import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider; +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.rules.IWordDetector; +import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor; +import org.eclipse.xtext.util.Strings; +import org.eclipse.xtext.xbase.lib.CollectionLiterals; +import org.eclipse.xtext.xbase.lib.Exceptions; +import org.eclipse.xtext.xbase.lib.Functions.Function1; +import org.eclipse.xtext.xbase.lib.IterableExtensions; + +@FinalFieldsConstructor +@SuppressWarnings("all") +public class DetailExpressionAssistParser { + private final IDocument document; + + private final int invocationOffset; + + private final IDetailExpressionProvider provider; + + private final IWordDetector anyIdScanner = new IWordDetector() { + @Override + public boolean isWordPart(final char c) { + return Character.isJavaIdentifierPart(c); + } + + @Override + public boolean isWordStart(final char c) { + return Character.isJavaIdentifierStart(c); + } + }; + + public String computeIdentifierPrefix(final int offset) throws BadLocationException { + int start = (offset - 1); + while (((start >= 0) && this.anyIdScanner.isWordPart(this.document.getChar(start)))) { + start--; + } + start++; + return this.document.get(start, (offset - start)); + } + + public IDetailExpressionProvider.ExpressionFeature computeExpressionFeature(final int offset) throws BadLocationException { + IDetailExpressionProvider.ExpressionPostfix postfixResult = null; + char openingChar = 0; + char closingChar = 0; + char _char = this.document.getChar((offset - 1)); + String _string = Character.valueOf(_char).toString(); + switch (_string) { + case ")": + postfixResult = IDetailExpressionProvider.ExpressionPostfix.PARENTHESES; + openingChar = '('; + closingChar = ')'; + break; + case "]": + postfixResult = IDetailExpressionProvider.ExpressionPostfix.BRACKETS; + openingChar = '['; + closingChar = ']'; + break; + default: + postfixResult = IDetailExpressionProvider.ExpressionPostfix.NONE; + break; + } + int start = offset; + boolean _notEquals = (!Objects.equal(postfixResult, IDetailExpressionProvider.ExpressionPostfix.NONE)); + if (_notEquals) { + start--; + int counter = 1; + while (((start > 0) && (counter > 0))) { + { + start--; + char _char_1 = this.document.getChar(start); + boolean _matched = false; + if (Objects.equal(_char_1, openingChar)) { + _matched=true; + counter--; + } + if (!_matched) { + if (Objects.equal(_char_1, closingChar)) { + _matched=true; + counter++; + } + } + } + } + if ((counter > 0)) { + postfixResult = null; + } + } + String idResult = null; + try { + String _computeIdentifierPrefix = this.computeIdentifierPrefix(start); + idResult = _computeIdentifierPrefix; + } catch (final Throwable _t) { + if (_t instanceof BadLocationException) { + final BadLocationException e = (BadLocationException)_t; + } else { + throw Exceptions.sneakyThrow(_t); + } + } + return new IDetailExpressionProvider.ExpressionFeature(idResult, postfixResult); + } + + /** + * Try to resolve latest complete ExpressionFeature, e.g.: + * <ul> + * <li>port0.m_ => port0</li> + * <li> port0. => port0 </li> + * <li>port0 => null</li> + * </ul> + */ + public IDetailExpressionProvider.ExpressionFeature resolveLatestCompleted() { + int lastSeparatorPos = (this.invocationOffset - 1); + try { + final String invocationPrefix = this.computeIdentifierPrefix(this.invocationOffset); + int _lastSeparatorPos = lastSeparatorPos; + int _length = invocationPrefix.length(); + lastSeparatorPos = (_lastSeparatorPos - _length); + } catch (final Throwable _t) { + if (_t instanceof BadLocationException) { + final BadLocationException e = (BadLocationException)_t; + } else { + throw Exceptions.sneakyThrow(_t); + } + } + final LinkedList<IDetailExpressionProvider.ExpressionFeature> parsedFeatures = CollectionLiterals.<IDetailExpressionProvider.ExpressionFeature>newLinkedList(); + try { + while ((this.document.getChar(lastSeparatorPos) == IDetailExpressionProvider.SEPARATOR)) { + { + final IDetailExpressionProvider.ExpressionFeature parseResult = this.computeExpressionFeature(lastSeparatorPos); + boolean _isValid = this.isValid(parseResult); + boolean _not = (!_isValid); + if (_not) { + return null; + } + parsedFeatures.push(parseResult); + int _lastSeparatorPos_1 = lastSeparatorPos; + String _id = parseResult.getId(); + int _length_1 = _id.length(); + int _plus = (_length_1 + 1); + lastSeparatorPos = (_lastSeparatorPos_1 - _plus); + } + } + } catch (final Throwable _t_1) { + if (_t_1 instanceof BadLocationException) { + final BadLocationException e_1 = (BadLocationException)_t_1; + } else { + throw Exceptions.sneakyThrow(_t_1); + } + } + boolean _isEmpty = parsedFeatures.isEmpty(); + if (_isEmpty) { + return null; + } + final IDetailExpressionProvider.ExpressionFeature firstParseResult = parsedFeatures.pop(); + List<IDetailExpressionProvider.ExpressionFeature> _initialFeatures = this.provider.getInitialFeatures(); + final Function1<IDetailExpressionProvider.ExpressionFeature, Boolean> _function = (IDetailExpressionProvider.ExpressionFeature it) -> { + return Boolean.valueOf(this.matches(it, firstParseResult)); + }; + IDetailExpressionProvider.ExpressionFeature lastMatch = IterableExtensions.<IDetailExpressionProvider.ExpressionFeature>findFirst(_initialFeatures, _function); + while (((!Objects.equal(lastMatch, null)) && (!parsedFeatures.isEmpty()))) { + { + final IDetailExpressionProvider.ExpressionFeature nextParseResult = parsedFeatures.pop(); + List<IDetailExpressionProvider.ExpressionFeature> _contextFeatures = this.provider.getContextFeatures(lastMatch); + final Function1<IDetailExpressionProvider.ExpressionFeature, Boolean> _function_1 = (IDetailExpressionProvider.ExpressionFeature it) -> { + return Boolean.valueOf(this.matches(it, nextParseResult)); + }; + IDetailExpressionProvider.ExpressionFeature _findFirst = IterableExtensions.<IDetailExpressionProvider.ExpressionFeature>findFirst(_contextFeatures, _function_1); + lastMatch = _findFirst; + } + } + return lastMatch; + } + + public boolean isContextExpression() { + boolean _xtrycatchfinallyexpression = false; + try { + _xtrycatchfinallyexpression = ((this.document.getChar((this.invocationOffset - 1)) == IDetailExpressionProvider.SEPARATOR) || this.anyIdScanner.isWordPart(this.document.getChar((this.invocationOffset - 1)))); + } catch (final Throwable _t) { + if (_t instanceof BadLocationException) { + final BadLocationException e = (BadLocationException)_t; + _xtrycatchfinallyexpression = false; + } else { + throw Exceptions.sneakyThrow(_t); + } + } + return _xtrycatchfinallyexpression; + } + + /** + * non-empty id + not-null suffix + */ + private boolean isValid(final IDetailExpressionProvider.ExpressionFeature feature) { + return ((!Strings.isEmpty(feature.getId())) && (!Objects.equal(feature.getPostfix(), null))); + } + + private boolean matches(final IDetailExpressionProvider.ExpressionFeature f1, final IDetailExpressionProvider.ExpressionFeature f2) { + return (Objects.equal(f1.getId(), f2.getId()) && Objects.equal(f1.getPostfix(), f2.getPostfix())); + } + + public DetailExpressionAssistParser(final IDocument document, final int invocationOffset, final IDetailExpressionProvider provider) { + super(); + this.document = document; + this.invocationOffset = invocationOffset; + this.provider = provider; + } +} diff --git a/plugins/org.eclipse.etrice.ui.behavior/xtend-gen/org/eclipse/etrice/ui/behavior/detailcode/GuardDetailExpressionProvider.java b/plugins/org.eclipse.etrice.expressions.ui/xtend-gen/org/eclipse/etrice/expressions/detailcode/GuardDetailExpressionProvider.java index 946c33a9b..e234e3774 100644 --- a/plugins/org.eclipse.etrice.ui.behavior/xtend-gen/org/eclipse/etrice/ui/behavior/detailcode/GuardDetailExpressionProvider.java +++ b/plugins/org.eclipse.etrice.expressions.ui/xtend-gen/org/eclipse/etrice/expressions/detailcode/GuardDetailExpressionProvider.java @@ -8,9 +8,8 @@ * CONTRIBUTORS: * Juergen Haug (initial contribution) */ -package org.eclipse.etrice.ui.behavior.detailcode; +package org.eclipse.etrice.expressions.detailcode; -import com.google.common.base.Function; import com.google.common.base.Objects; import com.google.common.base.Strings; import com.google.common.collect.Iterables; @@ -33,8 +32,7 @@ import org.eclipse.etrice.core.room.SAP; import org.eclipse.etrice.core.room.StandardOperation; import org.eclipse.etrice.core.room.VarDecl; import org.eclipse.etrice.core.room.util.RoomHelpers; -import org.eclipse.etrice.ui.behavior.fsm.detailcode.IDetailExpressionProvider; -import org.eclipse.etrice.ui.behavior.support.SupportUtil; +import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider; import org.eclipse.xtend.lib.annotations.AccessorType; import org.eclipse.xtend.lib.annotations.Accessors; import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor; @@ -58,9 +56,9 @@ public class GuardDetailExpressionProvider implements IDetailExpressionProvider protected final ActorClass actorClass; @Extension - protected final RoomHelpers roomHelpers = SupportUtil.getInstance().getRoomHelpers(); + protected final RoomHelpers roomHelpers = new RoomHelpers(); - protected final Function<EObject, String> nameProvider = SimpleAttributeResolver.NAME_RESOLVER; + protected final SimpleAttributeResolver<EObject, String> nameProvider = SimpleAttributeResolver.NAME_RESOLVER; @Accessors(AccessorType.PUBLIC_SETTER) protected VarDecl transitionEventData; diff --git a/plugins/org.eclipse.etrice.ui.behavior.fsm/xtend-gen/org/eclipse/etrice/ui/behavior/fsm/detailcode/IDetailExpressionProvider.java b/plugins/org.eclipse.etrice.expressions.ui/xtend-gen/org/eclipse/etrice/expressions/detailcode/IDetailExpressionProvider.java index a9ef19f2b..4d2bed2db 100644 --- a/plugins/org.eclipse.etrice.ui.behavior.fsm/xtend-gen/org/eclipse/etrice/ui/behavior/fsm/detailcode/IDetailExpressionProvider.java +++ b/plugins/org.eclipse.etrice.expressions.ui/xtend-gen/org/eclipse/etrice/expressions/detailcode/IDetailExpressionProvider.java @@ -8,8 +8,9 @@ * CONTRIBUTORS: * Juergen Haug (initial contribution) */ -package org.eclipse.etrice.ui.behavior.fsm.detailcode; +package org.eclipse.etrice.expressions.detailcode; +import com.google.common.collect.ImmutableList; import java.util.List; import org.eclipse.xtend.lib.annotations.Accessors; import org.eclipse.xtext.xbase.lib.Pure; @@ -64,6 +65,20 @@ public interface IDetailExpressionProvider { BRACKETS; } + public static class EmptyDetailExpressionProvider implements IDetailExpressionProvider { + private final List<IDetailExpressionProvider.ExpressionFeature> EMPTY_LIST = ImmutableList.<IDetailExpressionProvider.ExpressionFeature>of(); + + @Override + public List<IDetailExpressionProvider.ExpressionFeature> getInitialFeatures() { + return this.EMPTY_LIST; + } + + @Override + public List<IDetailExpressionProvider.ExpressionFeature> getContextFeatures(final IDetailExpressionProvider.ExpressionFeature ctx) { + return this.EMPTY_LIST; + } + } + public final static char SEPARATOR = '.'; /** diff --git a/plugins/org.eclipse.etrice.ui.behavior/xtend-gen/org/eclipse/etrice/ui/behavior/detailcode/RuntimeDetailExpressionProvider.java b/plugins/org.eclipse.etrice.expressions.ui/xtend-gen/org/eclipse/etrice/expressions/detailcode/RuntimeDetailExpressionProvider.java index 4a9db9e51..8ebc12f91 100644 --- a/plugins/org.eclipse.etrice.ui.behavior/xtend-gen/org/eclipse/etrice/ui/behavior/detailcode/RuntimeDetailExpressionProvider.java +++ b/plugins/org.eclipse.etrice.expressions.ui/xtend-gen/org/eclipse/etrice/expressions/detailcode/RuntimeDetailExpressionProvider.java @@ -1,4 +1,4 @@ -package org.eclipse.etrice.ui.behavior.detailcode; +package org.eclipse.etrice.expressions.detailcode; import com.google.common.base.Objects; import java.util.List; @@ -7,8 +7,8 @@ import org.eclipse.etrice.core.room.ActorClass; import org.eclipse.etrice.core.room.InterfaceItem; import org.eclipse.etrice.core.room.Port; import org.eclipse.etrice.core.room.SPP; -import org.eclipse.etrice.ui.behavior.detailcode.DefaultDetailExpressionProvider; -import org.eclipse.etrice.ui.behavior.fsm.detailcode.IDetailExpressionProvider; +import org.eclipse.etrice.expressions.detailcode.DefaultDetailExpressionProvider; +import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider; import org.eclipse.xtend.lib.annotations.Accessors; import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor; diff --git a/plugins/org.eclipse.etrice.expressions.ui/xtend-gen/org/eclipse/etrice/expressions/ui/DetailExpressionUIProvider.java b/plugins/org.eclipse.etrice.expressions.ui/xtend-gen/org/eclipse/etrice/expressions/ui/DetailExpressionUIProvider.java new file mode 100644 index 000000000..9b2c17f78 --- /dev/null +++ b/plugins/org.eclipse.etrice.expressions.ui/xtend-gen/org/eclipse/etrice/expressions/ui/DetailExpressionUIProvider.java @@ -0,0 +1,324 @@ +/** + * Copyright (c) 2015 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.expressions.ui; + +import com.google.common.base.Objects; +import com.google.common.base.Strings; +import com.google.inject.Inject; +import com.google.inject.Singleton; +import java.util.List; +import org.eclipse.core.runtime.Assert; +import org.eclipse.emf.common.util.EList; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.etrice.core.room.Attribute; +import org.eclipse.etrice.core.room.DataType; +import org.eclipse.etrice.core.room.InterfaceItem; +import org.eclipse.etrice.core.room.Message; +import org.eclipse.etrice.core.room.Operation; +import org.eclipse.etrice.core.room.Port; +import org.eclipse.etrice.core.room.ProtocolClass; +import org.eclipse.etrice.core.room.RefableType; +import org.eclipse.etrice.core.room.SPP; +import org.eclipse.etrice.core.room.VarDecl; +import org.eclipse.etrice.core.room.util.RoomHelpers; +import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider; +import org.eclipse.etrice.expressions.detailcode.RuntimeDetailExpressionProvider; +import org.eclipse.etrice.expressions.ui.HighlightConstants; +import org.eclipse.jface.viewers.ILabelProvider; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.Point; +import org.eclipse.xtext.xbase.lib.Conversions; +import org.eclipse.xtext.xbase.lib.Functions.Function1; +import org.eclipse.xtext.xbase.lib.IterableExtensions; +import org.eclipse.xtext.xbase.lib.ListExtensions; +import org.eclipse.xtext.xbase.lib.Pair; + +@Singleton +@SuppressWarnings("all") +public class DetailExpressionUIProvider { + private final static String IMAGE_RT_METHOD = "icons/rt_method.png"; + + @Inject + protected ILabelProvider labelProvider; + + @Inject + protected RoomHelpers roomHelpers; + + /** + * Return postfix string and its selection (relative start, length) + */ + public Pair<String, Point> getPostfixReplacement(final IDetailExpressionProvider.ExpressionFeature feature) { + Pair<String, Point> _xblockexpression = null; + { + this.assertNotNull(feature); + String[] _switchResult = null; + IDetailExpressionProvider.ExpressionPostfix _postfix = feature.getPostfix(); + if (_postfix != null) { + switch (_postfix) { + case PARENTHESES: + _switchResult = new String[] { "(", ")" }; + break; + case BRACKETS: + _switchResult = new String[] { "[", "]" }; + break; + default: + return Pair.<String, Point>of("", null); + } + } else { + return Pair.<String, Point>of("", null); + } + String[] brackets = _switchResult; + String _switchResult_1 = null; + Object _data = feature.getData(); + final Object data = _data; + boolean _matched = false; + if (data instanceof Operation) { + _matched=true; + EList<VarDecl> _arguments = ((Operation)data).getArguments(); + final Function1<VarDecl, String> _function = (VarDecl it) -> { + return it.getName(); + }; + List<String> _map = ListExtensions.<VarDecl, String>map(_arguments, _function); + _switchResult_1 = IterableExtensions.join(_map, ", "); + } + if (!_matched) { + if (data instanceof Message) { + VarDecl _data_1 = ((Message)data).getData(); + boolean _notEquals = (!Objects.equal(_data_1, null)); + if (_notEquals) { + _matched=true; + VarDecl _data_2 = ((Message)data).getData(); + _switchResult_1 = _data_2.getName(); + } + } + } + if (!_matched) { + if (data instanceof Attribute) { + _matched=true; + } + if (!_matched) { + if (data instanceof InterfaceItem) { + _matched=true; + } + } + if (_matched) { + _switchResult_1 = "0"; + } + } + if (!_matched) { + _switchResult_1 = ""; + } + String replacement = _switchResult_1; + Point _xifexpression = null; + boolean _isEmpty = replacement.isEmpty(); + boolean _not = (!_isEmpty); + if (_not) { + int _length = replacement.length(); + _xifexpression = new Point(1, _length); + } + final Point selection = _xifexpression; + final String[] _converted_brackets = (String[])brackets; + String _head = IterableExtensions.<String>head(((Iterable<String>)Conversions.doWrapArray(_converted_brackets))); + String _plus = (_head + replacement); + final String[] _converted_brackets_1 = (String[])brackets; + String _last = IterableExtensions.<String>last(((Iterable<String>)Conversions.doWrapArray(_converted_brackets_1))); + String _plus_1 = (_plus + _last); + _xblockexpression = Pair.<String, Point>of(_plus_1, selection); + } + return _xblockexpression; + } + + /** + * Return completion string and its selection (relative start, length) + */ + public Pair<String, Point> getCompletion(final IDetailExpressionProvider.ExpressionFeature feature) { + this.assertNotNull(feature); + Pair<String, Point> postfix = this.getPostfixReplacement(feature); + Point point = postfix.getValue(); + boolean _notEquals = (!Objects.equal(point, null)); + if (_notEquals) { + int _x = point.x; + String _id = feature.getId(); + int _length = _id.length(); + point.x = (_x + _length); + } + String _id_1 = feature.getId(); + String _key = postfix.getKey(); + String _plus = (_id_1 + _key); + return Pair.<String, Point>of(_plus, point); + } + + public String getID(final IDetailExpressionProvider.ExpressionFeature feature) { + this.assertNotNull(feature); + String _switchResult = null; + Object _data = feature.getData(); + boolean _matched = false; + if (_data instanceof InterfaceItem) { + _matched=true; + _switchResult = HighlightConstants.INTERFACE_ITEM; + } + if (!_matched) { + if (_data instanceof Attribute) { + _matched=true; + _switchResult = HighlightConstants.ATTRIBUTE; + } + } + if (!_matched) { + if (_data instanceof Operation) { + _matched=true; + _switchResult = HighlightConstants.OPERATION; + } + } + if (!_matched) { + if (_data instanceof EObject) { + _matched=true; + _switchResult = HighlightConstants.SPECIAL_FEATURE; + } + } + if (!_matched) { + if (_data instanceof RuntimeDetailExpressionProvider.RuntimeMethodExpressionData) { + _matched=true; + _switchResult = HighlightConstants.OPERATION; + } + } + return _switchResult; + } + + /** + * Text format: + * {@code completionInfo : typedInfo - classInfo} + */ + public String getDisplayString(final IDetailExpressionProvider.ExpressionFeature feature) { + this.assertNotNull(feature); + final Object data = feature.getData(); + String _id = feature.getId(); + Pair<String, Point> _postfixReplacement = this.getPostfixReplacement(feature); + String _key = _postfixReplacement.getKey(); + String completionInfo = (_id + _key); + String typedInfo = ""; + String _xifexpression = null; + if ((data instanceof EObject)) { + EClass _eClass = ((EObject)data).eClass(); + _xifexpression = _eClass.getName(); + } else { + _xifexpression = ""; + } + String classInfo = _xifexpression; + boolean _matched = false; + if (data instanceof Attribute) { + _matched=true; + RefableType _type = ((Attribute)data).getType(); + DataType _type_1 = _type.getType(); + String _name = _type_1.getName(); + typedInfo = _name; + } + if (!_matched) { + if (data instanceof InterfaceItem) { + _matched=true; + ProtocolClass _protocol = this.roomHelpers.getProtocol(((InterfaceItem)data)); + String _name = _protocol.getName(); + typedInfo = _name; + } + } + if (!_matched) { + if (data instanceof RuntimeDetailExpressionProvider.RuntimeMethodExpressionData) { + String _id_1 = feature.getId(); + boolean _equals = Objects.equal(_id_1, RuntimeDetailExpressionProvider.RT_METHOD_GET_REPLICATION); + if (_equals) { + _matched=true; + typedInfo = "int"; + } + } + } + if (!_matched) { + if (data instanceof VarDecl) { + _matched=true; + RefableType _refType = ((VarDecl)data).getRefType(); + DataType _type = _refType.getType(); + String _name = _type.getName(); + typedInfo = _name; + classInfo = ""; + } + } + if (!_matched) { + { + final String label = this.labelProvider.getText(data); + String _commonPrefix = Strings.commonPrefix(label, completionInfo); + boolean _isEmpty = _commonPrefix.isEmpty(); + boolean _not = (!_isEmpty); + if (_not) { + completionInfo = label; + } + } + } + IDetailExpressionProvider.ExpressionPostfix _postfix = feature.getPostfix(); + boolean _equals = Objects.equal(_postfix, IDetailExpressionProvider.ExpressionPostfix.NONE); + if (_equals) { + boolean _matched_1 = false; + if (data instanceof SPP) { + boolean _isEventDriven = ((SPP)data).isEventDriven(); + if (_isEventDriven) { + _matched_1=true; + } + } + if (!_matched_1) { + if (data instanceof Port) { + if ((((Port)data).isReplicated() && ((Port)data).isEventDriven())) { + _matched_1=true; + } + } + } + if (_matched_1) { + completionInfo = (completionInfo + " (broadcast)"); + } + } + boolean _isEmpty = typedInfo.isEmpty(); + boolean _not = (!_isEmpty); + if (_not) { + typedInfo = (" : " + typedInfo); + } + boolean _isEmpty_1 = classInfo.isEmpty(); + boolean _not_1 = (!_isEmpty_1); + if (_not_1) { + classInfo = (" - " + classInfo); + } + return ((completionInfo + typedInfo) + classInfo); + } + + public Image getImage(final IDetailExpressionProvider.ExpressionFeature feature) { + Image _xblockexpression = null; + { + this.assertNotNull(feature); + Image _switchResult = null; + Object _data = feature.getData(); + boolean _matched = false; + if (_data instanceof EObject) { + _matched=true; + Object _data_1 = feature.getData(); + _switchResult = this.labelProvider.getImage(_data_1); + } + _xblockexpression = _switchResult; + } + return _xblockexpression; + } + + protected void assertNotNull(final IDetailExpressionProvider.ExpressionFeature feature) { + String _id = feature.getId(); + boolean _isNullOrEmpty = Strings.isNullOrEmpty(_id); + boolean _not = (!_isNullOrEmpty); + Assert.isTrue(_not); + IDetailExpressionProvider.ExpressionPostfix _postfix = feature.getPostfix(); + Assert.isNotNull(_postfix); + Object _data = feature.getData(); + Assert.isNotNull(_data); + } +} diff --git a/plugins/org.eclipse.etrice.expressions.ui/xtend-gen/org/eclipse/etrice/expressions/ui/HighlightConstants.java b/plugins/org.eclipse.etrice.expressions.ui/xtend-gen/org/eclipse/etrice/expressions/ui/HighlightConstants.java new file mode 100644 index 000000000..4a4a89785 --- /dev/null +++ b/plugins/org.eclipse.etrice.expressions.ui/xtend-gen/org/eclipse/etrice/expressions/ui/HighlightConstants.java @@ -0,0 +1,32 @@ +/** + * 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@protos.de (initial contribution) + */ +package org.eclipse.etrice.expressions.ui; + +import org.eclipse.swt.graphics.RGB; + +@SuppressWarnings("all") +public class HighlightConstants { + public final static String INTERFACE_ITEM = "room_InterfaceItem"; + + public final static String ATTRIBUTE = "room_Attribute"; + + public final static String OPERATION = "room_Operation"; + + public final static String SPECIAL_FEATURE = "room_EObject"; + + public final static RGB COLOR_TARGET_KEYWORD = new RGB(127, 0, 85); + + public final static RGB COLLOR_COMMENT = new RGB(63, 127, 95); + + public final static RGB COLOR_STRING = new RGB(42, 0, 255); + + public final static RGB COLOR_NUMBER = new RGB(125, 125, 125); +} diff --git a/plugins/org.eclipse.etrice.expressions.ui/xtend-gen/org/eclipse/etrice/expressions/ui/contentassist/RoomExpressionProposals.java b/plugins/org.eclipse.etrice.expressions.ui/xtend-gen/org/eclipse/etrice/expressions/ui/contentassist/RoomExpressionProposals.java new file mode 100644 index 000000000..c3a9b0690 --- /dev/null +++ b/plugins/org.eclipse.etrice.expressions.ui/xtend-gen/org/eclipse/etrice/expressions/ui/contentassist/RoomExpressionProposals.java @@ -0,0 +1,153 @@ +/** + * 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.expressions.ui.contentassist; + +import com.google.common.base.Objects; +import com.google.common.collect.Iterables; +import com.google.inject.Inject; +import java.util.ArrayList; +import java.util.List; +import org.eclipse.etrice.expressions.detailcode.DetailExpressionAssistParser; +import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider; +import org.eclipse.etrice.expressions.ui.DetailExpressionUIProvider; +import org.eclipse.jface.text.Document; +import org.eclipse.jface.text.contentassist.ICompletionProposal; +import org.eclipse.jface.viewers.StyledString; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.Point; +import org.eclipse.xtext.ui.editor.contentassist.ConfigurableCompletionProposal; +import org.eclipse.xtext.ui.editor.contentassist.PrefixMatcher; +import org.eclipse.xtext.util.Strings; +import org.eclipse.xtext.xbase.lib.CollectionLiterals; +import org.eclipse.xtext.xbase.lib.Exceptions; +import org.eclipse.xtext.xbase.lib.Functions.Function1; +import org.eclipse.xtext.xbase.lib.IterableExtensions; +import org.eclipse.xtext.xbase.lib.ObjectExtensions; +import org.eclipse.xtext.xbase.lib.Pair; +import org.eclipse.xtext.xbase.lib.Procedures.Procedure1; + +@SuppressWarnings("all") +public class RoomExpressionProposals { + @Inject + private DetailExpressionUIProvider uiExpressionProvider; + + @Inject + private PrefixMatcher prefixMatcher; + + public List<ICompletionProposal> createProposals(final IDetailExpressionProvider exprProvider, final String text, final int offset, final int globalOffset) { + try { + List<ICompletionProposal> _xblockexpression = null; + { + Document _document = new Document(text); + final DetailExpressionAssistParser parser = new DetailExpressionAssistParser(_document, offset, exprProvider); + ArrayList<IDetailExpressionProvider.ExpressionFeature> _newArrayList = CollectionLiterals.<IDetailExpressionProvider.ExpressionFeature>newArrayList(); + final Procedure1<ArrayList<IDetailExpressionProvider.ExpressionFeature>> _function = (ArrayList<IDetailExpressionProvider.ExpressionFeature> it) -> { + boolean _isContextExpression = parser.isContextExpression(); + if (_isContextExpression) { + IDetailExpressionProvider.ExpressionFeature _resolveLatestCompleted = null; + if (parser!=null) { + _resolveLatestCompleted=parser.resolveLatestCompleted(); + } + final IDetailExpressionProvider.ExpressionFeature contextFeature = _resolveLatestCompleted; + List<IDetailExpressionProvider.ExpressionFeature> _xifexpression = null; + if ((contextFeature != null)) { + _xifexpression = exprProvider.getContextFeatures(contextFeature); + } else { + _xifexpression = exprProvider.getInitialFeatures(); + } + Iterables.<IDetailExpressionProvider.ExpressionFeature>addAll(it, _xifexpression); + } else { + List<IDetailExpressionProvider.ExpressionFeature> _initialFeatures = exprProvider.getInitialFeatures(); + Iterables.<IDetailExpressionProvider.ExpressionFeature>addAll(it, _initialFeatures); + } + }; + final ArrayList<IDetailExpressionProvider.ExpressionFeature> availableFeatures = ObjectExtensions.<ArrayList<IDetailExpressionProvider.ExpressionFeature>>operator_doubleArrow(_newArrayList, _function); + final String prefix = parser.computeIdentifierPrefix(offset); + final Function1<IDetailExpressionProvider.ExpressionFeature, Boolean> _function_1 = (IDetailExpressionProvider.ExpressionFeature it) -> { + String _id = it.getId(); + return Boolean.valueOf(_id.startsWith(prefix)); + }; + Iterable<IDetailExpressionProvider.ExpressionFeature> _filter = IterableExtensions.<IDetailExpressionProvider.ExpressionFeature>filter(availableFeatures, _function_1); + final Function1<IDetailExpressionProvider.ExpressionFeature, ICompletionProposal> _function_2 = (IDetailExpressionProvider.ExpressionFeature feature) -> { + String _displayString = this.uiExpressionProvider.getDisplayString(feature); + final StyledString displayString = new StyledString(_displayString); + final Image image = this.uiExpressionProvider.getImage(feature); + String _id = feature.getId(); + ConfigurableCompletionProposal _doCreateProposal = this.doCreateProposal(_id, displayString, image, prefix, globalOffset); + final Procedure1<ConfigurableCompletionProposal> _function_3 = (ConfigurableCompletionProposal it) -> { + this.processPostfix(it, feature); + }; + final ConfigurableCompletionProposal prop = ObjectExtensions.<ConfigurableCompletionProposal>operator_doubleArrow(_doCreateProposal, _function_3); + return ((ICompletionProposal) prop); + }; + Iterable<ICompletionProposal> _map = IterableExtensions.<IDetailExpressionProvider.ExpressionFeature, ICompletionProposal>map(_filter, _function_2); + _xblockexpression = IterableExtensions.<ICompletionProposal>toList(_map); + } + return _xblockexpression; + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + protected ConfigurableCompletionProposal doCreateProposal(final String proposal, final StyledString displayString, final Image image, final String prefix, final int globalOffset) { + int _length = prefix.length(); + int _minus = (globalOffset - _length); + int _length_1 = prefix.length(); + int _length_2 = proposal.length(); + ConfigurableCompletionProposal _configurableCompletionProposal = new ConfigurableCompletionProposal(proposal, _minus, _length_1, _length_2, image, displayString, null, null); + final Procedure1<ConfigurableCompletionProposal> _function = (ConfigurableCompletionProposal it) -> { + it.setMatcher(this.prefixMatcher); + it.setAutoInsertable(false); + int _length_3 = proposal.length(); + it.setReplaceContextLength(_length_3); + }; + return ObjectExtensions.<ConfigurableCompletionProposal>operator_doubleArrow(_configurableCompletionProposal, _function); + } + + protected ConfigurableCompletionProposal processPostfix(final ConfigurableCompletionProposal proposal, final IDetailExpressionProvider.ExpressionFeature feature) { + final Procedure1<ConfigurableCompletionProposal> _function = (ConfigurableCompletionProposal it) -> { + final Pair<String, Point> postfix = this.uiExpressionProvider.getPostfixReplacement(feature); + String _key = postfix.getKey(); + boolean _isEmpty = Strings.isEmpty(_key); + boolean _not = (!_isEmpty); + if (_not) { + Point _value = postfix.getValue(); + boolean _notEquals = (!Objects.equal(_value, null)); + if (_notEquals) { + int _replacementOffset = it.getReplacementOffset(); + String _replacementString = it.getReplacementString(); + int _length = _replacementString.length(); + int _plus = (_replacementOffset + _length); + Point _value_1 = postfix.getValue(); + int _plus_1 = (_plus + _value_1.x); + it.setSelectionStart(_plus_1); + int _cursorPosition = it.getCursorPosition(); + Point _value_2 = postfix.getValue(); + int _plus_2 = (_cursorPosition + _value_2.x); + it.setCursorPosition(_plus_2); + Point _value_3 = postfix.getValue(); + it.setSelectionLength(_value_3.y); + } else { + int _cursorPosition_1 = it.getCursorPosition(); + String _key_1 = postfix.getKey(); + int _length_1 = _key_1.length(); + int _plus_3 = (_cursorPosition_1 + _length_1); + it.setCursorPosition(_plus_3); + } + String _replacementString_1 = it.getReplacementString(); + String _key_2 = postfix.getKey(); + String _plus_4 = (_replacementString_1 + _key_2); + it.setReplacementString(_plus_4); + } + }; + return ObjectExtensions.<ConfigurableCompletionProposal>operator_doubleArrow(proposal, _function); + } +} diff --git a/plugins/org.eclipse.etrice.expressions.ui/xtend-gen/org/eclipse/etrice/expressions/ui/highlight/RoomExpressionHighlighter.java b/plugins/org.eclipse.etrice.expressions.ui/xtend-gen/org/eclipse/etrice/expressions/ui/highlight/RoomExpressionHighlighter.java new file mode 100644 index 000000000..1ac97ddac --- /dev/null +++ b/plugins/org.eclipse.etrice.expressions.ui/xtend-gen/org/eclipse/etrice/expressions/ui/highlight/RoomExpressionHighlighter.java @@ -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.expressions.ui.highlight; + +import com.google.inject.Inject; +import java.util.ArrayList; +import java.util.List; +import org.eclipse.etrice.expressions.ui.DetailExpressionUIProvider; +import org.eclipse.xtend.lib.annotations.Accessors; +import org.eclipse.xtext.xbase.lib.CollectionLiterals; +import org.eclipse.xtext.xbase.lib.Pure; + +@SuppressWarnings("all") +public class RoomExpressionHighlighter { + @Accessors + public static class HighlightResult { + private final int offset; + + private final int length; + + private final String id; + + public HighlightResult(final int offset, final int length, final String id) { + super(); + this.offset = offset; + this.length = length; + this.id = id; + } + + @Pure + public int getOffset() { + return this.offset; + } + + @Pure + public int getLength() { + return this.length; + } + + @Pure + public String getId() { + return this.id; + } + } + + @Inject + private DetailExpressionUIProvider expressionProvider; + + public List<RoomExpressionHighlighter.HighlightResult> getHighlighting(final String text, final int offset) { + ArrayList<RoomExpressionHighlighter.HighlightResult> _xblockexpression = null; + { + final ArrayList<RoomExpressionHighlighter.HighlightResult> result = CollectionLiterals.<RoomExpressionHighlighter.HighlightResult>newArrayList(); + _xblockexpression = result; + } + return _xblockexpression; + } +} diff --git a/plugins/org.eclipse.etrice.ui.behavior.actioneditor/META-INF/MANIFEST.MF b/plugins/org.eclipse.etrice.ui.behavior.actioneditor/META-INF/MANIFEST.MF index 17ec6596f..7ede8e195 100644 --- a/plugins/org.eclipse.etrice.ui.behavior.actioneditor/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.etrice.ui.behavior.actioneditor/META-INF/MANIFEST.MF @@ -20,7 +20,8 @@ Require-Bundle: org.eclipse.etrice.core.fsm;bundle-version="1.1.1", com.google.guava;bundle-version="8.0.0", org.eclipse.xtext.xbase.lib, org.eclipse.ui.workbench.texteditor, - org.eclipse.etrice.core.room.ui + org.eclipse.etrice.core.room.ui, + org.eclipse.etrice.expressions.ui;bundle-version="1.1.1" Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Export-Package: org.eclipse.etrice.ui.behavior.actioneditor, diff --git a/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/modelaware/ModelAwareActionCodeEditor.java b/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/modelaware/ModelAwareActionCodeEditor.java index 3abaa0ac0..d1549a85f 100644 --- a/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/modelaware/ModelAwareActionCodeEditor.java +++ b/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/modelaware/ModelAwareActionCodeEditor.java @@ -13,9 +13,9 @@ package org.eclipse.etrice.ui.behavior.actioneditor.modelaware; +import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider; import org.eclipse.etrice.ui.behavior.actioneditor.sourceviewer.ActionCodeColorManager; import org.eclipse.etrice.ui.behavior.actioneditor.sourceviewer.SourceViewerActionCodeEditor; -import org.eclipse.etrice.ui.behavior.fsm.detailcode.IDetailExpressionProvider; /** * An extension of the {@link SourceViewerActionCodeEditor} which configures it diff --git a/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/modelaware/ModelAwareActionCodeEditorConfiguration.java b/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/modelaware/ModelAwareActionCodeEditorConfiguration.java index 2abc64154..3d0a986bc 100644 --- a/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/modelaware/ModelAwareActionCodeEditorConfiguration.java +++ b/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/modelaware/ModelAwareActionCodeEditorConfiguration.java @@ -13,10 +13,10 @@ package org.eclipse.etrice.ui.behavior.actioneditor.modelaware; +import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider; import org.eclipse.etrice.ui.behavior.actioneditor.sourceviewer.ActionCodeAssistProcessor; import org.eclipse.etrice.ui.behavior.actioneditor.sourceviewer.ActionCodeColorManager; import org.eclipse.etrice.ui.behavior.actioneditor.sourceviewer.ActionCodeEditorConfiguration; -import org.eclipse.etrice.ui.behavior.fsm.detailcode.IDetailExpressionProvider; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.TextAttribute; import org.eclipse.jface.text.contentassist.ContentAssistant; diff --git a/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/modelaware/ModelAwareActionCodeEditorFactory.java b/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/modelaware/ModelAwareActionCodeEditorFactory.java index 4a28cfbe9..7887d9ae1 100644 --- a/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/modelaware/ModelAwareActionCodeEditorFactory.java +++ b/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/modelaware/ModelAwareActionCodeEditorFactory.java @@ -15,11 +15,11 @@ package org.eclipse.etrice.ui.behavior.actioneditor.modelaware; import java.util.List; +import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider; import org.eclipse.etrice.ui.behavior.actioneditor.sourceviewer.AbstractActionCodeEditor; import org.eclipse.etrice.ui.behavior.actioneditor.sourceviewer.SourceViewerActionCodeEditor; import org.eclipse.etrice.ui.behavior.fsm.actioneditor.IActionCodeEditor; import org.eclipse.etrice.ui.behavior.fsm.actioneditor.IActionCodeEditorFactory; -import org.eclipse.etrice.ui.behavior.fsm.detailcode.IDetailExpressionProvider; import org.eclipse.swt.widgets.Composite; import com.google.common.collect.Lists; diff --git a/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/sourceviewer/AbstractActionCodeEditor.java b/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/sourceviewer/AbstractActionCodeEditor.java index a09e35674..313b47245 100644 --- a/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/sourceviewer/AbstractActionCodeEditor.java +++ b/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/sourceviewer/AbstractActionCodeEditor.java @@ -14,6 +14,7 @@ package org.eclipse.etrice.ui.behavior.actioneditor.sourceviewer; import org.eclipse.core.runtime.CoreException; +import org.eclipse.etrice.core.fsm.fSM.DetailCode; import org.eclipse.etrice.ui.behavior.fsm.actioneditor.IActionCodeEditor; import org.eclipse.swt.widgets.Composite; diff --git a/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/sourceviewer/ActionCodeAssistProcessor.java b/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/sourceviewer/ActionCodeAssistProcessor.java index 6c7c74cad..3402344ef 100644 --- a/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/sourceviewer/ActionCodeAssistProcessor.java +++ b/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/sourceviewer/ActionCodeAssistProcessor.java @@ -13,11 +13,10 @@ package org.eclipse.etrice.ui.behavior.actioneditor.sourceviewer; -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.etrice.ui.behavior.fsm.detailcode.IDetailExpressionProvider; -import org.eclipse.etrice.ui.behavior.fsm.detailcode.IDetailExpressionProvider.ExpressionFeature; +import org.eclipse.etrice.core.ui.RoomUiActivator; +import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider; +import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider.ExpressionFeature; +import org.eclipse.etrice.expressions.ui.contentassist.RoomExpressionProposals; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.contentassist.CompletionProposal; @@ -29,6 +28,8 @@ import org.eclipse.swt.graphics.Point; import org.eclipse.xtext.util.Strings; import org.eclipse.xtext.xbase.lib.Pair; +import com.google.inject.Inject; + /** * An Action Editor specific content assist processor. The processor lexically * analyzes the Action Code using {@link ActionCodeContext} and generates @@ -42,11 +43,15 @@ public class ActionCodeAssistProcessor implements IContentAssistProcessor { private ActionCodeEditorConfiguration fConfiguration; private DetailExpressionUIProvider exprProvider; - + + @Inject + RoomExpressionProposals proposals; + public ActionCodeAssistProcessor(ActionCodeEditorConfiguration configuration) { super(); fConfiguration = configuration; exprProvider = fConfiguration.getDetailExpressionProvider(); + RoomUiActivator.getDefault().getInjector(RoomUiActivator.ORG_ECLIPSE_ETRICE_CORE_ROOM).injectMembers(this); } /** @@ -56,62 +61,9 @@ public class ActionCodeAssistProcessor implements IContentAssistProcessor { */ @Override public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset) { - List<ICompletionProposal> proposals = new ArrayList<ICompletionProposal>(); - - // get last context feature + prefix - DetailExpressionAssistParser resolver = new DetailExpressionAssistParser(viewer.getDocument(), offset, - exprProvider); - ExpressionFeature contextFeature = resolver.resolveLatestCompleted(); - String idPrefix = ""; - try { - idPrefix = resolver.computeIdentifierPrefix(offset); - } - catch (BadLocationException e) { - } - - // cancel, if user expects proposals from context, but contextFeature - // could not be resolved - if (contextFeature == null && isExpressionSeparator(viewer, offset)) - return new ICompletionProposal[0]; - - // create proposals - Iterable<ExpressionFeature> features = (contextFeature != null) ? exprProvider.getContextFeaturesWithPrefix( - contextFeature, idPrefix) : exprProvider.getInitialFeaturesWithPrefix(idPrefix); - for (ExpressionFeature feature : features) { - try { - proposals.add(createPrefixCompletionProposal(feature, offset, idPrefix)); - } - catch (Exception e) { - } - } - - return proposals.toArray(new ICompletionProposal[proposals.size()]); - } - - private boolean isExpressionSeparator(ITextViewer viewer, int offset) { - try { - return viewer.getDocument().getChar(offset - 1) == IDetailExpressionProvider.SEPARATOR; - } - catch (BadLocationException e) { - } - return false; + return proposals.createProposals(exprProvider, viewer.getDocument().get(), offset, offset).toArray(new ICompletionProposal[0]); } - private ICompletionProposal createPrefixCompletionProposal(ExpressionFeature feature, int offset, String prefix) { - Pair<String, Point> completionPair = exprProvider.getCompletion(feature); - String completion = completionPair.getKey(); - String displayString = exprProvider.getDisplayString(feature); - if (Strings.isEmpty(displayString)) - displayString = completion; - - ICompletionProposal proposal = new CompletionProposal(completion, offset - prefix.length(), prefix.length(), - completion.length(), exprProvider.getImage(feature), displayString, null, null); - - Point selection = completionPair.getValue(); - if (selection != null) - selection.x += (offset - prefix.length()); - return new CustomCompletionProposal(proposal, selection); - } /** * {@inheritDoc} diff --git a/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/sourceviewer/ActionCodeEditorConfiguration.java b/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/sourceviewer/ActionCodeEditorConfiguration.java index 8ac522a24..982995e5d 100644 --- a/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/sourceviewer/ActionCodeEditorConfiguration.java +++ b/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/sourceviewer/ActionCodeEditorConfiguration.java @@ -18,7 +18,8 @@ import java.util.List; import org.eclipse.core.runtime.Assert; import org.eclipse.etrice.core.ui.RoomUiModule; -import org.eclipse.etrice.ui.behavior.fsm.detailcode.IDetailExpressionProvider; +import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider; +import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider.ExpressionFeature; import org.eclipse.jface.text.source.SourceViewer; import org.eclipse.jface.text.source.SourceViewerConfiguration; diff --git a/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/sourceviewer/DetailExpressionAssistParser.xtend b/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/sourceviewer/DetailExpressionAssistParser.xtend index dd0367f51..c9fe9fcbb 100644 --- a/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/sourceviewer/DetailExpressionAssistParser.xtend +++ b/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/sourceviewer/DetailExpressionAssistParser.xtend @@ -12,9 +12,9 @@ package org.eclipse.etrice.ui.behavior.actioneditor.sourceviewer -import org.eclipse.etrice.ui.behavior.fsm.detailcode.IDetailExpressionProvider -import org.eclipse.etrice.ui.behavior.fsm.detailcode.IDetailExpressionProvider.ExpressionFeature -import org.eclipse.etrice.ui.behavior.fsm.detailcode.IDetailExpressionProvider.ExpressionPostfix +import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider +import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider.ExpressionFeature +import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider.ExpressionPostfix import org.eclipse.jface.text.BadLocationException import org.eclipse.jface.text.IDocument import org.eclipse.jface.text.rules.IWordDetector diff --git a/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/sourceviewer/DetailExpressionNamesScanner.java b/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/sourceviewer/DetailExpressionNamesScanner.java index a16731d81..0144f5dc9 100644 --- a/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/sourceviewer/DetailExpressionNamesScanner.java +++ b/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/sourceviewer/DetailExpressionNamesScanner.java @@ -16,7 +16,7 @@ import java.util.Arrays; import java.util.List; import java.util.Map; -import org.eclipse.etrice.ui.behavior.fsm.detailcode.IDetailExpressionProvider.ExpressionFeature; +import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider.ExpressionFeature; import org.eclipse.jface.text.TextAttribute; import org.eclipse.jface.text.rules.IRule; import org.eclipse.jface.text.rules.IToken; diff --git a/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/sourceviewer/DetailExpressionUIProvider.xtend b/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/sourceviewer/DetailExpressionUIProvider.xtend index 7e29cb155..60d3fccf1 100644 --- a/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/sourceviewer/DetailExpressionUIProvider.xtend +++ b/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/sourceviewer/DetailExpressionUIProvider.xtend @@ -21,18 +21,18 @@ import org.eclipse.etrice.core.room.Message import org.eclipse.etrice.core.room.Operation import org.eclipse.etrice.core.room.Port import org.eclipse.etrice.core.room.SPP +import org.eclipse.etrice.core.room.VarDecl import org.eclipse.etrice.core.room.util.RoomHelpers -import org.eclipse.etrice.ui.behavior.fsm.detailcode.IDetailExpressionProvider +import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider +import org.eclipse.etrice.expressions.detailcode.RuntimeDetailExpressionProvider +import org.eclipse.etrice.expressions.detailcode.RuntimeDetailExpressionProvider.RuntimeMethodExpressionData +import org.eclipse.etrice.ui.behavior.actioneditor.Activator import org.eclipse.jface.viewers.ILabelProvider import org.eclipse.swt.graphics.Image import org.eclipse.swt.graphics.Point import org.eclipse.swt.graphics.RGB import org.eclipse.xtend.lib.annotations.Delegate import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor -import org.eclipse.etrice.ui.behavior.detailcode.RuntimeDetailExpressionProvider.RuntimeMethodExpressionData -import org.eclipse.etrice.ui.behavior.actioneditor.Activator -import org.eclipse.etrice.ui.behavior.detailcode.RuntimeDetailExpressionProvider -import org.eclipse.etrice.core.room.VarDecl @FinalFieldsConstructor class DetailExpressionUIProvider implements IDetailExpressionProvider { diff --git a/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/sourceviewer/SourceViewerActionCodeEditor.java b/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/sourceviewer/SourceViewerActionCodeEditor.java index a21364ca0..d168a1fab 100644 --- a/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/sourceviewer/SourceViewerActionCodeEditor.java +++ b/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/sourceviewer/SourceViewerActionCodeEditor.java @@ -22,6 +22,7 @@ import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.commands.IHandler; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.CoreException; +import org.eclipse.etrice.core.fsm.fSM.DetailCode; import org.eclipse.etrice.ui.behavior.fsm.actioneditor.IActionCodeEditor; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.text.BadLocationException; diff --git a/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/text/TextActionCodeEditor.java b/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/text/TextActionCodeEditor.java index 4105cfa40..fe8f2ae2e 100644 --- a/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/text/TextActionCodeEditor.java +++ b/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/text/TextActionCodeEditor.java @@ -13,6 +13,7 @@ package org.eclipse.etrice.ui.behavior.actioneditor.text; +import org.eclipse.etrice.core.fsm.fSM.DetailCode; import org.eclipse.etrice.ui.behavior.actioneditor.sourceviewer.AbstractActionCodeEditor; import org.eclipse.etrice.ui.behavior.fsm.actioneditor.IActionCodeEditor; import org.eclipse.jface.text.Document; diff --git a/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/text/TextActionCodeEditorFactory.java b/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/text/TextActionCodeEditorFactory.java index 96f6ae6e7..bf45ecb9f 100644 --- a/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/text/TextActionCodeEditorFactory.java +++ b/plugins/org.eclipse.etrice.ui.behavior.actioneditor/src/org/eclipse/etrice/ui/behavior/actioneditor/text/TextActionCodeEditorFactory.java @@ -15,9 +15,9 @@ package org.eclipse.etrice.ui.behavior.actioneditor.text; import java.util.ArrayList; +import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider; import org.eclipse.etrice.ui.behavior.fsm.actioneditor.IActionCodeEditor; import org.eclipse.etrice.ui.behavior.fsm.actioneditor.IActionCodeEditorFactory; -import org.eclipse.etrice.ui.behavior.fsm.detailcode.IDetailExpressionProvider; import org.eclipse.swt.widgets.Composite; /** diff --git a/plugins/org.eclipse.etrice.ui.behavior.actioneditor/xtend-gen/org/eclipse/etrice/ui/behavior/actioneditor/sourceviewer/DetailExpressionAssistParser.java b/plugins/org.eclipse.etrice.ui.behavior.actioneditor/xtend-gen/org/eclipse/etrice/ui/behavior/actioneditor/sourceviewer/DetailExpressionAssistParser.java index be825c235..b617e6821 100644 --- a/plugins/org.eclipse.etrice.ui.behavior.actioneditor/xtend-gen/org/eclipse/etrice/ui/behavior/actioneditor/sourceviewer/DetailExpressionAssistParser.java +++ b/plugins/org.eclipse.etrice.ui.behavior.actioneditor/xtend-gen/org/eclipse/etrice/ui/behavior/actioneditor/sourceviewer/DetailExpressionAssistParser.java @@ -13,7 +13,7 @@ package org.eclipse.etrice.ui.behavior.actioneditor.sourceviewer; import com.google.common.base.Objects; import java.util.LinkedList; import java.util.List; -import org.eclipse.etrice.ui.behavior.fsm.detailcode.IDetailExpressionProvider; +import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.rules.IWordDetector; diff --git a/plugins/org.eclipse.etrice.ui.behavior.actioneditor/xtend-gen/org/eclipse/etrice/ui/behavior/actioneditor/sourceviewer/DetailExpressionUIProvider.java b/plugins/org.eclipse.etrice.ui.behavior.actioneditor/xtend-gen/org/eclipse/etrice/ui/behavior/actioneditor/sourceviewer/DetailExpressionUIProvider.java index 33a89173f..a430d9119 100644 --- a/plugins/org.eclipse.etrice.ui.behavior.actioneditor/xtend-gen/org/eclipse/etrice/ui/behavior/actioneditor/sourceviewer/DetailExpressionUIProvider.java +++ b/plugins/org.eclipse.etrice.ui.behavior.actioneditor/xtend-gen/org/eclipse/etrice/ui/behavior/actioneditor/sourceviewer/DetailExpressionUIProvider.java @@ -29,10 +29,10 @@ import org.eclipse.etrice.core.room.RefableType; import org.eclipse.etrice.core.room.SPP; import org.eclipse.etrice.core.room.VarDecl; import org.eclipse.etrice.core.room.util.RoomHelpers; +import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider; +import org.eclipse.etrice.expressions.detailcode.RuntimeDetailExpressionProvider; import org.eclipse.etrice.ui.behavior.actioneditor.Activator; import org.eclipse.etrice.ui.behavior.actioneditor.sourceviewer.ActionCodeColorManager; -import org.eclipse.etrice.ui.behavior.detailcode.RuntimeDetailExpressionProvider; -import org.eclipse.etrice.ui.behavior.fsm.detailcode.IDetailExpressionProvider; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; diff --git a/plugins/org.eclipse.etrice.ui.behavior.fsm/META-INF/MANIFEST.MF b/plugins/org.eclipse.etrice.ui.behavior.fsm/META-INF/MANIFEST.MF index 50458ca2f..2feac2583 100644 --- a/plugins/org.eclipse.etrice.ui.behavior.fsm/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.etrice.ui.behavior.fsm/META-INF/MANIFEST.MF @@ -17,13 +17,13 @@ Require-Bundle: org.eclipse.etrice.core.common.ui;bundle-version="1.1.1", org.eclipse.emf.transaction;bundle-version="1.4.0", org.eclipse.xtext.ui;bundle-version="2.7.0", org.eclipse.xtend.lib;bundle-version="2.7.0", - org.eclipse.xtext.ui.shared;bundle-version="2.7.0" + org.eclipse.xtext.ui.shared;bundle-version="2.7.0", + org.eclipse.etrice.expressions.ui;bundle-version="1.1.1" Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Export-Package: org.eclipse.etrice.ui.behavior.fsm.actioneditor, org.eclipse.etrice.ui.behavior.fsm.actioneditor.preferences, org.eclipse.etrice.ui.behavior.fsm.commands, - org.eclipse.etrice.ui.behavior.fsm.detailcode, org.eclipse.etrice.ui.behavior.fsm.dialogs, org.eclipse.etrice.ui.behavior.fsm.editor, org.eclipse.etrice.ui.behavior.fsm.provider, diff --git a/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/actioneditor/ActionCodeEditorRegistry.java b/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/actioneditor/ActionCodeEditorRegistry.java index 83dd12cf7..545544707 100644 --- a/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/actioneditor/ActionCodeEditorRegistry.java +++ b/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/actioneditor/ActionCodeEditorRegistry.java @@ -22,8 +22,8 @@ import org.eclipse.core.runtime.MultiStatus; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; import org.eclipse.etrice.core.fsm.fSM.DetailCode; +import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider; import org.eclipse.etrice.ui.behavior.fsm.Activator; -import org.eclipse.etrice.ui.behavior.fsm.detailcode.IDetailExpressionProvider; import org.eclipse.swt.widgets.Composite; /** diff --git a/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/actioneditor/IActionCodeEditorFactory.java b/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/actioneditor/IActionCodeEditorFactory.java index 74239e6a1..e0a5882f0 100644 --- a/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/actioneditor/IActionCodeEditorFactory.java +++ b/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/actioneditor/IActionCodeEditorFactory.java @@ -13,7 +13,7 @@ package org.eclipse.etrice.ui.behavior.fsm.actioneditor; -import org.eclipse.etrice.ui.behavior.fsm.detailcode.IDetailExpressionProvider; +import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider; import org.eclipse.swt.widgets.Composite; /** diff --git a/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/dialogs/AbstractMemberAwarePropertyDialog.java b/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/dialogs/AbstractMemberAwarePropertyDialog.java index b2f2d5373..90ebde21c 100644 --- a/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/dialogs/AbstractMemberAwarePropertyDialog.java +++ b/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/dialogs/AbstractMemberAwarePropertyDialog.java @@ -23,12 +23,12 @@ import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.etrice.core.fsm.fSM.DetailCode; import org.eclipse.etrice.core.fsm.fSM.ModelComponent; +import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider; import org.eclipse.etrice.ui.behavior.fsm.Activator; import org.eclipse.etrice.ui.behavior.fsm.actioneditor.ActionCodeEditorRegistry; import org.eclipse.etrice.ui.behavior.fsm.actioneditor.ActionCodeEditorRegistry.ActionCodeEditorRegistryEntry; import org.eclipse.etrice.ui.behavior.fsm.actioneditor.IActionCodeEditor; import org.eclipse.etrice.ui.behavior.fsm.actioneditor.preferences.PreferenceConstants; -import org.eclipse.etrice.ui.behavior.fsm.detailcode.IDetailExpressionProvider; import org.eclipse.etrice.ui.behavior.fsm.support.FSMSupportUtil; import org.eclipse.etrice.ui.common.base.dialogs.AbstractPropertyDialog; import org.eclipse.etrice.ui.common.base.dialogs.MultiValidator2; diff --git a/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/editor/AbstractFSMDiagramBehavior.java b/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/editor/AbstractFSMDiagramBehavior.java index bac71ebe4..923170c4e 100644 --- a/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/editor/AbstractFSMDiagramBehavior.java +++ b/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/editor/AbstractFSMDiagramBehavior.java @@ -12,7 +12,6 @@ package org.eclipse.etrice.ui.behavior.fsm.editor; -import org.eclipse.etrice.ui.behavior.fsm.editor.DiagnosingModelObserver; import org.eclipse.etrice.ui.common.base.editor.CustomDiagramBehavior; import org.eclipse.gef.EditPart; import org.eclipse.graphiti.ui.editor.DefaultRefreshBehavior; diff --git a/plugins/org.eclipse.etrice.ui.behavior/META-INF/MANIFEST.MF b/plugins/org.eclipse.etrice.ui.behavior/META-INF/MANIFEST.MF index ed73ff01f..05c40761e 100644 --- a/plugins/org.eclipse.etrice.ui.behavior/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.etrice.ui.behavior/META-INF/MANIFEST.MF @@ -20,11 +20,11 @@ Require-Bundle: org.eclipse.etrice.core.room.ui;bundle-version="1.1.1", org.eclipse.xtext.ui;bundle-version="2.6.0", org.eclipse.xtext.ui.shared;bundle-version="2.6.0", org.eclipse.etrice.abstractexec.behavior;bundle-version="1.1.1", - org.eclipse.etrice.core.genmodel;bundle-version="1.1.1" + org.eclipse.etrice.core.genmodel;bundle-version="1.1.1", + org.eclipse.etrice.expressions.ui;bundle-version="1.1.1" Bundle-ActivationPolicy: lazy Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: Eclipse eTrice Export-Package: org.eclipse.etrice.ui.behavior, - org.eclipse.etrice.ui.behavior.detailcode, org.eclipse.etrice.ui.behavior.editor, org.eclipse.etrice.ui.behavior.support diff --git a/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/DiagramTypeProvider.java b/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/DiagramTypeProvider.java index aa35a51ad..1af861f41 100644 --- a/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/DiagramTypeProvider.java +++ b/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/DiagramTypeProvider.java @@ -12,10 +12,10 @@ package org.eclipse.etrice.ui.behavior; +import org.eclipse.etrice.ui.behavior.fsm.editor.AbstractFSMDiagramTypeProvider; import org.eclipse.etrice.ui.behavior.fsm.support.AbstractFSMProviderDispatcher; import org.eclipse.etrice.ui.behavior.support.ProviderDispatcher; import org.eclipse.etrice.ui.common.base.support.DiagramAccessBase; -import org.eclipse.etrice.ui.behavior.fsm.editor.AbstractFSMDiagramTypeProvider; import org.eclipse.graphiti.tb.IToolBehaviorProvider; public class DiagramTypeProvider extends AbstractFSMDiagramTypeProvider { diff --git a/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/dialogs/StatePropertyDialog.java b/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/dialogs/StatePropertyDialog.java index 6fe2c8825..85b1d25df 100644 --- a/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/dialogs/StatePropertyDialog.java +++ b/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/dialogs/StatePropertyDialog.java @@ -17,8 +17,8 @@ import org.eclipse.etrice.core.fsm.fSM.State; import org.eclipse.etrice.core.fsm.validation.FSMValidationUtilXtend.Result; import org.eclipse.etrice.core.room.ActorClass; import org.eclipse.etrice.core.room.util.RoomHelpers; +import org.eclipse.etrice.expressions.detailcode.RuntimeDetailExpressionProvider; import org.eclipse.etrice.ui.behavior.Activator; -import org.eclipse.etrice.ui.behavior.detailcode.RuntimeDetailExpressionProvider; import org.eclipse.etrice.ui.behavior.fsm.actioneditor.IActionCodeEditor; import org.eclipse.etrice.ui.behavior.fsm.dialogs.AbstractMemberAwarePropertyDialog; import org.eclipse.etrice.ui.behavior.fsm.dialogs.DetailCodeToString; diff --git a/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/dialogs/TransitionPropertyDialog.java b/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/dialogs/TransitionPropertyDialog.java index 71ea45657..8099be8b6 100644 --- a/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/dialogs/TransitionPropertyDialog.java +++ b/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/dialogs/TransitionPropertyDialog.java @@ -32,11 +32,11 @@ import org.eclipse.etrice.core.room.InterfaceItem; import org.eclipse.etrice.core.room.ProtocolClass; import org.eclipse.etrice.core.room.VarDecl; import org.eclipse.etrice.core.room.util.RoomHelpers; +import org.eclipse.etrice.expressions.detailcode.GuardDetailExpressionProvider; +import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider; +import org.eclipse.etrice.expressions.detailcode.RuntimeDetailExpressionProvider; import org.eclipse.etrice.ui.behavior.Activator; -import org.eclipse.etrice.ui.behavior.detailcode.GuardDetailExpressionProvider; -import org.eclipse.etrice.ui.behavior.detailcode.RuntimeDetailExpressionProvider; import org.eclipse.etrice.ui.behavior.fsm.actioneditor.IActionCodeEditor; -import org.eclipse.etrice.ui.behavior.fsm.detailcode.IDetailExpressionProvider; import org.eclipse.etrice.ui.behavior.fsm.dialogs.AbstractMemberAwarePropertyDialog; import org.eclipse.etrice.ui.behavior.fsm.dialogs.DetailCodeToString; import org.eclipse.etrice.ui.behavior.fsm.dialogs.ITransitionPropertyDialog; |