diff options
author | Juergen Haug | 2017-08-29 14:08:52 +0000 |
---|---|---|
committer | Juergen Haug | 2017-08-29 14:55:38 +0000 |
commit | c72ab314a29234cf980b85d12c18734747ee2176 (patch) | |
tree | 0183a601bcc04af0be62a88bbb81813b54e10251 | |
parent | 965e852cc5dc0a3a6891c5bd8962d596eb122238 (diff) | |
download | org.eclipse.etrice-c72ab314a29234cf980b85d12c18734747ee2176.tar.gz org.eclipse.etrice-c72ab314a29234cf980b85d12c18734747ee2176.tar.xz org.eclipse.etrice-c72ab314a29234cf980b85d12c18734747ee2176.zip |
[targetLang] improved reusability, switched to new xtext highlight api
Change-Id: I1eee0f3cc15fe60bbe1f302ed7b68edf29b2f527
16 files changed, 290 insertions, 214 deletions
diff --git a/plugins/org.eclipse.etrice.core.common.ui/src/org/eclipse/etrice/core/common/ui/autoedit/BaseAutoEditStrategyProvider.java b/plugins/org.eclipse.etrice.core.common.ui/src/org/eclipse/etrice/core/common/ui/autoedit/BaseAutoEditStrategyProvider.java index f57c65754..f8259030a 100644 --- a/plugins/org.eclipse.etrice.core.common.ui/src/org/eclipse/etrice/core/common/ui/autoedit/BaseAutoEditStrategyProvider.java +++ b/plugins/org.eclipse.etrice.core.common.ui/src/org/eclipse/etrice/core/common/ui/autoedit/BaseAutoEditStrategyProvider.java @@ -1,3 +1,15 @@ +/******************************************************************************* + * 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.common.ui.autoedit; import org.eclipse.etrice.core.common.ui.editor.model.BaseTokenTypeToPartitionMapper; diff --git a/plugins/org.eclipse.etrice.core.common.ui/src/org/eclipse/etrice/core/common/ui/highlight/BaseHighlightingConfig.java b/plugins/org.eclipse.etrice.core.common.ui/src/org/eclipse/etrice/core/common/ui/highlight/BaseHighlightingConfig.java index 1b217b56d..bdbb11c05 100644 --- a/plugins/org.eclipse.etrice.core.common.ui/src/org/eclipse/etrice/core/common/ui/highlight/BaseHighlightingConfig.java +++ b/plugins/org.eclipse.etrice.core.common.ui/src/org/eclipse/etrice/core/common/ui/highlight/BaseHighlightingConfig.java @@ -1,3 +1,14 @@ +/******************************************************************************* + * 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: + * + *******************************************************************************/ + package org.eclipse.etrice.core.common.ui.highlight; import org.eclipse.swt.graphics.RGB; diff --git a/plugins/org.eclipse.etrice.core.common.ui/src/org/eclipse/etrice/core/common/ui/highlight/BaseSemanticHighlighter.java b/plugins/org.eclipse.etrice.core.common.ui/src/org/eclipse/etrice/core/common/ui/highlight/BaseSemanticHighlighter.java index b512b7f6e..f43159c0f 100644 --- a/plugins/org.eclipse.etrice.core.common.ui/src/org/eclipse/etrice/core/common/ui/highlight/BaseSemanticHighlighter.java +++ b/plugins/org.eclipse.etrice.core.common.ui/src/org/eclipse/etrice/core/common/ui/highlight/BaseSemanticHighlighter.java @@ -1,17 +1,31 @@ +/******************************************************************************* + * 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 + * + *******************************************************************************/ + package org.eclipse.etrice.core.common.ui.highlight; import java.util.List; import org.eclipse.emf.ecore.EObject; +import org.eclipse.etrice.core.common.converter.BaseConverterService; +import org.eclipse.etrice.core.common.converter.CCStringConverter; import org.eclipse.etrice.core.common.converter.CCStringIndentation; -import org.eclipse.etrice.core.common.converter.CC_StringConverter; import org.eclipse.etrice.core.common.services.BaseGrammarAccess; import org.eclipse.xtext.RuleCall; +import org.eclipse.xtext.ide.editor.syntaxcoloring.IHighlightedPositionAcceptor; +import org.eclipse.xtext.ide.editor.syntaxcoloring.ISemanticHighlightingCalculator; import org.eclipse.xtext.nodemodel.INode; import org.eclipse.xtext.resource.XtextResource; import org.eclipse.xtext.ui.editor.syntaxcoloring.DefaultHighlightingConfiguration; -import org.eclipse.xtext.ui.editor.syntaxcoloring.IHighlightedPositionAcceptor; -import org.eclipse.xtext.ui.editor.syntaxcoloring.ISemanticHighlightingCalculator; +import org.eclipse.xtext.util.CancelIndicator; import org.eclipse.xtext.xbase.lib.Pair; import com.google.inject.Inject; @@ -21,25 +35,34 @@ public class BaseSemanticHighlighter implements ISemanticHighlightingCalculator @Inject BaseGrammarAccess grammar; + @Inject + BaseConverterService converterService; + @Override - public void provideHighlightingFor(XtextResource resource, IHighlightedPositionAcceptor acceptor) { + public void provideHighlightingFor(XtextResource resource, IHighlightedPositionAcceptor acceptor, CancelIndicator cancelIndicator) { if (resource == null || resource.getParseResult() == null) return; INode root = resource.getParseResult().getRootNode(); for (INode node : root.getAsTreeIterable()) { - - EObject obj = node.getGrammarElement(); - if (obj instanceof RuleCall) { - if(((RuleCall) obj).getRule() == grammar.getCC_STRINGRule()) { - detailCodeStringHighlight(node, acceptor); - } + if(cancelIndicator.isCanceled()) + break; + + provideHighlightingFor(node, resource, acceptor); + } + } + + protected void provideHighlightingFor(INode node, XtextResource resource, IHighlightedPositionAcceptor acceptor) { + EObject obj = node.getGrammarElement(); + if (obj instanceof RuleCall) { + if(((RuleCall) obj).getRule() == grammar.getCC_STRINGRule()) { + ccStringHighlight(node, acceptor, converterService.getCC_StringConverter()); } } } - protected void detailCodeStringHighlight(INode node, IHighlightedPositionAcceptor acceptor) { - final String delim = CC_StringConverter.DELIM; + protected void ccStringHighlight(INode node, IHighlightedPositionAcceptor acceptor, CCStringConverter converter) { + final String delim = converter.getDelim(); if (node.getText() == null || node.getText().length() < delim.length() * 2) return; @@ -47,7 +70,7 @@ public class BaseSemanticHighlighter implements ISemanticHighlightingCalculator acceptor.addPosition(node.getEndOffset() - delim.length(), delim.length(), DefaultHighlightingConfiguration.STRING_ID); int offset = node.getOffset() + delim.length(); - List<Pair<Integer, Integer>> lineStartLength = new CCStringIndentation(CC_StringConverter.stripDelim(node.getText())).highlight(); + List<Pair<Integer, Integer>> lineStartLength = new CCStringIndentation(converter.stripDelim(node.getText())).highlight(); for (Pair<Integer, Integer> offsetLength : lineStartLength) { acceptor.addPosition(offset + offsetLength.getKey(), offsetLength.getValue(), BaseHighlightingConfig.HL_CCSTRING); } diff --git a/plugins/org.eclipse.etrice.core.common/src/org/eclipse/etrice/core/common/converter/BaseConverterService.java b/plugins/org.eclipse.etrice.core.common/src/org/eclipse/etrice/core/common/converter/BaseConverterService.java index 2a7778e59..1400f15df 100644 --- a/plugins/org.eclipse.etrice.core.common/src/org/eclipse/etrice/core/common/converter/BaseConverterService.java +++ b/plugins/org.eclipse.etrice.core.common/src/org/eclipse/etrice/core/common/converter/BaseConverterService.java @@ -26,7 +26,7 @@ public class BaseConverterService extends DefaultTerminalConverters { private TimeConverter timeConverter = new TimeConverter(); private LongConverter longConverter = new LongConverter(); private DoubleConverter doubleConverter = new DoubleConverter(); - private CC_StringConverter ccStringConverter = new CC_StringConverter(); + private CCStringConverter ccStringConverter = new CCStringConverter("'''"); @Inject private QualifiedNameValueConverter fqnConverter; @@ -52,7 +52,8 @@ public class BaseConverterService extends DefaultTerminalConverters { } @ValueConverter(rule = "CC_STRING") - public IValueConverter<String> getCC_StringConverter() { + public CCStringConverter getCC_StringConverter() { return ccStringConverter; } + } diff --git a/plugins/org.eclipse.etrice.core.common/src/org/eclipse/etrice/core/common/converter/CCStringConverter.java b/plugins/org.eclipse.etrice.core.common/src/org/eclipse/etrice/core/common/converter/CCStringConverter.java new file mode 100644 index 000000000..2a9476e87 --- /dev/null +++ b/plugins/org.eclipse.etrice.core.common/src/org/eclipse/etrice/core/common/converter/CCStringConverter.java @@ -0,0 +1,69 @@ +/******************************************************************************* + * 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.common.converter; + +import org.eclipse.xtext.conversion.ValueConverterException; +import org.eclipse.xtext.conversion.impl.AbstractLexerBasedConverter; +import org.eclipse.xtext.nodemodel.INode; + +public class CCStringConverter extends AbstractLexerBasedConverter<String> { + + static public String addDelim(final String text, String delim) { + if(CCStringIndentation.hasLineBreak(text)) { + final String lineEnding = CCStringIndentation.getLineEnding(text); + return delim + lineEnding + text + delim; + } + return delim + text + delim; + } + + static public String stripDelim(String nodeText, String delim) { + if (nodeText.startsWith(delim) && nodeText.endsWith(delim)) { + return nodeText.substring(delim.length(), nodeText.length() - delim.length()); + } + + return nodeText; + } + + private final String delim; + + public CCStringConverter(String delim) { + this.delim = delim; + } + + public String getDelim() { + return delim; + } + + @Override + protected String toEscapedString(String value) { + return addDelim(value, delim); + } + + public String toValue(String string, INode node) { + if (string == null) + return null; + try { + return new CCStringIndentation(stripDelim(string, delim)).removeEditorWhiteSpace(); + } catch (IllegalArgumentException e) { + throw new ValueConverterException(e.getMessage(), node, e); + } + } + + public String addDelim(String text) { + return addDelim(text, delim); + } + + public String stripDelim(String text) { + return stripDelim(text, delim); + } +} diff --git a/plugins/org.eclipse.etrice.core.common/src/org/eclipse/etrice/core/common/converter/CC_StringConverter.java b/plugins/org.eclipse.etrice.core.common/src/org/eclipse/etrice/core/common/converter/CC_StringConverter.java deleted file mode 100644 index 703a6a92d..000000000 --- a/plugins/org.eclipse.etrice.core.common/src/org/eclipse/etrice/core/common/converter/CC_StringConverter.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.eclipse.etrice.core.common.converter; - -import org.eclipse.xtext.conversion.ValueConverterException; -import org.eclipse.xtext.conversion.impl.AbstractLexerBasedConverter; -import org.eclipse.xtext.nodemodel.INode; - -public class CC_StringConverter extends AbstractLexerBasedConverter<String> { - - static public String DELIM = "'''"; - - static public String addDelim(final String text) { - if(CCStringIndentation.hasLineBreak(text)) { - final String lineEnding = CCStringIndentation.getLineEnding(text); - return DELIM + lineEnding + text + DELIM; - } - return DELIM + text + DELIM; - } - - static public String stripDelim(String nodeText) { - if (nodeText.startsWith(DELIM) && nodeText.endsWith(DELIM)) { - return nodeText.substring(DELIM.length(), nodeText.length() - DELIM.length()); - } - - return nodeText; - } - - @Override - protected String toEscapedString(String value) { - return addDelim(value); - } - - public String toValue(String string, INode node) { - if (string == null) - return null; - try { - return new CCStringIndentation(stripDelim(string)).removeEditorWhiteSpace(); - } catch (IllegalArgumentException e) { - throw new ValueConverterException(e.getMessage(), node, e); - } - } -} diff --git a/plugins/org.eclipse.etrice.core.common/src/org/eclipse/etrice/core/common/formatting2/CCStringReplacer.xtend b/plugins/org.eclipse.etrice.core.common/src/org/eclipse/etrice/core/common/formatting2/CCStringReplacer.xtend new file mode 100644 index 000000000..6f2ede0e9 --- /dev/null +++ b/plugins/org.eclipse.etrice.core.common/src/org/eclipse/etrice/core/common/formatting2/CCStringReplacer.xtend @@ -0,0 +1,38 @@ +/******************************************************************************* + * 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.common.formatting2 + +import org.eclipse.etrice.core.common.converter.CCStringConverter +import org.eclipse.etrice.core.common.converter.CCStringIndentation +import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor +import org.eclipse.xtext.formatting2.ITextReplacerContext +import org.eclipse.xtext.formatting2.internal.AbstractTextReplacer + +@FinalFieldsConstructor +class CCStringReplacer extends AbstractTextReplacer { + + val CCStringConverter converter + + override createReplacements(ITextReplacerContext context) { + if (region.multiline) { + val ccIndent = new CCStringIndentation(converter.stripDelim(region.text.trim)) + val endIndent = if(ccIndent.ignoreLast) context.indentationString else '' + val replacement = ccIndent.replaceEditorIndentation(context.getIndentationString(context.indentation + 1)) + + endIndent + context => [ + addReplacement(region.replaceWith(converter.delim + replacement + converter.delim)) + ] + } + return context + } +} diff --git a/plugins/org.eclipse.etrice.core.common/xtend-gen/org/eclipse/etrice/core/common/formatting2/CCStringReplacer.java b/plugins/org.eclipse.etrice.core.common/xtend-gen/org/eclipse/etrice/core/common/formatting2/CCStringReplacer.java new file mode 100644 index 000000000..87dba2255 --- /dev/null +++ b/plugins/org.eclipse.etrice.core.common/xtend-gen/org/eclipse/etrice/core/common/formatting2/CCStringReplacer.java @@ -0,0 +1,70 @@ +/** + * 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.common.formatting2; + +import org.eclipse.etrice.core.common.converter.CCStringConverter; +import org.eclipse.etrice.core.common.converter.CCStringIndentation; +import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor; +import org.eclipse.xtext.formatting2.IFormattableDocument; +import org.eclipse.xtext.formatting2.ITextReplacerContext; +import org.eclipse.xtext.formatting2.internal.AbstractTextReplacer; +import org.eclipse.xtext.formatting2.regionaccess.ITextReplacement; +import org.eclipse.xtext.formatting2.regionaccess.ITextSegment; +import org.eclipse.xtext.xbase.lib.ObjectExtensions; +import org.eclipse.xtext.xbase.lib.Procedures.Procedure1; + +@FinalFieldsConstructor +@SuppressWarnings("all") +public class CCStringReplacer extends AbstractTextReplacer { + private final CCStringConverter converter; + + @Override + public ITextReplacerContext createReplacements(final ITextReplacerContext context) { + ITextSegment _region = this.getRegion(); + boolean _isMultiline = _region.isMultiline(); + if (_isMultiline) { + ITextSegment _region_1 = this.getRegion(); + String _text = _region_1.getText(); + String _trim = _text.trim(); + String _stripDelim = this.converter.stripDelim(_trim); + final CCStringIndentation ccIndent = new CCStringIndentation(_stripDelim); + String _xifexpression = null; + boolean _isIgnoreLast = ccIndent.isIgnoreLast(); + if (_isIgnoreLast) { + _xifexpression = context.getIndentationString(); + } else { + _xifexpression = ""; + } + final String endIndent = _xifexpression; + int _indentation = context.getIndentation(); + int _plus = (_indentation + 1); + String _indentationString = context.getIndentationString(_plus); + String _replaceEditorIndentation = ccIndent.replaceEditorIndentation(_indentationString); + final String replacement = (_replaceEditorIndentation + endIndent); + final Procedure1<ITextReplacerContext> _function = (ITextReplacerContext it) -> { + ITextSegment _region_2 = this.getRegion(); + String _delim = this.converter.getDelim(); + String _plus_1 = (_delim + replacement); + String _delim_1 = this.converter.getDelim(); + String _plus_2 = (_plus_1 + _delim_1); + ITextReplacement _replaceWith = _region_2.replaceWith(_plus_2); + it.addReplacement(_replaceWith); + }; + ObjectExtensions.<ITextReplacerContext>operator_doubleArrow(context, _function); + } + return context; + } + + public CCStringReplacer(final IFormattableDocument document, final ITextSegment region, final CCStringConverter converter) { + super(document, region); + this.converter = converter; + } +} diff --git a/plugins/org.eclipse.etrice.core.fsm.ui/xtend-gen/org/eclipse/etrice/core/fsm/ui/quickfix/FSMQuickfixProvider.java b/plugins/org.eclipse.etrice.core.fsm.ui/xtend-gen/org/eclipse/etrice/core/fsm/ui/quickfix/FSMQuickfixProvider.java index d00af4618..9eec1beb4 100644 --- a/plugins/org.eclipse.etrice.core.fsm.ui/xtend-gen/org/eclipse/etrice/core/fsm/ui/quickfix/FSMQuickfixProvider.java +++ b/plugins/org.eclipse.etrice.core.fsm.ui/xtend-gen/org/eclipse/etrice/core/fsm/ui/quickfix/FSMQuickfixProvider.java @@ -4,28 +4,12 @@ package org.eclipse.etrice.core.fsm.ui.quickfix; import com.google.inject.Inject; -import org.eclipse.emf.common.util.EList; -import org.eclipse.emf.common.util.URI; -import org.eclipse.emf.ecore.EObject; -import org.eclipse.emf.ecore.resource.Resource; -import org.eclipse.etrice.core.common.converter.CC_StringConverter; -import org.eclipse.etrice.core.fsm.fSM.DetailCode; import org.eclipse.etrice.core.fsm.validation.FSMJavaValidator; -import org.eclipse.xtext.formatting.ILineSeparatorInformation; import org.eclipse.xtext.formatting.IWhitespaceInformationProvider; -import org.eclipse.xtext.nodemodel.ICompositeNode; -import org.eclipse.xtext.nodemodel.util.NodeModelUtils; -import org.eclipse.xtext.ui.editor.model.IXtextDocument; -import org.eclipse.xtext.ui.editor.model.edit.IModificationContext; -import org.eclipse.xtext.ui.editor.model.edit.ISemanticModification; import org.eclipse.xtext.ui.editor.quickfix.DefaultQuickfixProvider; import org.eclipse.xtext.ui.editor.quickfix.Fix; import org.eclipse.xtext.ui.editor.quickfix.IssueResolutionAcceptor; import org.eclipse.xtext.validation.Issue; -import org.eclipse.xtext.xbase.lib.Exceptions; -import org.eclipse.xtext.xbase.lib.IterableExtensions; -import org.eclipse.xtext.xbase.lib.ObjectExtensions; -import org.eclipse.xtext.xbase.lib.Procedures.Procedure1; /** * Custom quickfixes. @@ -39,28 +23,8 @@ public class FSMQuickfixProvider extends DefaultQuickfixProvider { @Fix(FSMJavaValidator.PLAIN_STRING_DETAILCODE) public void fixMultiLineDetailCode(final Issue issue, final IssueResolutionAcceptor acceptor) { - final ISemanticModification _function = (EObject element, IModificationContext context) -> { - final DetailCode dc = ((DetailCode) element); - EList<String> _lines = dc.getLines(); - Resource _eResource = dc.eResource(); - URI _uRI = _eResource.getURI(); - ILineSeparatorInformation _lineSeparatorInformation = this.whitespaceProvider.getLineSeparatorInformation(_uRI); - String _lineSeparator = _lineSeparatorInformation.getLineSeparator(); - final String ccString = IterableExtensions.join(_lines, _lineSeparator); - ICompositeNode _findActualNodeFor = NodeModelUtils.findActualNodeFor(dc); - final Procedure1<ICompositeNode> _function_1 = (ICompositeNode it) -> { - try { - IXtextDocument _xtextDocument = context.getXtextDocument(); - int _offset = it.getOffset(); - int _length = it.getLength(); - String _addDelim = CC_StringConverter.addDelim(ccString); - _xtextDocument.replace(_offset, _length, _addDelim); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); - } - }; - ObjectExtensions.<ICompositeNode>operator_doubleArrow(_findActualNodeFor, _function_1); - }; - acceptor.accept(issue, "Convert to smart string", "", "correction_change.gif", _function); + throw new Error("Unresolved compilation problems:" + + "\nThe method or field CC_StringConverter is undefined" + + "\naddDelim cannot be resolved"); } } diff --git a/plugins/org.eclipse.etrice.core.fsm/src/org/eclipse/etrice/core/fsm/formatting2/FSMFormatter.xtend b/plugins/org.eclipse.etrice.core.fsm/src/org/eclipse/etrice/core/fsm/formatting2/FSMFormatter.xtend index 95b05d019..fde21195a 100644 --- a/plugins/org.eclipse.etrice.core.fsm/src/org/eclipse/etrice/core/fsm/formatting2/FSMFormatter.xtend +++ b/plugins/org.eclipse.etrice.core.fsm/src/org/eclipse/etrice/core/fsm/formatting2/FSMFormatter.xtend @@ -14,9 +14,9 @@ package org.eclipse.etrice.core.fsm.formatting2 import com.google.inject.Inject import org.eclipse.emf.ecore.EObject -import org.eclipse.etrice.core.common.converter.CCStringIndentation -import org.eclipse.etrice.core.common.converter.CC_StringConverter +import org.eclipse.etrice.core.common.converter.BaseConverterService import org.eclipse.etrice.core.common.formatting2.BaseFormatter +import org.eclipse.etrice.core.common.formatting2.CCStringReplacer import org.eclipse.etrice.core.fsm.fSM.DetailCode import org.eclipse.etrice.core.fsm.fSM.ProtocolSemantics import org.eclipse.etrice.core.fsm.fSM.State @@ -25,10 +25,7 @@ import org.eclipse.etrice.core.fsm.fSM.Transition import org.eclipse.etrice.core.fsm.fSM.Trigger import org.eclipse.etrice.core.fsm.fSM.TriggeredTransition import org.eclipse.etrice.core.fsm.services.FSMGrammarAccess -import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor import org.eclipse.xtext.formatting2.IFormattableDocument -import org.eclipse.xtext.formatting2.ITextReplacerContext -import org.eclipse.xtext.formatting2.internal.AbstractTextReplacer import org.eclipse.xtext.formatting2.regionaccess.ISemanticRegion class FSMFormatter extends BaseFormatter { @@ -76,30 +73,14 @@ class FSMFormatter extends BaseFormatter { rules.forEach[prependDefaultNewLines(document)] } - @FinalFieldsConstructor - static class DetailCodeReplacer extends AbstractTextReplacer { - - override createReplacements(ITextReplacerContext context) { - if (region.multiline) { - val ccIndent = new CCStringIndentation(CC_StringConverter.stripDelim(region.text.trim)) - val endIndent = if(ccIndent.ignoreLast) context.indentationString else '' - val replacement = ccIndent.replaceEditorIndentation(context.getIndentationString(context.indentation + 1)) + endIndent - context => [ - addReplacement(region.replaceWith(CC_StringConverter.DELIM + replacement + CC_StringConverter.DELIM)) - ] - - } - - context - } - - } + @Inject + BaseConverterService converterService def dispatch void format(DetailCode detailcode, extension IFormattableDocument document) { val ccRegion = detailcode.regionFor.assignment(detailCodeAccess.linesAssignment_0_1) if(ccRegion !== null) { detailcode.prepend[oneSpace] - if(detailcode.multiline) document.addReplacer(new DetailCodeReplacer(document, ccRegion)) + if(detailcode.multiline) document.addReplacer(new CCStringReplacer(document, ccRegion, converterService.CC_StringConverter)) } else { detailcode.regionFor.assignments(detailCodeAccess.linesAssignment_1_1).forEach[prepend[newLine]] } diff --git a/plugins/org.eclipse.etrice.core.fsm/xtend-gen/org/eclipse/etrice/core/fsm/formatting2/FSMFormatter.java b/plugins/org.eclipse.etrice.core.fsm/xtend-gen/org/eclipse/etrice/core/fsm/formatting2/FSMFormatter.java index 4e5f4abf4..50c0d6c8b 100644 --- a/plugins/org.eclipse.etrice.core.fsm/xtend-gen/org/eclipse/etrice/core/fsm/formatting2/FSMFormatter.java +++ b/plugins/org.eclipse.etrice.core.fsm/xtend-gen/org/eclipse/etrice/core/fsm/formatting2/FSMFormatter.java @@ -20,9 +20,10 @@ import org.eclipse.etrice.core.common.base.Annotation; import org.eclipse.etrice.core.common.base.AnnotationType; import org.eclipse.etrice.core.common.base.Documentation; import org.eclipse.etrice.core.common.base.Import; -import org.eclipse.etrice.core.common.converter.CCStringIndentation; -import org.eclipse.etrice.core.common.converter.CC_StringConverter; +import org.eclipse.etrice.core.common.converter.BaseConverterService; +import org.eclipse.etrice.core.common.converter.CCStringConverter; import org.eclipse.etrice.core.common.formatting2.BaseFormatter; +import org.eclipse.etrice.core.common.formatting2.CCStringReplacer; import org.eclipse.etrice.core.fsm.fSM.DetailCode; import org.eclipse.etrice.core.fsm.fSM.ProtocolSemantics; import org.eclipse.etrice.core.fsm.fSM.SemanticsRule; @@ -32,70 +33,20 @@ import org.eclipse.etrice.core.fsm.fSM.Transition; import org.eclipse.etrice.core.fsm.fSM.Trigger; import org.eclipse.etrice.core.fsm.fSM.TriggeredTransition; import org.eclipse.etrice.core.fsm.services.FSMGrammarAccess; -import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor; import org.eclipse.xtext.Assignment; import org.eclipse.xtext.formatting2.IFormattableDocument; import org.eclipse.xtext.formatting2.IHiddenRegionFormatter; -import org.eclipse.xtext.formatting2.ITextReplacerContext; -import org.eclipse.xtext.formatting2.internal.AbstractTextReplacer; import org.eclipse.xtext.formatting2.regionaccess.IHiddenRegion; import org.eclipse.xtext.formatting2.regionaccess.ISemanticRegion; import org.eclipse.xtext.formatting2.regionaccess.ISemanticRegionsFinder; -import org.eclipse.xtext.formatting2.regionaccess.ITextReplacement; -import org.eclipse.xtext.formatting2.regionaccess.ITextSegment; import org.eclipse.xtext.resource.XtextResource; import org.eclipse.xtext.xbase.lib.Extension; 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 FSMFormatter extends BaseFormatter { - @FinalFieldsConstructor - public static class DetailCodeReplacer extends AbstractTextReplacer { - @Override - public ITextReplacerContext createReplacements(final ITextReplacerContext context) { - ITextReplacerContext _xblockexpression = null; - { - ITextSegment _region = this.getRegion(); - boolean _isMultiline = _region.isMultiline(); - if (_isMultiline) { - ITextSegment _region_1 = this.getRegion(); - String _text = _region_1.getText(); - String _trim = _text.trim(); - String _stripDelim = CC_StringConverter.stripDelim(_trim); - final CCStringIndentation ccIndent = new CCStringIndentation(_stripDelim); - String _xifexpression = null; - boolean _isIgnoreLast = ccIndent.isIgnoreLast(); - if (_isIgnoreLast) { - _xifexpression = context.getIndentationString(); - } else { - _xifexpression = ""; - } - final String endIndent = _xifexpression; - int _indentation = context.getIndentation(); - int _plus = (_indentation + 1); - String _indentationString = context.getIndentationString(_plus); - String _replaceEditorIndentation = ccIndent.replaceEditorIndentation(_indentationString); - final String replacement = (_replaceEditorIndentation + endIndent); - final Procedure1<ITextReplacerContext> _function = (ITextReplacerContext it) -> { - ITextSegment _region_2 = this.getRegion(); - ITextReplacement _replaceWith = _region_2.replaceWith(((CC_StringConverter.DELIM + replacement) + CC_StringConverter.DELIM)); - it.addReplacement(_replaceWith); - }; - ObjectExtensions.<ITextReplacerContext>operator_doubleArrow(context, _function); - } - _xblockexpression = context; - } - return _xblockexpression; - } - - public DetailCodeReplacer(final IFormattableDocument document, final ITextSegment region) { - super(document, region); - } - } - @Inject @Extension private FSMGrammarAccess _fSMGrammarAccess; @@ -234,6 +185,9 @@ public class FSMFormatter extends BaseFormatter { _rules.forEach(_function); } + @Inject + private BaseConverterService converterService; + protected void _format(final DetailCode detailcode, @Extension final IFormattableDocument document) { ISemanticRegionsFinder _regionFor = this.textRegionExtensions.regionFor(detailcode); FSMGrammarAccess.DetailCodeElements _detailCodeAccess = this._fSMGrammarAccess.getDetailCodeAccess(); @@ -246,8 +200,9 @@ public class FSMFormatter extends BaseFormatter { document.<DetailCode>prepend(detailcode, _function); boolean _isMultiline = this.textRegionExtensions.isMultiline(detailcode); if (_isMultiline) { - FSMFormatter.DetailCodeReplacer _detailCodeReplacer = new FSMFormatter.DetailCodeReplacer(document, ccRegion); - document.addReplacer(_detailCodeReplacer); + CCStringConverter _cC_StringConverter = this.converterService.getCC_StringConverter(); + CCStringReplacer _cCStringReplacer = new CCStringReplacer(document, ccRegion, _cC_StringConverter); + document.addReplacer(_cCStringReplacer); } } else { ISemanticRegionsFinder _regionFor_1 = this.textRegionExtensions.regionFor(detailcode); 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 38348bd93..9c23fcfed 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 @@ -26,13 +26,13 @@ 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.ide.editor.syntaxcoloring.ISemanticHighlightingCalculator; 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.model.ITokenTypeToPartitionTypeMapper; import org.eclipse.xtext.ui.editor.syntaxcoloring.IHighlightingConfiguration; -import org.eclipse.xtext.ui.editor.syntaxcoloring.ISemanticHighlightingCalculator; import com.google.inject.Binder; import com.google.inject.Injector; 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 1f059031a..28d6f65cf 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 @@ -22,11 +22,10 @@ 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.ide.editor.syntaxcoloring.IHighlightedPositionAcceptor; 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; /** @@ -58,38 +57,34 @@ public class RoomSemanticHighlightingCalculator extends BaseSemanticHighlighter return keywordPattern; } - // @Override - public void provideHighlightingFor(XtextResource resource, IHighlightedPositionAcceptor acceptor) { - super.provideHighlightingFor(resource, acceptor); + @Override + protected void provideHighlightingFor(INode node, XtextResource resource, IHighlightedPositionAcceptor acceptor) { + super.provideHighlightingFor(node, resource, acceptor); - if (resource == null || resource.getParseResult() == null) - return; - - INode root = resource.getParseResult().getRootNode(); - for (INode node : root.getAsTreeIterable()) { - EObject obj = node.getGrammarElement(); - if (obj instanceof RuleCall) { - RuleCall ruleCall = (RuleCall) obj; - 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); - } + EObject obj = node.getGrammarElement(); + if (obj instanceof RuleCall) { + RuleCall ruleCall = (RuleCall) obj; + 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/src/org/eclipse/etrice/core/formatting/RoomFormatter.java b/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/formatting/RoomFormatter.java index 644148cb7..ce6140b6b 100644 --- a/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/formatting/RoomFormatter.java +++ b/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/formatting/RoomFormatter.java @@ -12,7 +12,6 @@ package org.eclipse.etrice.core.formatting; -import org.eclipse.etrice.core.common.converter.CC_StringConverter; import org.eclipse.xtext.Keyword; import org.eclipse.xtext.formatting.impl.AbstractDeclarativeFormatter; import org.eclipse.xtext.formatting.impl.FormattingConfig; @@ -68,7 +67,7 @@ public class RoomFormatter extends AbstractDeclarativeFormatter { } for (Keyword k: f.findKeywords("do", "entry", "exit", "action", "cond", "usercode", "usercode1", "usercode2")) { - c.setSpace(" ").between(k, f.findKeywords(CC_StringConverter.DELIM).get(0)); + c.setSpace(" ").between(k, f.findKeywords("'''").get(0)); } c.setLinewrap(2).around(f.getImportRule()); diff --git a/tests/org.eclipse.etrice.core.common.tests/src-gen/org/eclipse/etrice/core/common/DetailCodeParseTest.xtend b/tests/org.eclipse.etrice.core.common.tests/src/org/eclipse/etrice/core/common/tests/DetailCodeParseTest.xtend index 5446f57c1..11db4fe0f 100644 --- a/tests/org.eclipse.etrice.core.common.tests/src-gen/org/eclipse/etrice/core/common/DetailCodeParseTest.xtend +++ b/tests/org.eclipse.etrice.core.common.tests/src/org/eclipse/etrice/core/common/tests/DetailCodeParseTest.xtend @@ -10,11 +10,11 @@ * *******************************************************************************/ -package org.eclipse.etrice.core.common +package org.eclipse.etrice.core.common.tests import com.google.inject.Inject +import org.eclipse.etrice.core.common.BaseTestInjectorProvider import org.eclipse.etrice.core.common.converter.BaseConverterService -import org.eclipse.etrice.core.common.converter.CC_StringConverter import org.eclipse.xtext.junit4.InjectWith import org.eclipse.xtext.junit4.XtextRunner import org.eclipse.xtext.util.Strings @@ -28,7 +28,7 @@ import static org.junit.Assert.* class DetailCodeParseTest { val NL = Strings.newLine - val DELIM = CC_StringConverter.DELIM + val DELIM = "'''" @Inject BaseConverterService baseConverterService diff --git a/tests/org.eclipse.etrice.core.common.tests/xtend-gen/org/eclipse/etrice/core/common/DetailCodeParseTest.java b/tests/org.eclipse.etrice.core.common.tests/xtend-gen/org/eclipse/etrice/core/common/tests/DetailCodeParseTest.java index c1e083296..ee84db5b1 100644 --- a/tests/org.eclipse.etrice.core.common.tests/xtend-gen/org/eclipse/etrice/core/common/DetailCodeParseTest.java +++ b/tests/org.eclipse.etrice.core.common.tests/xtend-gen/org/eclipse/etrice/core/common/tests/DetailCodeParseTest.java @@ -8,14 +8,13 @@ * CONTRIBUTORS: * Juergen Haug (initial contribution) */ -package org.eclipse.etrice.core.common; +package org.eclipse.etrice.core.common.tests; import com.google.inject.Inject; import org.eclipse.etrice.core.common.BaseTestInjectorProvider; import org.eclipse.etrice.core.common.converter.BaseConverterService; -import org.eclipse.etrice.core.common.converter.CC_StringConverter; +import org.eclipse.etrice.core.common.converter.CCStringConverter; import org.eclipse.xtend2.lib.StringConcatenation; -import org.eclipse.xtext.conversion.IValueConverter; import org.eclipse.xtext.junit4.InjectWith; import org.eclipse.xtext.junit4.XtextRunner; import org.eclipse.xtext.util.Strings; @@ -31,16 +30,16 @@ import org.junit.runner.RunWith; public class DetailCodeParseTest { private final String NL = Strings.newLine(); - private final String DELIM = CC_StringConverter.DELIM; + private final String DELIM = "\'\'\'"; @Inject private BaseConverterService baseConverterService; protected String toValue(final String withoutDelim) { - IValueConverter<String> _cC_StringConverter = this.baseConverterService.getCC_StringConverter(); + CCStringConverter _cC_StringConverter = this.baseConverterService.getCC_StringConverter(); String _value = _cC_StringConverter.toValue(withoutDelim, null); final Procedure1<String> _function = (String convertedWithoutDelim) -> { - IValueConverter<String> _cC_StringConverter_1 = this.baseConverterService.getCC_StringConverter(); + CCStringConverter _cC_StringConverter_1 = this.baseConverterService.getCC_StringConverter(); final String convertedWithDelim = _cC_StringConverter_1.toValue(((this.DELIM + withoutDelim) + this.DELIM), null); Assert.assertEquals(convertedWithoutDelim, convertedWithDelim); }; |