Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix MetaModelica highlighting #38

Merged
merged 4 commits into from
Mar 13, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
89 changes: 88 additions & 1 deletion syntaxes/metamodelica.tmGrammar.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,27 @@ fileTypes:
name: MetaModelica

patterns:
# Comments
- begin: /\*
end: \*/
name: comment.block
- match: (//).*$\n?
name: comment.line

# Constants
- match: \b(true|false)\b
name: constant.language
- match: \b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)\b
name: constant.numeric

# Storage
- match: \b(Real|Integer|Boolean|String|enumeration|type)\b
name: storage.type
## Variability Prefix
- match: \b(parameter|constant)\b
name: storage.modifier
- match: \b(replaceable|redeclare|import)\b
name: storage.modifier
- begin: \b(list<|Option<|tuple<)\b
end: '>'
name: storage.type
Expand All @@ -17,8 +37,75 @@ patterns:
name: string.quoted.double

# Keywords
- match: \b(for|if|when|while|then|loop|end if|end when|end for|end while|else|elsewhen|break|return|each|elseif|input|output)\b
name: keyword.control
- match: \b(and|or|not)\b
name: keyword.control
- match: <|<\=|>|>\=|\=\=|<>
name: keyword.operator.comparison
- match: \+|\-|\.\+|\.\-|\*|\.\*|/|\./|\^
name: keyword.operator.arithmetic
- match: \=|\:\=
name: keyword.operator.assignment
- match: \b(algorithm|equation|protected|public|end|external|in)\b
name: keyword
- match: \b(matchcontinue|match|local|case|try|end matchcontinue|end match|end try)\b
name: keyword.control

- include: source.modelica
# Support
- match: \b(acos|asin|atan|atan2|cos|cosh|exp|log|log10|sin|sinh|tan|tanh|abs|sign|sqrt|max|min|product|sum)\b
name: support.function.mathematical
- match: \b(scalar|vector|matrix|identity|diagonal|zeros|ones|fill|linspace|transpose|outerProduct|symmetric|cross|skew)\b
name: support.function.array
- match: \b(ceil|div|fill|floor|integer|max|min|mod|rem|pre|noEvent|change|edge|initial|terminal|reinit|sample|smooth|terminate)\b
name: support.function.event
- match: \b(connect|der|inStream|actualStream|semiLinear|spatialDistribution|getInstanceName|homotopy|delay|assert|ndims|size|cardinality|isPresent)\b
name: support.function.special
- match: \b(extends|partial|within)\b
name: support.type

# Class Type
- begin: \b(record|type|package|function|uniontype)\s+(\w+)\s*((?<!\\)"([^"]*|\\")*(?<!\\)")?
beginCaptures:
1:
name: keyword
2:
name: entity.name.type
3:
name: comment.line
end: \b(end)\s+(\2)\s*;
endCaptures:
1:
name: keyword
2:
name: entity.name.type
patterns:
- include: "source.metamodelica"

# Function calls
- match: \b([\w|\.]+)\b\(
name: entity.name.function

# Annotations
- begin: \b(annotation)\b
beginCaptures:
- name: keyword
end: \)\s*;

# Strings
- match: (?<![=+]\s*)((?<!\\)"([^"]*|\\")*(?<!\\)")\s*;
captures:
1:
name: comment.line
- begin: \"
end: \"
name: string.quoted.double
patterns:
- include: '#escapes'

repository:
escapes:
match: '\\(x\h{2}|[0-2][0-7]{0,2}|3[0-6][0-7]|37[0-7]?|[4-7][0-7]?|.)'
name: constant.character.escape

scopeName: source.metamodelica
7 changes: 6 additions & 1 deletion syntaxes/modelica.tmGrammar.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
fileTypes:
- mo
name: Modelica

patterns:
# Comments
- begin: /\*
Expand Down Expand Up @@ -34,7 +35,7 @@ patterns:
name: keyword.operator.arithmetic
- match: \=|\:\=
name: keyword.operator.assignment
- match: \b(algorithm|equation|initial algorithm|initial equation|protected|public|end|pure|impure|external|encapsulated|in|inner|operator|outer)\b
- match: \b(algorithm|equation|protected|public|end|external|in)\b
name: keyword

# Support
Expand Down Expand Up @@ -67,6 +68,10 @@ patterns:
patterns:
- include: "source.modelica"

