diff options
Diffstat (limited to 'plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/highlight/RoomSemanticHighlightingCalculator.java')
-rw-r--r-- | plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/highlight/RoomSemanticHighlightingCalculator.java | 71 |
1 files changed, 45 insertions, 26 deletions
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 c238b7547..1b7fd2f88 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 @@ -17,18 +17,25 @@ package org.eclipse.etrice.core.ui.highlight; import org.eclipse.emf.ecore.EObject; import org.eclipse.etrice.core.common.ui.highlight.BaseSemanticHighlighter; import org.eclipse.etrice.core.converter.RoomValueConverterService; +import org.eclipse.etrice.core.fsm.fSM.DetailCode; import org.eclipse.etrice.core.services.RoomGrammarAccess; -import org.eclipse.etrice.dctools.ast.DCUtil; -import org.eclipse.etrice.dctools.fsm.ast.DCLanguage; -import org.eclipse.etrice.ui.behavior.fsm.Activator; -import org.eclipse.etrice.ui.behavior.fsm.actioneditor.preferences.PreferenceConstants; -import org.eclipse.jface.preference.IPreferenceStore; +import org.eclipse.etrice.core.ui.util.UIExpressionUtil; +import org.eclipse.etrice.core.ui.util.UIExpressionUtil.ExpressionCache; +import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider; +import org.eclipse.etrice.expressions.ui.highlight.ExpressionRuleFactory; +import org.eclipse.etrice.expressions.ui.highlight.TargetLanguageRuleFactory; +import org.eclipse.jface.text.Document; +import org.eclipse.jface.text.rules.IRule; +import org.eclipse.jface.text.rules.IToken; +import org.eclipse.jface.text.rules.RuleBasedScanner; +import org.eclipse.jface.text.rules.Token; import org.eclipse.xtext.RuleCall; import org.eclipse.xtext.ide.editor.syntaxcoloring.IHighlightedPositionAcceptor; import org.eclipse.xtext.nodemodel.INode; import org.eclipse.xtext.resource.XtextResource; import org.eclipse.xtext.util.CancelIndicator; +import com.google.common.collect.Iterables; import com.google.inject.Inject; /** @@ -36,24 +43,19 @@ import com.google.inject.Inject; * */ public class RoomSemanticHighlightingCalculator extends BaseSemanticHighlighter { + + @Inject + RoomGrammarAccess grammar; - @Inject RoomGrammarAccess grammar; - @Inject RoomValueConverterService converterService; - @Inject DCUtil detailCodeUtil; - DCLanguage language = null; - - public RoomSemanticHighlightingCalculator() { - } + @Inject + RoomValueConverterService converterService; @Override public void provideHighlightingFor(XtextResource resource, IHighlightedPositionAcceptor acceptor, CancelIndicator cancelIndicator) { if (resource == null || resource.getParseResult() == null) return; - - if (language==null) { - setLanguage(); - } + ExpressionCache expressionCache = new ExpressionCache(); INode root = resource.getParseResult().getRootNode(); for (INode node : root.getAsTreeIterable()) { if(cancelIndicator.isCanceled()) @@ -68,22 +70,39 @@ public class RoomSemanticHighlightingCalculator extends BaseSemanticHighlighter acceptor.addPosition(node.getOffset(), node.getLength(), RoomHighlightingConfiguration.HL_ANNOTATION_ID); } else if(ruleCall.getRule() == grammar.getCC_STRINGRule()) { - HighlightingAstVisitor.highlight(node, acceptor, detailCodeUtil); + detailCodeHighlight(node, acceptor, expressionCache); } } } } - - private void setLanguage() { - IPreferenceStore preferenceStore = Activator.getDefault().getPreferenceStore(); - String lang = preferenceStore.getString(PreferenceConstants.EDITOR_LANGUAGE); - if (lang.equals(PreferenceConstants.JAVA_LANGUAGE)) { - language = DCLanguage.JAVA_LANGUAGE; + + protected void detailCodeHighlight(INode node, IHighlightedPositionAcceptor acceptor, ExpressionCache cache) { + final String text = converterService.getCC_StringConverter().stripDelim(node.getText()); + final int offset = node.getOffset() + converterService.getCC_StringConverter().getDelim().length(); + + DetailCode dc = null; + if(node.getParent().getSemanticElement() instanceof DetailCode) { + dc = (DetailCode) node.getParent().getSemanticElement(); } - else { - language = DCLanguage.CPP_LANGUAGE; + IDetailExpressionProvider exprProvider = UIExpressionUtil.getExpressionProvider(dc, null, cache); + XtextHighlightStyles styles = new XtextHighlightStyles(); + RuleBasedScanner scanner = new RuleBasedScanner(); + scanner.setRules(Iterables.toArray(Iterables.concat( + TargetLanguageRuleFactory.getGeneralLiteralRules(styles), + ExpressionRuleFactory.getInitialExpressionRules(exprProvider, styles), + TargetLanguageRuleFactory.getGeneralKeywordRules(styles)) + , IRule.class)); + scanner.setRange(new Document(text), 0, text.length()); + + IToken lastToken = null; + while(lastToken != Token.EOF) { + lastToken = scanner.nextToken(); + if(lastToken != null && lastToken.getData() != null) { + acceptor.addPosition(offset + scanner.getTokenOffset(), scanner.getTokenLength(), (String) lastToken.getData()); + } } - detailCodeUtil.setLanguage(language); + } + } |