From 419e76265ecbdf65e960e0624be006d31ed1e191 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Fri, 8 May 2020 18:28:19 +0200 Subject: Update solver language grammar First version, still needs TokenSource and Linker to work. --- .../language/ui/SolverLanguageUiModule.xtend | 18 +++---- .../SolverSemanticHighlightCalculator.xtend | 58 --------------------- .../SolverSemanticTextAttributeProvider.xtend | 57 --------------------- .../SolverSemanticHighlightCalculator.xtend | 59 ++++++++++++++++++++++ .../SolverSemanticTextAttributeProvider.xtend | 55 ++++++++++++++++++++ .../validation/SolverLanguageValidator.xtend | 25 +++++++++ 6 files changed, 146 insertions(+), 126 deletions(-) delete mode 100644 Application/org.eclipse.viatra.solver.language.ui/src/org/eclipse/viatra/solver/language/ui/highlight/SolverSemanticHighlightCalculator.xtend delete mode 100644 Application/org.eclipse.viatra.solver.language.ui/src/org/eclipse/viatra/solver/language/ui/highlight/SolverSemanticTextAttributeProvider.xtend create mode 100644 Application/org.eclipse.viatra.solver.language.ui/src/org/eclipse/viatra/solver/language/ui/syntaxcoloring/SolverSemanticHighlightCalculator.xtend create mode 100644 Application/org.eclipse.viatra.solver.language.ui/src/org/eclipse/viatra/solver/language/ui/syntaxcoloring/SolverSemanticTextAttributeProvider.xtend create mode 100644 Application/org.eclipse.viatra.solver.language.ui/src/org/eclipse/viatra/solver/language/validation/SolverLanguageValidator.xtend (limited to 'Application/org.eclipse.viatra.solver.language.ui/src') diff --git a/Application/org.eclipse.viatra.solver.language.ui/src/org/eclipse/viatra/solver/language/ui/SolverLanguageUiModule.xtend b/Application/org.eclipse.viatra.solver.language.ui/src/org/eclipse/viatra/solver/language/ui/SolverLanguageUiModule.xtend index 1c165a0a..602646aa 100644 --- a/Application/org.eclipse.viatra.solver.language.ui/src/org/eclipse/viatra/solver/language/ui/SolverLanguageUiModule.xtend +++ b/Application/org.eclipse.viatra.solver.language.ui/src/org/eclipse/viatra/solver/language/ui/SolverLanguageUiModule.xtend @@ -4,21 +4,17 @@ package org.eclipse.viatra.solver.language.ui import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor -import org.eclipse.xtext.ide.editor.syntaxcoloring.ISemanticHighlightingCalculator -import org.eclipse.xtext.ui.editor.syntaxcoloring.ITextAttributeProvider -import org.eclipse.viatra.solver.language.ui.highlight.SolverSemanticHighlightCalculator -import org.eclipse.viatra.solver.language.ui.highlight.SolverSemanticTextAttributeProvider /** * Use this class to register components to be used within the Eclipse IDE. */ @FinalFieldsConstructor class SolverLanguageUiModule extends AbstractSolverLanguageUiModule { - def Class bindISemanticHighlightingCalculator() { - SolverSemanticHighlightCalculator - } - - def Class bindITextAttributeProvider() { - SolverSemanticTextAttributeProvider - } +// def Class bindISemanticHighlightingCalculator() { +// SolverSemanticHighlightCalculator +// } +// +// def Class bindITextAttributeProvider() { +// SolverSemanticTextAttributeProvider +// } } diff --git a/Application/org.eclipse.viatra.solver.language.ui/src/org/eclipse/viatra/solver/language/ui/highlight/SolverSemanticHighlightCalculator.xtend b/Application/org.eclipse.viatra.solver.language.ui/src/org/eclipse/viatra/solver/language/ui/highlight/SolverSemanticHighlightCalculator.xtend deleted file mode 100644 index cb10ebf4..00000000 --- a/Application/org.eclipse.viatra.solver.language.ui/src/org/eclipse/viatra/solver/language/ui/highlight/SolverSemanticHighlightCalculator.xtend +++ /dev/null @@ -1,58 +0,0 @@ -package org.eclipse.viatra.solver.language.ui.highlight - -import java.util.Random -import java.util.WeakHashMap -import org.eclipse.viatra.solver.language.solverLanguage.ModelSymbol -import org.eclipse.xtext.ide.editor.syntaxcoloring.DefaultSemanticHighlightingCalculator -import org.eclipse.xtext.ide.editor.syntaxcoloring.IHighlightedPositionAcceptor -import org.eclipse.xtext.nodemodel.util.NodeModelUtils -import org.eclipse.xtext.resource.XtextResource -import org.eclipse.xtext.util.CancelIndicator - -class SolverSemanticHighlightCalculator extends DefaultSemanticHighlightingCalculator { - public static val SmybolCode = "SymbolCode" - - val symbolName2ID = new WeakHashMap - - override provideHighlightingFor(XtextResource resource, IHighlightedPositionAcceptor acceptor, CancelIndicator cancelIndicator) { - if (resource === null || resource.getParseResult() === null) { - return - } else { - val modelSymbols = resource.allContents.filter(ModelSymbol) - while(modelSymbols.hasNext) { - val symbolElement = modelSymbols.next - val node = NodeModelUtils::getNode(symbolElement) - acceptor.addPosition( - node.getOffset(), - node.getLength(), - getSymbolCode(symbolElement.name) - ) - } - } - } - - def getSymbolCode(String name) { - if(symbolName2ID.containsKey(name)) { - return symbolName2ID.get(name) - } else { - val id = calculateSymbolCode(name) - symbolName2ID.put(name,id) - return id - } - } - - def String calculateSymbolCode(String name) { - val Random random = new Random(name.hashCode) - val hue = huePick(random.nextFloat) - val saturation = 0.2+random.nextFloat*0.3 - val brightness = random.nextFloat*0.2+0.7f - return '''«SmybolCode» «hue» «saturation» «brightness»''' - } - private def huePick(float random) { - val pink = 300 - val tolerance = 10 - val degree = random*(360-2*tolerance) - if(degree - - @Inject - new(IHighlightingConfiguration highlightingConfig, IPreferenceStoreAccess preferenceStoreAccess, PreferenceStoreAccessor prefStoreAccessor) { - super(highlightingConfig, preferenceStoreAccess, prefStoreAccessor) - } - - - override getAttribute(String id) { - if(isMetamodelElementColorID(id)) { - if(colorID2TextAttribute.containsKey(id)) { - return colorID2TextAttribute.get(id) - } else { - val style = metamodelElementTextStyle(id) - colorID2TextAttribute.put(id,style) - return style - } - } else { - super.getAttribute(id) - } - } - - private def isMetamodelElementColorID(String id) { - id.startsWith(SolverSemanticHighlightCalculator::SmybolCode) - } - - private def TextAttribute metamodelElementTextStyle(String id) { - val texts = id.split(' ') - val backgroundColor = new RGB( - Float.parseFloat(texts.get(1)), - Float.parseFloat(texts.get(2)), - Float.parseFloat(texts.get(3)) - ) - return new TextAttribute( - EditorUtils.colorFromRGB(defaultTextStyle.color), - EditorUtils.colorFromRGB(backgroundColor), - defaultTextStyle.style, - EditorUtils.fontFromFontData(defaultTextStyle.getFontData())); - } - -} \ No newline at end of file diff --git a/Application/org.eclipse.viatra.solver.language.ui/src/org/eclipse/viatra/solver/language/ui/syntaxcoloring/SolverSemanticHighlightCalculator.xtend b/Application/org.eclipse.viatra.solver.language.ui/src/org/eclipse/viatra/solver/language/ui/syntaxcoloring/SolverSemanticHighlightCalculator.xtend new file mode 100644 index 00000000..5242a82e --- /dev/null +++ b/Application/org.eclipse.viatra.solver.language.ui/src/org/eclipse/viatra/solver/language/ui/syntaxcoloring/SolverSemanticHighlightCalculator.xtend @@ -0,0 +1,59 @@ +package org.eclipse.viatra.solver.language.ui.syntaxcoloring + +import java.util.Random +import java.util.WeakHashMap +import org.eclipse.viatra.solver.language.solverLanguage.Reference +import org.eclipse.xtext.ide.editor.syntaxcoloring.DefaultSemanticHighlightingCalculator +import org.eclipse.xtext.ide.editor.syntaxcoloring.IHighlightedPositionAcceptor +import org.eclipse.xtext.nodemodel.util.NodeModelUtils +import org.eclipse.xtext.resource.XtextResource +import org.eclipse.xtext.util.CancelIndicator + +class SolverSemanticHighlightCalculator extends DefaultSemanticHighlightingCalculator { + public static val SYMBOL_CODE = "SymbolCode::" + + val symbolName2ID = new WeakHashMap + + override provideHighlightingFor(XtextResource resource, IHighlightedPositionAcceptor acceptor, + CancelIndicator cancelIndicator) { + if (resource === null || resource.getParseResult() === null) { + return + } else { + val modelSymbols = resource.allContents.filter(Reference) + while (modelSymbols.hasNext) { + val symbolElement = modelSymbols.next + val node = NodeModelUtils.getNode(symbolElement) + acceptor.addPosition( + node.getOffset(), + node.getLength(), + getSymbolCode(node.text) + ) + } + } + } + + def getSymbolCode(String name) { + if (symbolName2ID.containsKey(name)) { + return symbolName2ID.get(name) + } else { + val id = calculateSymbolCode(name) + symbolName2ID.put(name, id) + return id + } + } + + def String calculateSymbolCode(String name) { + val Random random = new Random(name.hashCode) + val hue = huePick(random.nextFloat) + val saturation = 0.2 + random.nextFloat * 0.3 + val brightness = random.nextFloat * 0.2 + 0.7f + return '''«SYMBOL_CODE» «hue» «saturation» «brightness»''' + } + + private def huePick(float random) { + val pink = 300 + val tolerance = 10 + val degree = random * (360 - 2 * tolerance) + if(degree < pink - tolerance) return degree else return degree + 2 * tolerance + } +} diff --git a/Application/org.eclipse.viatra.solver.language.ui/src/org/eclipse/viatra/solver/language/ui/syntaxcoloring/SolverSemanticTextAttributeProvider.xtend b/Application/org.eclipse.viatra.solver.language.ui/src/org/eclipse/viatra/solver/language/ui/syntaxcoloring/SolverSemanticTextAttributeProvider.xtend new file mode 100644 index 00000000..ca74a9a2 --- /dev/null +++ b/Application/org.eclipse.viatra.solver.language.ui/src/org/eclipse/viatra/solver/language/ui/syntaxcoloring/SolverSemanticTextAttributeProvider.xtend @@ -0,0 +1,55 @@ +package org.eclipse.viatra.solver.language.ui.syntaxcoloring + +import com.google.inject.Inject +import java.util.WeakHashMap +import org.eclipse.jface.text.TextAttribute +import org.eclipse.swt.graphics.RGB +import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess +import org.eclipse.xtext.ui.editor.syntaxcoloring.IHighlightingConfiguration +import org.eclipse.xtext.ui.editor.syntaxcoloring.PreferenceStoreAccessor +import org.eclipse.xtext.ui.editor.syntaxcoloring.TextAttributeProvider +import org.eclipse.xtext.ui.editor.utils.EditorUtils +import org.eclipse.xtext.ui.editor.utils.TextStyle + +class SolverSemanticTextAttributeProvider extends TextAttributeProvider { + + val defaultTextStyle = new TextStyle + val colorID2TextAttribute = new WeakHashMap + + @Inject + new(IHighlightingConfiguration highlightingConfig, IPreferenceStoreAccess preferenceStoreAccess, + PreferenceStoreAccessor prefStoreAccessor) { + super(highlightingConfig, preferenceStoreAccess, prefStoreAccessor) + } + + override getAttribute(String id) { + if (isMetamodelElementColorID(id)) { + if (colorID2TextAttribute.containsKey(id)) { + return colorID2TextAttribute.get(id) + } else { + val style = metamodelElementTextStyle(id) + colorID2TextAttribute.put(id, style) + return style + } + } else { + super.getAttribute(id) + } + } + + private def isMetamodelElementColorID(String id) { + id.startsWith(SolverSemanticHighlightCalculator.SYMBOL_CODE) + } + + private def TextAttribute metamodelElementTextStyle(String id) { + val texts = id.split(' ') + val backgroundColor = new RGB( + Float.parseFloat(texts.get(1)), + Float.parseFloat(texts.get(2)), + Float.parseFloat(texts.get(3)) + ) + return new TextAttribute(EditorUtils.colorFromRGB(defaultTextStyle.color), + EditorUtils.colorFromRGB(backgroundColor), defaultTextStyle.style, + EditorUtils.fontFromFontData(defaultTextStyle.getFontData())); + } + +} diff --git a/Application/org.eclipse.viatra.solver.language.ui/src/org/eclipse/viatra/solver/language/validation/SolverLanguageValidator.xtend b/Application/org.eclipse.viatra.solver.language.ui/src/org/eclipse/viatra/solver/language/validation/SolverLanguageValidator.xtend new file mode 100644 index 00000000..a7ff7252 --- /dev/null +++ b/Application/org.eclipse.viatra.solver.language.ui/src/org/eclipse/viatra/solver/language/validation/SolverLanguageValidator.xtend @@ -0,0 +1,25 @@ +/* + * generated by Xtext 2.18.0.M3 + */ +package org.eclipse.viatra.solver.language.validation + + +/** + * This class contains custom validation rules. + * + * See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#validation + */ +class SolverLanguageValidator extends AbstractSolverLanguageValidator { + +// public static val INVALID_NAME = 'invalidName' +// +// @Check +// def checkGreetingStartsWithCapital(Greeting greeting) { +// if (!Character.isUpperCase(greeting.name.charAt(0))) { +// warning('Name should start with a capital', +// SolverLanguagePackage.Literals.GREETING__NAME, +// INVALID_NAME) +// } +// } + +} -- cgit v1.2.3-70-g09d2