# Function calls
- match: \b([\w|\.]+)\b\(
name: entity.name.function

# Annotations
- begin: \b(annotation)\b
beginCaptures:
Expand Down
49 changes: 49 additions & 0 deletions test/metamodelica/function.test.mo
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
// SYNTAX TEST "source.metamodelica" "Function"

function myMetaModelicaFunction
//<-- source.metamodelica keyword
// ^^^^^^^^^^^^^^^^^^^^^^ source.metamodelica entity.name.type
input list<Real> x;
//^^^^^ source.metamodelica keyword.control
// ^^^^^^^^^^ source.metamodelica storage.type
output list<Integer> y = {};
//^^^^^^ source.metamodelica keyword.control
// ^^^^^^^^^^^^^ storage.type
// ^ source.metamodelica keyword.operator.assignment
algorithm
//<-- source.metamodelica keyword
_ := match x
// ^^ source.metamodelica keyword.operator.assignment
// ^^^^^ keyword.control
local
// ^^^^^ keyword.control
Real yi;
// ^^^^ source.metamodelica storage.type
case {} algorithm
// ^^^^ keyword.control
// ^^^^^^^^^ source.metamodelica keyword
Error.addMessage(Error.INTERNAL_ERROR,{getInstanceName() + " failed."});
// ^^^^^^^^^^^^^^^^ source.metamodelica entity.name.function
// ^^^^^^^^^^^^^^^ source.metamodelica support.function.special
// ^^^^^^^^^^ source.metamodelica string.quoted.double
then ();
// ^^^^ source.metamodelica keyword.control
else algorithm
// ^^^^ source.metamodelica keyword.control
// ^^^^^^^^^ source.metamodelica keyword
for xi in x loop
// ^^^ source.metamodelica keyword.control
// ^^ source.metamodelica keyword
// ^^^^ source.metamodelica keyword.control
y := xi::y;
// ^^ source.metamodelica keyword.operator.assignment
end for;
// ^^^^^^^ source.metamodelica keyword.control
then ();
// ^^^^ source.metamodelica keyword.control
end match;
//^^^ source.metamodelica keyword
// ^^^^ source.metamodelica keyword.control
end myMetaModelicaFunction;
//<--- source.metamodelica keyword
// ^^^^^^^^^^^^^^^^^^^^^^ source.metamodelica entity.name.type
8 changes: 4 additions & 4 deletions test/modelica/Class.test.mo
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
// SYNTAX TEST "source.modelica" "Class"

model MyModel
//<---keyword
// ^^^^^^^ entity.name.type
//<--- source.modelica keyword
// ^^^^^^^ source.modelica entity.name.type
end MyModel;
//<---keyword
// ^^^^^^^ entity.name.type
//<--- source.modelica keyword
// ^^^^^^^ source.modelica entity.name.type
31 changes: 17 additions & 14 deletions test/modelica/Comments.test.mo
Original file line number Diff line number Diff line change
@@ -1,27 +1,30 @@
// SYNTAX TEST "source.modelica" "Comments"

model M "Documentation"
// ^^^^^^^^^^^^^^^ comment.line
// ^^^^^^^^^^^^^^^ source.modelica comment.line
Real x "Variable \"x\"";
// ^^^^^^^^^^^^ comment.line
// ^^^^^^^^^^^^^^^^ source.modelica comment.line
Real y = 1.0 "Variable y";
// ^^^^^^^^^^^^ comment.line
// ^^^^^^^^^^^^ source.modelica comment.line
String z1 = "hello" "Variable z1";
// ^^^^^^^^^^^^^ comment.line
// ^^^^^^^^^^^^^ source.modelica comment.line
String z2 = "hello";
// ^^^^^^^ string.quoted.double
// ^^^^^^^ source.modelica string.quoted.double
Foo foo(x=1) "Variable foo";
// ^^^^^^^^^^^^^^ comment.line
// ^^^ source.modelica entity.name.function
// ^^^^^^^^^^^^^^ source.modelica comment.line
Real a = foo("hello") "Function foo";
// ^^^^^^^ string.quoted.double
// ^^^^^^^^^^^^^^ comment.line
// ^^^ source.modelica entity.name.function
// ^^^^^^^ source.modelica string.quoted.double
// ^^^^^^^^^^^^^^ source.modelica comment.line
Real b = bar("hello");
// ^^^^^^^ string.quoted.double
// ^^^ source.modelica entity.name.function
// ^^^^^^^ source.modelica string.quoted.double
String v = "a" + "b" "Variable v";
// ^^^ string.quoted.double
// ^^^ string.quoted.double
// ^^^^^^^^^^^^ comment.line
// ^^^ source.modelica string.quoted.double
// ^^^ source.modelica string.quoted.double
// ^^^^^^^^^^^^ source.modelica comment.line
String w = "a" + "b";
// ^^^ string.quoted.double
// ^^^ string.quoted.double
// ^^^ source.modelica string.quoted.double
// ^^^ source.modelica string.quoted.double
end M;
32 changes: 32 additions & 0 deletions test/susan/codegen.test.tpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// SYNTAX TEST "source.susan" "Example someTemplateFunction"

template someTemplateFunction(Text message, Context context, builtin.SourceInfo info)
//<--- source.susan keyword
// ^^^^^^^^^^^^^^^^^^^^^ source.susan entity.name.function
::=
//<-- source.susan keyword.control
match context
//^^^^^ source.susan keyword.control
case FUNCTION_CONTEXT(__) then
//^^^^ source.susan keyword.control
// ^^^^^^^^^^^^^^^^ source.susan entity.name.function
// ^^^^ source.susan keyword.control
<<
void foo() {
FILE_INFO info = {<%infoArgs(info)%>};
printf("<%message%>\"\n");
}
>>
// ^^ source.susan string.interpolated keyword
else
//^^^^ source.susan keyword.control
<<
void foo() {
printf("Unknown context\n");
printf("<%message%>\n");
}
>>
// ^^ source.susan string.interpolated keyword
end someTemplateFunction;
//<-- source.susan keyword
// ^^^^^^^^^^^^^^^^^^^^ source.susan entity.name.function