From f3adfaebe4e9085e6433ad3ff4543888651d82bf Mon Sep 17 00:00:00 2001
From: Drake53 <49623303+Drake53@users.noreply.github.com>
Date: Sat, 1 Nov 2025 10:26:20 +0100
Subject: [PATCH 01/53] Apply core JASS library rewrite from vjass branch
This commit brings in the complete Roslyn-style syntax tree architecture
for JASS from the vjass branch. This is a major architectural upgrade that
provides:
- Immutable syntax trees with full trivia support (whitespace, comments)
- Strongly-typed syntax kinds (447+ JassSyntaxKind values)
- Complete tree navigation (GetChild*/GetDescendant* methods)
- Code formatting via NormalizeWhitespace()
- Fluent builder API for programmatic code generation
- Enhanced parser with better error handling
- Performance optimizations
Key changes:
- New base classes: JassSyntaxNode, JassSyntaxToken, JassSyntaxTrivia
- Parser refactored from Parser/ to JassParser/ directory
- Converted from interfaces (IExpressionSyntax, etc.) to base classes
- Added normalizer system for code formatting
- Added syntax rewriter for code transformations
- Updated all renderers and renamers
Note: This introduces build errors due to missing War3Net.CodeAnalysis
changes that will be applied in the next commit.
---
.../Builders/JassCompilationUnitBuilder.cs | 96 +++
.../JassFunctionDeclarationBuilder.cs | 32 +
.../Builders/JassGlobalsDeclarationBuilder.cs | 43 ++
.../Builders/JassIfStatementBuilder.cs | 92 +++
.../Builders/JassLoopStatementBuilder.cs | 34 ++
.../JassStatementListSyntaxBuilder.cs | 99 ++++
.../Builders/JassSyntaxBuilder.cs | 51 ++
.../BinaryOperatorTypeExtensions.cs | 37 --
.../Extensions/ExpressionSyntaxExtensions.cs | 106 ----
.../Extensions/ImmutableArrayExtensions.cs | 80 +++
.../JassCompilationUnitSyntaxExtensions.cs} | 10 +-
.../JassExpressionSyntaxExtensions.cs | 209 +++++++
...istOrEmptyParameterListSyntaxExtensions.cs | 33 ++
...ensions.cs => JassSyntaxNodeExtensions.cs} | 10 +-
.../Extensions/JassSyntaxTokenExtensions.cs | 164 +++++
.../Extensions/JassTypeSyntaxExtensions.cs | 32 +
...riableOrArrayDeclaratorSyntaxExtensions.cs | 48 ++
.../Extensions/ObjectExtensions.cs | 37 ++
.../Extensions/ParserExtensions.cs | 48 +-
.../SeparatedSyntaxListExtensions.cs | 120 ++++
.../Extensions/SyntaxNodeExtensions.cs | 193 ++++++
.../Extensions/TypeExtensions.cs | 32 +-
.../Extensions/UnaryOperatorTypeExtensions.cs | 28 -
src/War3Net.CodeAnalysis.Jass/JassParser.cs | 273 ++++-----
.../JassParser/ArgumentListParser.cs | 33 ++
.../JassParser/BinaryOperatorParser.cs | 109 ++++
.../JassParser/CallStatementParser.cs | 36 ++
.../CharacterLiteralExpressionParser.cs | 17 +-
.../JassParser/CompilationUnitParser.cs | 35 ++
.../JassParser/DebugStatementParser.cs | 40 ++
.../DecimalLiteralExpressionParser.cs | 10 +-
.../JassParser/ElementAccessClauseParser.cs | 33 ++
.../ElseIfClauseDeclaratorParser.cs | 34 ++
.../JassParser/EqualsValueClauseParser.cs | 31 +
.../JassParser/ExitStatementParser.cs | 33 ++
.../JassParser/ExpressionParser.cs | 68 +++
.../FourCCLiteralExpressionParser.cs | 11 +-
.../JassParser/FunctionDeclarationParser.cs | 37 ++
.../JassParser/FunctionDeclaratorParser.cs | 42 ++
.../GlobalConstantDeclarationParser.cs | 39 ++
.../JassParser/GlobalDeclarationParser.cs | 27 +
.../GlobalVariableDeclarationParser.cs | 29 +
.../JassParser/GlobalsDeclarationParser.cs | 35 ++
.../HexadecimalLiteralExpressionParser.cs | 29 +
.../IdentifierNameParser.cs | 17 +-
.../JassParser/IfClauseDeclaratorParser.cs | 34 ++
.../JassParser/IfStatementParser.cs | 45 ++
...LocalVariableDeclarationStatementParser.cs | 33 ++
.../JassParser/LoopStatementParser.cs | 35 ++
.../NativeFunctionDeclarationParser.cs | 42 ++
.../OctalLiteralExpressionParser.cs | 10 +-
.../JassParser/ParameterListParser.cs | 41 ++
.../{Parser => JassParser}/ParameterParser.cs | 9 +-
.../ParenthesizedExpressionParser.cs | 33 ++
.../JassParser/RealLiteralExpressionParser.cs | 32 +
.../JassParser/ReturnClauseParser.cs | 31 +
.../JassParser/ReturnStatementParser.cs | 33 ++
.../JassParser/SetStatementParser.cs | 39 ++
.../JassParser/StatementParser.cs | 54 ++
.../StringLiteralExpressionParser.cs | 17 +-
.../JassParser/SyntaxTriviaListParser.cs | 63 ++
.../JassParser/SyntaxTriviaParser.cs | 50 ++
.../JassParser/TopLevelDeclarationParser.cs | 41 ++
.../JassParser/TypeDeclarationParser.cs | 38 ++
.../JassParser/TypeParser.cs | 51 ++
.../JassParser/UnaryOperatorParser.cs | 46 ++
.../VariableOrArrayDeclaratorParser.cs | 47 ++
src/War3Net.CodeAnalysis.Jass/JassRenamer.cs | 10 +-
src/War3Net.CodeAnalysis.Jass/JassRenderer.cs | 16 +-
src/War3Net.CodeAnalysis.Jass/JassSymbol.cs | 69 ++-
.../JassSyntaxFactory.cs | 122 ++--
.../JassSyntaxFacts.cs | 18 +-
.../JassSyntaxKind.cs | 447 ++++++++++++++
.../JassSyntaxKindFacts.cs | 340 +++++++++++
.../JassSyntaxNormalizer.cs | 52 ++
.../Normalizer/ArgumentListNormalizer.cs | 24 +
.../Normalizer/ArrayDeclaratorNormalizer.cs | 24 +
.../Normalizer/BinaryExpressionNormalizer.cs | 24 +
.../Normalizer/CallStatementNormalizer.cs | 26 +
.../Normalizer/CompilationUnitNormalizer.cs | 30 +
.../Normalizer/DebugStatementNormalizer.cs | 24 +
.../ElementAccessClauseNormalizer.cs | 32 +
.../ElementAccessExpressionNormalizer.cs | 24 +
.../Normalizer/ElseClauseNormalizer.cs | 32 +
.../ElseIfClauseDeclaratorNormalizer.cs | 24 +
.../Normalizer/ElseIfClauseNormalizer.cs | 24 +
.../EmptyParameterListNormalizer.cs | 24 +
.../Normalizer/EqualsValueClauseNormalizer.cs | 32 +
.../Normalizer/ExitStatementNormalizer.cs | 26 +
.../FunctionDeclarationNormalizer.cs | 24 +
.../FunctionDeclaratorNormalizer.cs | 27 +
.../FunctionReferenceExpressionNormalizer.cs | 24 +
.../GlobalConstantDeclarationNormalizer.cs | 26 +
.../GlobalVariableDeclarationNormalizer.cs | 26 +
.../GlobalsDeclarationNormalizer.cs | 24 +
.../Normalizer/IdentifierNameNormalizer.cs | 44 ++
.../IfClauseDeclaratorNormalizer.cs | 24 +
.../Normalizer/IfClauseNormalizer.cs | 24 +
.../Normalizer/IfStatementNormalizer.cs | 24 +
.../InvocationExpressionNormalizer.cs | 24 +
.../Normalizer/LiteralExpressionNormalizer.cs | 24 +
...lVariableDeclarationStatementNormalizer.cs | 26 +
.../Normalizer/LoopStatementNormalizer.cs | 24 +
.../NativeFunctionDeclarationNormalizer.cs | 26 +
.../Normalizer/ParameterListNormalizer.cs | 24 +
.../Normalizer/ParameterNormalizer.cs | 24 +
.../ParenthesizedExpressionNormalizer.cs | 24 +
.../Normalizer/PredefinedTypeNormalizer.cs | 24 +
.../Normalizer/ReturnClauseNormalizer.cs | 24 +
.../Normalizer/ReturnStatementNormalizer.cs | 26 +
.../Normalizer/SetStatementNormalizer.cs | 26 +
.../Normalizer/SyntaxTokenNormalizer.cs | 116 ++++
.../Normalizer/SyntaxTriviaListNormalizer.cs | 202 +++++++
.../Normalizer/TypeDeclarationNormalizer.cs | 26 +
.../Normalizer/UnaryExpressionNormalizer.cs | 24 +
.../VariableDeclaratorNormalizer.cs | 24 +
.../Parser/ArgumentListParser.cs | 26 -
.../Parser/ArrayReferenceExpressionParser.cs | 28 -
.../Parser/BinaryOperatorParser.cs | 95 ---
.../Parser/BooleanLiteralExpressionParser.cs | 22 -
.../Parser/CallStatementParser.cs | 26 -
.../Parser/CommentParser.cs | 28 -
.../Parser/CompilationUnitParser.cs | 30 -
.../Parser/ConstantDeclarationParser.cs | 31 -
.../Parser/DebugCustomScriptActionParser.cs | 34 --
.../Parser/DebugStatementParser.cs | 35 --
.../Parser/DeclarationLineParser.cs | 35 --
.../Parser/DeclarationParser.cs | 37 --
.../Parser/ElseClauseParser.cs | 26 -
.../Parser/ElseCustomScriptActionParser.cs | 21 -
.../Parser/ElseIfClauseParser.cs | 30 -
.../Parser/ElseIfCustomScriptActionParser.cs | 24 -
.../Parser/EmptyParser.cs | 29 -
.../EndFunctionCustomScriptActionParser.cs | 21 -
.../EndGlobalsCustomScriptActionParser.cs | 21 -
.../Parser/EndIfCustomScriptActionParser.cs | 21 -
.../Parser/EndLoopCustomScriptActionParser.cs | 21 -
.../Parser/EndOfLineParser.cs | 21 -
.../Parser/EqualsValueClauseParser.cs | 24 -
.../Parser/ExitStatementParser.cs | 24 -
.../Parser/ExpressionParser.cs | 62 --
.../FunctionCustomScriptActionParser.cs | 24 -
.../Parser/FunctionDeclarationParser.cs | 30 -
.../Parser/FunctionDeclaratorParser.cs | 31 -
.../FunctionReferenceExpressionParser.cs | 25 -
.../Parser/GlobalDeclarationListParser.cs | 27 -
.../Parser/GlobalDeclarationParser.cs | 31 -
.../Parser/GlobalLineParser.cs | 33 --
.../Parser/GlobalsCustomScriptActionParser.cs | 21 -
.../HexadecimalLiteralExpressionParser.cs | 25 -
.../Parser/IfCustomScriptActionParser.cs | 24 -
.../Parser/IfStatementParser.cs | 35 --
.../Parser/InvocationExpressionParser.cs | 27 -
...LocalVariableDeclarationStatementParser.cs | 24 -
.../Parser/LoopCustomScriptActionParser.cs | 21 -
.../Parser/LoopStatementParser.cs | 26 -
.../Parser/NativeFunctionDeclarationParser.cs | 26 -
.../Parser/NewLineParser.cs | 23 -
.../Parser/NullLiteralExpressionParser.cs | 22 -
.../Parser/ParameterListParser.cs | 26 -
.../Parser/ParenthesizedExpressionParser.cs | 25 -
.../Parser/RealLiteralExpressionParser.cs | 36 --
.../Parser/ReturnStatementParser.cs | 24 -
.../Parser/SetStatementParser.cs | 31 -
.../Parser/StatementLineParser.cs | 52 --
.../Parser/StatementListParser.cs | 26 -
.../Parser/StatementParser.cs | 54 --
.../Parser/TypeDeclarationParser.cs | 26 -
.../Parser/TypeParser.cs | 33 --
.../Parser/UnaryOperatorParser.cs | 41 --
.../Parser/VariableDeclarationParser.cs | 28 -
.../Parser/VariableDeclaratorParser.cs | 36 --
.../VariableReferenceExpressionParser.cs | 23 -
.../Parser/WhitespaceParser.cs | 21 -
.../Parsers/IdentifierExpressionParser.cs | 147 +++++
.../Renamer/ArgumentListRenamer.cs | 54 +-
.../Renamer/ArrayDeclaratorRenamer.cs | 3 +-
.../ArrayReferenceExpressionRenamer.cs | 32 -
.../Renamer/BinaryExpressionRenamer.cs | 4 +-
.../Renamer/CallStatementRenamer.cs | 23 +-
.../Renamer/CompilationUnitRenamer.cs | 44 +-
.../Renamer/DebugStatementRenamer.cs | 7 +-
.../Renamer/DeclarationRenamer.cs | 4 +-
.../Renamer/ElementAccessClauseRenamer.cs | 33 ++
.../Renamer/ElementAccessExpressionRenamer.cs | 32 +
.../Renamer/ElseClauseRenamer.cs | 7 +-
.../Renamer/ElseIfClauseDeclaratorRenamer.cs | 32 +
.../Renamer/ElseIfClauseListRenamer.cs | 52 ++
.../Renamer/ElseIfClauseRenamer.cs | 8 +-
.../Renamer/EqualsValueClauseRenamer.cs | 5 +-
.../Renamer/ExitStatementRenamer.cs | 7 +-
.../Renamer/ExpressionRenamer.cs | 6 +-
.../Renamer/FunctionDeclarationRenamer.cs | 12 +-
.../Renamer/FunctionDeclaratorRenamer.cs | 4 +-
.../FunctionReferenceExpressionRenamer.cs | 7 +-
.../GlobalConstantDeclarationRenamer.cs | 34 ++
.../Renamer/GlobalDeclarationListRenamer.cs | 45 --
.../Renamer/GlobalDeclarationRenamer.cs | 21 +-
.../GlobalVariableDeclarationRenamer.cs | 28 +
.../Renamer/GlobalsDeclarationRenamer.cs | 56 ++
.../Renamer/IdentifierNameRenamer.cs | 30 +-
.../Renamer/IfClauseDeclaratorRenamer.cs | 32 +
.../Renamer/IfClauseRenamer.cs | 32 +
.../Renamer/IfStatementRenamer.cs | 32 +-
.../Renamer/InvocationExpressionRenamer.cs | 6 +-
...ocalVariableDeclarationStatementRenamer.cs | 12 +-
.../Renamer/LoopStatementRenamer.cs | 10 +-
.../NativeFunctionDeclarationRenamer.cs | 12 +-
.../Renamer/ParenthesizedExpressionRenamer.cs | 8 +-
.../Renamer/ReturnStatementRenamer.cs | 7 +-
.../Renamer/SetStatementRenamer.cs | 7 +-
.../Renamer/StatementListRenamer.cs | 45 +-
.../Renamer/StatementRenamer.cs | 2 +-
.../Renamer/SyntaxTokenRenamer.cs | 56 ++
.../Renamer/UnaryExpressionRenamer.cs | 4 +-
.../Renamer/VariableDeclaratorRenamer.cs | 13 +-
.../VariableOrArrayDeclaratorRenamer.cs | 27 +
.../VariableReferenceExpressionRenamer.cs | 28 -
.../Renderer/ArgumentListRenderer.cs | 17 +-
.../Renderer/ArrayDeclaratorRenderer.cs | 4 +-
.../ArrayReferenceExpressionRenderer.cs | 22 -
.../Renderer/BinaryExpressionRenderer.cs | 5 +-
.../Renderer/CallStatementRenderer.cs | 7 +-
.../Renderer/CompilationUnitRenderer.cs | 3 +-
.../Renderer/DebugStatementRenderer.cs | 3 +-
.../DecimalLiteralExpressionRenderer.cs | 19 -
.../Renderer/DeclarationLineRenderer.cs | 31 -
.../Renderer/ElementAccessClauseRenderer.cs | 21 +
....cs => ElementAccessExpressionRenderer.cs} | 8 +-
.../Renderer/ElseClauseRenderer.cs | 4 +-
...r.cs => ElseIfClauseDeclaratorRenderer.cs} | 11 +-
.../Renderer/ElseIfClauseRenderer.cs | 6 +-
.../ElseIfCustomScriptActionRenderer.cs | 23 -
.../Renderer/EmptyParameterListRenderer.cs | 21 +
.../EndFunctionCustomScriptActionRenderer.cs | 20 -
.../EndGlobalsCustomScriptActionRenderer.cs | 20 -
.../Renderer/EqualsValueClauseRenderer.cs | 3 +-
.../Renderer/ExitStatementRenderer.cs | 3 +-
.../Renderer/ExpressionRenderer.cs | 16 +-
.../FourCCLiteralExpressionRenderer.cs | 19 -
.../FunctionCustomScriptActionRenderer.cs | 21 -
.../Renderer/FunctionDeclarationRenderer.cs | 6 +-
.../Renderer/FunctionDeclaratorRenderer.cs | 14 +-
.../FunctionReferenceExpressionRenderer.cs | 3 +-
.../GlobalConstantDeclarationRenderer.cs | 25 +
.../Renderer/GlobalDeclarationRenderer.cs | 12 +-
...s => GlobalVariableDeclarationRenderer.cs} | 7 +-
.../GlobalsCustomScriptActionRenderer.cs | 20 -
...derer.cs => GlobalsDeclarationRenderer.cs} | 11 +-
.../HexadecimalLiteralExpressionRenderer.cs | 19 -
.../Renderer/IdentifierNameRenderer.cs | 2 +-
.../Renderer/IfClauseDeclaratorRenderer.cs | 23 +
...tActionRenderer.cs => IfClauseRenderer.cs} | 9 +-
.../Renderer/IfCustomScriptActionRenderer.cs | 22 -
.../Renderer/IfStatementRenderer.cs | 9 +-
.../Renderer/InvocationExpressionRenderer.cs | 4 +-
...nderer.cs => LiteralExpressionRenderer.cs} | 5 +-
...calVariableDeclarationStatementRenderer.cs | 3 +-
.../Renderer/LoopStatementRenderer.cs | 6 +-
.../NativeFunctionDeclarationRenderer.cs | 15 +-
.../Renderer/NullLiteralExpressionRenderer.cs | 19 -
.../OctalLiteralExpressionRenderer.cs | 19 -
...ameterListOrEmptyParameterListRenderer.cs} | 12 +-
.../Renderer/ParameterListRenderer.cs | 21 +-
.../Renderer/ParameterRenderer.cs | 2 +-
.../ParenthesizedExpressionRenderer.cs | 4 +-
...tRenderer.cs => PredefinedTypeRenderer.cs} | 6 +-
.../Renderer/RealLiteralExpressionRenderer.cs | 19 -
...ionRenderer.cs => ReturnClauseRenderer.cs} | 8 +-
.../Renderer/ReturnStatementRenderer.cs | 9 +-
.../Renderer/SetStatementRenderer.cs | 11 +-
.../Renderer/StatementLineRenderer.cs | 40 --
.../Renderer/StatementListRenderer.cs | 7 +-
.../Renderer/StatementRenderer.cs | 4 +-
.../StringLiteralExpressionRenderer.cs | 19 -
...tionRenderer.cs => SyntaxTokenRenderer.cs} | 9 +-
...enderer.cs => SyntaxTriviaListRenderer.cs} | 9 +-
.../Renderer/SyntaxTriviaRenderer.cs | 57 ++
...erer.cs => TopLevelDeclarationRenderer.cs} | 9 +-
.../Renderer/TypeDeclarationRenderer.cs | 7 +-
.../Renderer/TypeRenderer.cs | 10 +-
.../Renderer/UnaryExpressionRenderer.cs | 10 +-
.../Renderer/VariableDeclaratorRenderer.cs | 17 +-
.../VariableOrArrayDeclaratorRenderer.cs | 27 +
.../Syntax/BinaryOperatorType.cs | 25 -
.../Syntax/IDeclarationLineSyntax.cs | 15 -
.../Syntax/IExpressionSyntax.cs | 15 -
.../Syntax/IGlobalDeclarationSyntax.cs | 15 -
.../Syntax/IGlobalLineSyntax.cs | 15 -
.../Syntax/IInvocationSyntax.cs | 16 -
.../Syntax/IMemberDeclarationSyntax.cs | 15 -
.../Syntax/IScopedDeclarationSyntax.cs | 15 -
.../Syntax/IScopedGlobalDeclarationSyntax.cs | 15 -
.../Syntax/IStatementLineSyntax.cs | 15 -
.../Syntax/IStatementSyntax.cs | 15 -
.../Syntax/ITopLevelDeclarationSyntax.cs | 15 -
.../Syntax/IVariableDeclaratorSyntax.cs | 18 -
.../Syntax/JassArgumentListSyntax.cs | 121 +++-
.../Syntax/JassArrayDeclaratorSyntax.cs | 120 +++-
.../JassArrayReferenceExpressionSyntax.cs | 31 -
.../Syntax/JassBinaryExpressionSyntax.cs | 123 +++-
.../JassBooleanLiteralExpressionSyntax.cs | 30 -
.../Syntax/JassCallStatementSyntax.cs | 123 +++-
.../JassCharacterLiteralExpressionSyntax.cs | 27 -
.../Syntax/JassCommentSyntax.cs | 77 ---
.../Syntax/JassCompilationUnitSyntax.cs | 102 +++-
.../Syntax/JassDebugCustomScriptAction.cs | 29 -
.../Syntax/JassDebugStatementSyntax.cs | 93 ++-
.../JassDecimalLiteralExpressionSyntax.cs | 29 -
.../Syntax/JassElementAccessClauseSyntax.cs | 121 ++++
.../JassElementAccessExpressionSyntax.cs | 123 ++++
.../Syntax/JassElseClauseSyntax.cs | 106 +++-
.../Syntax/JassElseCustomScriptAction.cs | 22 -
.../JassElseIfClauseDeclaratorSyntax.cs | 121 ++++
.../Syntax/JassElseIfClauseSyntax.cs | 128 +++-
.../Syntax/JassElseIfCustomScriptAction.cs | 27 -
.../Syntax/JassEmptyParameterListSyntax.cs | 99 ++++
.../Syntax/JassEmptySyntax.cs | 38 --
.../JassEndFunctionCustomScriptAction.cs | 22 -
.../JassEndGlobalsCustomScriptAction.cs | 22 -
.../Syntax/JassEndIfCustomScriptAction.cs | 22 -
.../Syntax/JassEndLoopCustomScriptAction.cs | 22 -
.../Syntax/JassEqualsValueClauseSyntax.cs | 95 ++-
.../Syntax/JassExitStatementSyntax.cs | 93 ++-
.../Syntax/JassExpressionSyntax.cs | 16 +
.../JassFourCCLiteralExpressionSyntax.cs | 29 -
.../Syntax/JassFunctionCustomScriptAction.cs | 27 -
.../Syntax/JassFunctionDeclarationSyntax.cs | 132 ++++-
.../Syntax/JassFunctionDeclaratorSyntax.cs | 191 +++++-
.../JassFunctionReferenceExpressionSyntax.cs | 93 ++-
.../JassGlobalConstantDeclarationSyntax.cs | 162 +++++
.../Syntax/JassGlobalDeclarationListSyntax.cs | 30 -
.../Syntax/JassGlobalDeclarationSyntax.cs | 23 +-
.../JassGlobalVariableDeclarationSyntax.cs | 91 +++
.../Syntax/JassGlobalsCustomScriptAction.cs | 22 -
.../Syntax/JassGlobalsDeclarationSyntax.cs | 124 ++++
.../JassHexadecimalLiteralExpressionSyntax.cs | 29 -
.../Syntax/JassIdentifierNameSyntax.cs | 72 ++-
.../Syntax/JassIfClauseDeclaratorSyntax.cs | 121 ++++
.../Syntax/JassIfClauseSyntax.cs | 137 +++++
.../Syntax/JassIfCustomScriptAction.cs | 27 -
.../Syntax/JassIfStatementSyntax.cs | 176 +++++-
.../Syntax/JassInvocationExpressionSyntax.cs | 110 +++-
.../Syntax/JassLiteralExpressionSyntax.cs | 83 +++
...LocalVariableDeclarationStatementSyntax.cs | 93 ++-
.../Syntax/JassLoopCustomScriptAction.cs | 22 -
.../Syntax/JassLoopStatementSyntax.cs | 111 +++-
.../JassNativeFunctionDeclarationSyntax.cs | 189 +++++-
.../Syntax/JassNullLiteralExpressionSyntax.cs | 22 -
.../JassOctalLiteralExpressionSyntax.cs | 29 -
...ParameterListOrEmptyParameterListSyntax.cs | 16 +
.../Syntax/JassParameterListSyntax.cs | 105 +++-
.../Syntax/JassParameterSyntax.cs | 108 +++-
.../JassParenthesizedExpressionSyntax.cs | 106 +++-
.../Syntax/JassPredefinedTypeSyntax.cs | 91 +++
.../Syntax/JassRealLiteralExpressionSyntax.cs | 69 ---
.../Syntax/JassReturnClauseSyntax.cs | 108 ++++
.../Syntax/JassReturnStatementSyntax.cs | 120 +++-
.../Syntax/JassSetStatementSyntax.cs | 171 +++++-
.../Syntax/JassStatementListSyntax.cs | 31 -
.../Syntax/JassStatementSyntax.cs | 16 +
.../JassStringLiteralExpressionSyntax.cs | 29 -
.../Syntax/JassSyntaxNode.cs | 49 ++
.../Syntax/JassSyntaxNodeOrToken.cs | 139 +++++
.../Syntax/JassSyntaxToken.cs | 63 ++
.../Syntax/JassSyntaxTrivia.cs | 45 ++
.../Syntax/JassSyntaxTriviaList.cs | 37 ++
.../Syntax/JassTopLevelDeclarationSyntax.cs | 16 +
.../Syntax/JassTypeDeclarationSyntax.cs | 134 ++++-
.../Syntax/JassTypeSyntax.cs | 27 +-
.../Syntax/JassUnaryExpressionSyntax.cs | 97 ++-
.../Syntax/JassVariableDeclaratorSyntax.cs | 161 ++++-
.../JassVariableOrArrayDeclaratorSyntax.cs | 16 +
.../JassVariableReferenceExpressionSyntax.cs | 27 -
.../Syntax/UnaryOperatorType.cs | 16 -
.../SyntaxFactory/ArgumentListFactory.cs | 29 +-
.../SyntaxFactory/ArrayDeclaratorFactory.cs | 56 ++
.../ArrayReferenceExpressionFactory.cs | 21 -
.../SyntaxFactory/BinaryExpressionFactory.cs | 94 ++-
.../SyntaxFactory/CallStatementFactory.cs | 52 +-
.../SyntaxFactory/CompilationUnitFactory.cs | 28 +-
.../SyntaxFactory/DebugStatementFactory.cs | 36 ++
.../ElementAccessClauseFactory.cs | 33 ++
.../ElementAccessExpressionFactory.cs | 42 ++
.../SyntaxFactory/ElseClauseFactory.cs | 47 ++
.../ElseIfClauseDeclaratorFactory.cs | 33 ++
.../SyntaxFactory/ElseIfClauseFactory.cs | 59 ++
.../SyntaxFactory/EqualsValueClauseFactory.cs | 30 +
.../SyntaxFactory/ExitStatementFactory.cs | 15 +-
.../FourCCLiteralExpressionFactory.cs | 20 -
.../FunctionDeclarationFactory.cs | 33 +-
.../FunctionDeclaratorFactory.cs | 549 ++++++++++++++++-
.../FunctionReferenceExpressionFactory.cs | 20 +-
.../GlobalConstantDeclarationFactory.cs | 97 +++
.../SyntaxFactory/GlobalDeclarationFactory.cs | 39 --
.../GlobalVariableDeclarationFactory.cs | 155 +++++
.../GlobalsDeclarationFactory.cs | 52 ++
.../SyntaxFactory/IdentifierNameFactory.cs | 46 ++
.../IfClauseDeclaratorFactory.cs | 33 ++
.../SyntaxFactory/IfClauseFactory.cs | 59 ++
.../SyntaxFactory/IfStatementFactory.cs | 156 ++++-
.../InvocationExpressionFactory.cs | 36 +-
.../SyntaxFactory/LiteralExpressionFactory.cs | 77 ++-
...ocalVariableDeclarationStatementFactory.cs | 157 ++++-
.../SyntaxFactory/LoopStatementFactory.cs | 36 +-
.../NativeFunctionDeclarationFactory.cs | 561 ++++++++++++++++++
.../SyntaxFactory/ParameterFactory.cs | 21 +
.../SyntaxFactory/ParameterListFactory.cs | 46 +-
.../ParenthesizedExpressionFactory.cs | 18 +-
.../SyntaxFactory/PredefinedTypeFactory.cs | 27 +
.../SyntaxFactory/ReturnClauseFactory.cs | 30 +
.../SyntaxFactory/ReturnStatementFactory.cs | 30 +
.../SeparatedSyntaxListFactory.cs | 58 ++
.../SyntaxFactory/SetStatementFactory.cs | 103 +++-
.../SyntaxFactory/StatementListFactory.cs | 27 -
.../SyntaxFactory/SyntaxTokenFactory.cs | 83 +++
.../SyntaxFactory/SyntaxTriviaFactory.cs | 81 +++
.../SyntaxFactory/SyntaxTriviaListFactory.cs | 49 ++
.../SyntaxFactory/TypeDeclarationFactory.cs | 62 ++
.../SyntaxFactory/UnaryExpressionFactory.cs | 28 +-
.../VariableDeclaratorFactory.cs | 110 ++++
.../SyntaxFactory/VariableReferenceFactory.cs | 19 -
.../SyntaxRewriter/ArgumentListRewriter.cs | 35 ++
.../SyntaxRewriter/ArrayDeclaratorRewriter.cs | 35 ++
.../BinaryExpressionRewriter.cs | 35 ++
.../SyntaxRewriter/CallStatementRewriter.cs | 35 ++
.../SyntaxRewriter/CompilationUnitRewriter.cs | 33 ++
.../SyntaxRewriter/DebugStatementRewriter.cs | 33 ++
.../SyntaxRewriter/DeclarationListRewriter.cs | 51 ++
.../ElementAccessClauseRewriter.cs | 43 ++
.../ElementAccessExpressionRewriter.cs | 33 ++
.../SyntaxRewriter/ElseClauseRewriter.cs | 41 ++
.../ElseIfClauseDeclaratorRewriter.cs | 35 ++
.../ElseIfClauseListRewriter.cs | 50 ++
.../SyntaxRewriter/ElseIfClauseRewriter.cs | 33 ++
.../EmptyParameterListRewriter.cs | 33 ++
.../EqualsValueClauseRewriter.cs | 41 ++
.../SyntaxRewriter/ExitStatementRewriter.cs | 33 ++
.../SyntaxRewriter/ExpressionRewriter.cs | 40 ++
.../FunctionDeclarationRewriter.cs | 35 ++
.../FunctionDeclaratorRewriter.cs | 39 ++
.../FunctionReferenceExpressionRewriter.cs | 33 ++
.../GlobalConstantDeclarationRewriter.cs | 37 ++
.../GlobalDeclarationListRewriter.cs | 50 ++
.../GlobalDeclarationRewriter.cs | 26 +
.../GlobalVariableDeclarationRewriter.cs | 29 +
.../GlobalsDeclarationRewriter.cs | 35 ++
.../SyntaxRewriter/IdentifierNameRewriter.cs | 59 ++
.../IfClauseDeclaratorRewriter.cs | 35 ++
.../SyntaxRewriter/IfClauseRewriter.cs | 33 ++
.../SyntaxRewriter/IfStatementRewriter.cs | 37 ++
.../InvocationExpressionRewriter.cs | 33 ++
.../LiteralExpressionRewriter.cs | 29 +
...calVariableDeclarationStatementRewriter.cs | 33 ++
.../SyntaxRewriter/LoopStatementRewriter.cs | 35 ++
.../NativeFunctionDeclarationRewriter.cs | 39 ++
...rameterListOrEmptyParameterListRewriter.cs | 26 +
.../SyntaxRewriter/ParameterListRewriter.cs | 33 ++
.../SyntaxRewriter/ParameterRewriter.cs | 33 ++
.../ParenthesizedExpressionRewriter.cs | 35 ++
.../SyntaxRewriter/PredefinedTypeRewriter.cs | 29 +
.../SyntaxRewriter/ReturnClauseRewriter.cs | 33 ++
.../SyntaxRewriter/ReturnStatementRewriter.cs | 33 ++
.../SeparatedArgumentListRewriter.cs | 70 +++
.../SeparatedParameterListRewriter.cs | 70 +++
.../SyntaxRewriter/SetStatementRewriter.cs | 37 ++
.../SyntaxRewriter/StatementListRewriter.cs | 50 ++
.../SyntaxRewriter/StatementRewriter.cs | 32 +
.../SyntaxRewriter/SyntaxTokenRewriter.cs | 43 ++
.../SyntaxTriviaListRewriter.cs | 32 +
.../TopLevelDeclarationRewriter.cs | 28 +
.../SyntaxRewriter/TypeDeclarationRewriter.cs | 37 ++
.../SyntaxRewriter/TypeRewriter.cs | 26 +
.../SyntaxRewriter/UnaryExpressionRewriter.cs | 33 ++
.../VariableDeclaratorRewriter.cs | 35 ++
.../VariableOrArrayDeclaratorRewriter.cs | 26 +
.../War3Net.CodeAnalysis.Jass.csproj | 4 +-
477 files changed, 16574 insertions(+), 4604 deletions(-)
create mode 100644 src/War3Net.CodeAnalysis.Jass/Builders/JassCompilationUnitBuilder.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Builders/JassFunctionDeclarationBuilder.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Builders/JassGlobalsDeclarationBuilder.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Builders/JassIfStatementBuilder.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Builders/JassLoopStatementBuilder.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Builders/JassStatementListSyntaxBuilder.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Builders/JassSyntaxBuilder.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Extensions/BinaryOperatorTypeExtensions.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Extensions/ExpressionSyntaxExtensions.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Extensions/ImmutableArrayExtensions.cs
rename src/War3Net.CodeAnalysis.Jass/{Renderer/VariableReferenceExpressionRenderer.cs => Extensions/JassCompilationUnitSyntaxExtensions.cs} (50%)
create mode 100644 src/War3Net.CodeAnalysis.Jass/Extensions/JassExpressionSyntaxExtensions.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Extensions/JassParameterListOrEmptyParameterListSyntaxExtensions.cs
rename src/War3Net.CodeAnalysis.Jass/Extensions/{EquatableExtensions.cs => JassSyntaxNodeExtensions.cs} (51%)
create mode 100644 src/War3Net.CodeAnalysis.Jass/Extensions/JassSyntaxTokenExtensions.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Extensions/JassTypeSyntaxExtensions.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Extensions/JassVariableOrArrayDeclaratorSyntaxExtensions.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Extensions/ObjectExtensions.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Extensions/SeparatedSyntaxListExtensions.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Extensions/SyntaxNodeExtensions.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Extensions/UnaryOperatorTypeExtensions.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassParser/ArgumentListParser.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassParser/BinaryOperatorParser.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassParser/CallStatementParser.cs
rename src/War3Net.CodeAnalysis.Jass/{Parser => JassParser}/CharacterLiteralExpressionParser.cs (53%)
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassParser/CompilationUnitParser.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassParser/DebugStatementParser.cs
rename src/War3Net.CodeAnalysis.Jass/{Parser => JassParser}/DecimalLiteralExpressionParser.cs (52%)
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassParser/ElementAccessClauseParser.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassParser/ElseIfClauseDeclaratorParser.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassParser/EqualsValueClauseParser.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassParser/ExitStatementParser.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassParser/ExpressionParser.cs
rename src/War3Net.CodeAnalysis.Jass/{Parser => JassParser}/FourCCLiteralExpressionParser.cs (51%)
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassParser/FunctionDeclarationParser.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassParser/FunctionDeclaratorParser.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassParser/GlobalConstantDeclarationParser.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassParser/GlobalDeclarationParser.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassParser/GlobalVariableDeclarationParser.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassParser/GlobalsDeclarationParser.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassParser/HexadecimalLiteralExpressionParser.cs
rename src/War3Net.CodeAnalysis.Jass/{Parser => JassParser}/IdentifierNameParser.cs (59%)
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassParser/IfClauseDeclaratorParser.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassParser/IfStatementParser.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassParser/LocalVariableDeclarationStatementParser.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassParser/LoopStatementParser.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassParser/NativeFunctionDeclarationParser.cs
rename src/War3Net.CodeAnalysis.Jass/{Parser => JassParser}/OctalLiteralExpressionParser.cs (53%)
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassParser/ParameterListParser.cs
rename src/War3Net.CodeAnalysis.Jass/{Parser => JassParser}/ParameterParser.cs (65%)
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassParser/ParenthesizedExpressionParser.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassParser/RealLiteralExpressionParser.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassParser/ReturnClauseParser.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassParser/ReturnStatementParser.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassParser/SetStatementParser.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassParser/StatementParser.cs
rename src/War3Net.CodeAnalysis.Jass/{Parser => JassParser}/StringLiteralExpressionParser.cs (55%)
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassParser/SyntaxTriviaListParser.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassParser/SyntaxTriviaParser.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassParser/TopLevelDeclarationParser.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassParser/TypeDeclarationParser.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassParser/TypeParser.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassParser/UnaryOperatorParser.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassParser/VariableOrArrayDeclaratorParser.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassSyntaxKind.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassSyntaxKindFacts.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/JassSyntaxNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/ArgumentListNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/ArrayDeclaratorNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/BinaryExpressionNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/CallStatementNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/CompilationUnitNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/DebugStatementNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/ElementAccessClauseNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/ElementAccessExpressionNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/ElseClauseNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/ElseIfClauseDeclaratorNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/ElseIfClauseNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/EmptyParameterListNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/EqualsValueClauseNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/ExitStatementNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/FunctionDeclarationNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/FunctionDeclaratorNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/FunctionReferenceExpressionNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/GlobalConstantDeclarationNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/GlobalVariableDeclarationNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/GlobalsDeclarationNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/IdentifierNameNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/IfClauseDeclaratorNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/IfClauseNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/IfStatementNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/InvocationExpressionNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/LiteralExpressionNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/LocalVariableDeclarationStatementNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/LoopStatementNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/NativeFunctionDeclarationNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/ParameterListNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/ParameterNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/ParenthesizedExpressionNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/PredefinedTypeNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/ReturnClauseNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/ReturnStatementNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/SetStatementNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/SyntaxTokenNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/SyntaxTriviaListNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/TypeDeclarationNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/UnaryExpressionNormalizer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Normalizer/VariableDeclaratorNormalizer.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/ArgumentListParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/ArrayReferenceExpressionParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/BinaryOperatorParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/BooleanLiteralExpressionParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/CallStatementParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/CommentParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/CompilationUnitParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/ConstantDeclarationParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/DebugCustomScriptActionParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/DebugStatementParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/DeclarationLineParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/DeclarationParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/ElseClauseParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/ElseCustomScriptActionParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/ElseIfClauseParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/ElseIfCustomScriptActionParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/EmptyParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/EndFunctionCustomScriptActionParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/EndGlobalsCustomScriptActionParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/EndIfCustomScriptActionParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/EndLoopCustomScriptActionParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/EndOfLineParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/EqualsValueClauseParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/ExitStatementParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/ExpressionParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/FunctionCustomScriptActionParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/FunctionDeclarationParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/FunctionDeclaratorParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/FunctionReferenceExpressionParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/GlobalDeclarationListParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/GlobalDeclarationParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/GlobalLineParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/GlobalsCustomScriptActionParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/HexadecimalLiteralExpressionParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/IfCustomScriptActionParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/IfStatementParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/InvocationExpressionParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/LocalVariableDeclarationStatementParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/LoopCustomScriptActionParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/LoopStatementParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/NativeFunctionDeclarationParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/NewLineParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/NullLiteralExpressionParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/ParameterListParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/ParenthesizedExpressionParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/RealLiteralExpressionParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/ReturnStatementParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/SetStatementParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/StatementLineParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/StatementListParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/StatementParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/TypeDeclarationParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/TypeParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/UnaryOperatorParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/VariableDeclarationParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/VariableDeclaratorParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/VariableReferenceExpressionParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Parser/WhitespaceParser.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Parsers/IdentifierExpressionParser.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Renamer/ArrayReferenceExpressionRenamer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Renamer/ElementAccessClauseRenamer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Renamer/ElementAccessExpressionRenamer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Renamer/ElseIfClauseDeclaratorRenamer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Renamer/ElseIfClauseListRenamer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Renamer/GlobalConstantDeclarationRenamer.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Renamer/GlobalDeclarationListRenamer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Renamer/GlobalVariableDeclarationRenamer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Renamer/GlobalsDeclarationRenamer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Renamer/IfClauseDeclaratorRenamer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Renamer/IfClauseRenamer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Renamer/SyntaxTokenRenamer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Renamer/VariableOrArrayDeclaratorRenamer.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Renamer/VariableReferenceExpressionRenamer.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Renderer/ArrayReferenceExpressionRenderer.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Renderer/DecimalLiteralExpressionRenderer.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Renderer/DeclarationLineRenderer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Renderer/ElementAccessClauseRenderer.cs
rename src/War3Net.CodeAnalysis.Jass/Renderer/{EndIfCustomScriptActionRenderer.cs => ElementAccessExpressionRenderer.cs} (61%)
rename src/War3Net.CodeAnalysis.Jass/Renderer/{LoopCustomScriptActionRenderer.cs => ElseIfClauseDeclaratorRenderer.cs} (55%)
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Renderer/ElseIfCustomScriptActionRenderer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Renderer/EmptyParameterListRenderer.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Renderer/EndFunctionCustomScriptActionRenderer.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Renderer/EndGlobalsCustomScriptActionRenderer.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Renderer/FourCCLiteralExpressionRenderer.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Renderer/FunctionCustomScriptActionRenderer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Renderer/GlobalConstantDeclarationRenderer.cs
rename src/War3Net.CodeAnalysis.Jass/Renderer/{EndLoopCustomScriptActionRenderer.cs => GlobalVariableDeclarationRenderer.cs} (67%)
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Renderer/GlobalsCustomScriptActionRenderer.cs
rename src/War3Net.CodeAnalysis.Jass/Renderer/{GlobalDeclarationListRenderer.cs => GlobalsDeclarationRenderer.cs} (61%)
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Renderer/HexadecimalLiteralExpressionRenderer.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Renderer/IfClauseDeclaratorRenderer.cs
rename src/War3Net.CodeAnalysis.Jass/Renderer/{ElseCustomScriptActionRenderer.cs => IfClauseRenderer.cs} (69%)
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Renderer/IfCustomScriptActionRenderer.cs
rename src/War3Net.CodeAnalysis.Jass/Renderer/{EmptyRenderer.cs => LiteralExpressionRenderer.cs} (69%)
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Renderer/NullLiteralExpressionRenderer.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Renderer/OctalLiteralExpressionRenderer.cs
rename src/War3Net.CodeAnalysis.Jass/Renderer/{GlobalLineRenderer.cs => ParameterListOrEmptyParameterListRenderer.cs} (52%)
rename src/War3Net.CodeAnalysis.Jass/Renderer/{CommentRenderer.cs => PredefinedTypeRenderer.cs} (71%)
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Renderer/RealLiteralExpressionRenderer.cs
rename src/War3Net.CodeAnalysis.Jass/Renderer/{CharacterLiteralExpressionRenderer.cs => ReturnClauseRenderer.cs} (63%)
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Renderer/StatementLineRenderer.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Renderer/StringLiteralExpressionRenderer.cs
rename src/War3Net.CodeAnalysis.Jass/Renderer/{DebugCustomScriptActionRenderer.cs => SyntaxTokenRenderer.cs} (63%)
rename src/War3Net.CodeAnalysis.Jass/Renderer/{BooleanLiteralExpressionRenderer.cs => SyntaxTriviaListRenderer.cs} (64%)
create mode 100644 src/War3Net.CodeAnalysis.Jass/Renderer/SyntaxTriviaRenderer.cs
rename src/War3Net.CodeAnalysis.Jass/Renderer/{DeclarationRenderer.cs => TopLevelDeclarationRenderer.cs} (65%)
create mode 100644 src/War3Net.CodeAnalysis.Jass/Renderer/VariableOrArrayDeclaratorRenderer.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/BinaryOperatorType.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/IDeclarationLineSyntax.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/IExpressionSyntax.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/IGlobalDeclarationSyntax.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/IGlobalLineSyntax.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/IInvocationSyntax.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/IMemberDeclarationSyntax.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/IScopedDeclarationSyntax.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/IScopedGlobalDeclarationSyntax.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/IStatementLineSyntax.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/IStatementSyntax.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/ITopLevelDeclarationSyntax.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/IVariableDeclaratorSyntax.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassArrayReferenceExpressionSyntax.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassBooleanLiteralExpressionSyntax.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassCharacterLiteralExpressionSyntax.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassCommentSyntax.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassDebugCustomScriptAction.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassDecimalLiteralExpressionSyntax.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassElementAccessClauseSyntax.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassElementAccessExpressionSyntax.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassElseCustomScriptAction.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassElseIfClauseDeclaratorSyntax.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassElseIfCustomScriptAction.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassEmptyParameterListSyntax.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassEmptySyntax.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassEndFunctionCustomScriptAction.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassEndGlobalsCustomScriptAction.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassEndIfCustomScriptAction.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassEndLoopCustomScriptAction.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassExpressionSyntax.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassFourCCLiteralExpressionSyntax.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassFunctionCustomScriptAction.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassGlobalConstantDeclarationSyntax.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassGlobalDeclarationListSyntax.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassGlobalVariableDeclarationSyntax.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassGlobalsCustomScriptAction.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassGlobalsDeclarationSyntax.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassHexadecimalLiteralExpressionSyntax.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassIfClauseDeclaratorSyntax.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassIfClauseSyntax.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassIfCustomScriptAction.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassLiteralExpressionSyntax.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassLoopCustomScriptAction.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassNullLiteralExpressionSyntax.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassOctalLiteralExpressionSyntax.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassParameterListOrEmptyParameterListSyntax.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassPredefinedTypeSyntax.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassRealLiteralExpressionSyntax.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassReturnClauseSyntax.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassStatementListSyntax.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassStatementSyntax.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassStringLiteralExpressionSyntax.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassSyntaxNode.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassSyntaxNodeOrToken.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassSyntaxToken.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassSyntaxTrivia.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassSyntaxTriviaList.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassTopLevelDeclarationSyntax.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassVariableOrArrayDeclaratorSyntax.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/JassVariableReferenceExpressionSyntax.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/Syntax/UnaryOperatorType.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxFactory/ArrayDeclaratorFactory.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxFactory/ArrayReferenceExpressionFactory.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxFactory/DebugStatementFactory.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxFactory/ElementAccessClauseFactory.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxFactory/ElementAccessExpressionFactory.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxFactory/ElseClauseFactory.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxFactory/ElseIfClauseDeclaratorFactory.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxFactory/ElseIfClauseFactory.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxFactory/EqualsValueClauseFactory.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxFactory/FourCCLiteralExpressionFactory.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxFactory/GlobalConstantDeclarationFactory.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxFactory/GlobalDeclarationFactory.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxFactory/GlobalVariableDeclarationFactory.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxFactory/GlobalsDeclarationFactory.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxFactory/IdentifierNameFactory.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxFactory/IfClauseDeclaratorFactory.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxFactory/IfClauseFactory.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxFactory/NativeFunctionDeclarationFactory.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxFactory/PredefinedTypeFactory.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxFactory/ReturnClauseFactory.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxFactory/ReturnStatementFactory.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxFactory/SeparatedSyntaxListFactory.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxFactory/StatementListFactory.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxFactory/SyntaxTokenFactory.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxFactory/SyntaxTriviaFactory.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxFactory/SyntaxTriviaListFactory.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxFactory/TypeDeclarationFactory.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxFactory/VariableDeclaratorFactory.cs
delete mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxFactory/VariableReferenceFactory.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/ArgumentListRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/ArrayDeclaratorRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/BinaryExpressionRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/CallStatementRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/CompilationUnitRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/DebugStatementRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/DeclarationListRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/ElementAccessClauseRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/ElementAccessExpressionRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/ElseClauseRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/ElseIfClauseDeclaratorRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/ElseIfClauseListRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/ElseIfClauseRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/EmptyParameterListRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/EqualsValueClauseRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/ExitStatementRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/ExpressionRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/FunctionDeclarationRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/FunctionDeclaratorRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/FunctionReferenceExpressionRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/GlobalConstantDeclarationRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/GlobalDeclarationListRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/GlobalDeclarationRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/GlobalVariableDeclarationRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/GlobalsDeclarationRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/IdentifierNameRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/IfClauseDeclaratorRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/IfClauseRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/IfStatementRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/InvocationExpressionRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/LiteralExpressionRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/LocalVariableDeclarationStatementRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/LoopStatementRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/NativeFunctionDeclarationRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/ParameterListOrEmptyParameterListRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/ParameterListRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/ParameterRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/ParenthesizedExpressionRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/PredefinedTypeRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/ReturnClauseRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/ReturnStatementRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/SeparatedArgumentListRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/SeparatedParameterListRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/SetStatementRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/StatementListRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/StatementRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/SyntaxTokenRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/SyntaxTriviaListRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/TopLevelDeclarationRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/TypeDeclarationRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/TypeRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/UnaryExpressionRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/VariableDeclaratorRewriter.cs
create mode 100644 src/War3Net.CodeAnalysis.Jass/SyntaxRewriter/VariableOrArrayDeclaratorRewriter.cs
diff --git a/src/War3Net.CodeAnalysis.Jass/Builders/JassCompilationUnitBuilder.cs b/src/War3Net.CodeAnalysis.Jass/Builders/JassCompilationUnitBuilder.cs
new file mode 100644
index 00000000..6f067dd0
--- /dev/null
+++ b/src/War3Net.CodeAnalysis.Jass/Builders/JassCompilationUnitBuilder.cs
@@ -0,0 +1,96 @@
+// ------------------------------------------------------------------------------
+//
+// Licensed under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// ------------------------------------------------------------------------------
+
+using System;
+using System.Collections.Immutable;
+
+using War3Net.CodeAnalysis.Jass.Extensions;
+using War3Net.CodeAnalysis.Jass.Syntax;
+
+namespace War3Net.CodeAnalysis.Jass.Builders
+{
+ public class JassCompilationUnitBuilder : JassSyntaxBuilder
+ {
+ private readonly ImmutableArray.Builder _declarationsBuilder;
+
+ private JassGlobalsDeclarationBuilder? _globalsDeclarationBuilder;
+ private JassFunctionDeclarationBuilder? _functionDeclarationBuilder;
+
+ public JassCompilationUnitBuilder()
+ {
+ _declarationsBuilder = ImmutableArray.CreateBuilder();
+ }
+
+ public JassCompilationUnitSyntax ToCompilationUnit(JassSyntaxToken endOfFileToken)
+ {
+ if (_globalsDeclarationBuilder is not null ||
+ _functionDeclarationBuilder is not null)
+ {
+ throw new InvalidOperationException();
+ }
+
+ JassSyntaxFactory.ThrowHelper.ThrowIfInvalidToken(endOfFileToken, JassSyntaxKind.EndOfFileToken);
+
+ return new JassCompilationUnitSyntax(
+ _declarationsBuilder.ToImmutable(),
+ endOfFileToken.PrependLeadingTrivia(BuildTriviaList()));
+ }
+
+ public void AddDeclaration(JassTopLevelDeclarationSyntax declaration)
+ {
+ if (_globalsDeclarationBuilder is not null ||
+ _functionDeclarationBuilder is not null)
+ {
+ throw new InvalidOperationException();
+ }
+
+ _declarationsBuilder.Add(declaration.PrependLeadingTrivia(BuildTriviaList()));
+ }
+
+ public JassGlobalsDeclarationBuilder BeginGlobalsDeclaration(JassSyntaxToken globalsToken)
+ {
+ if (_functionDeclarationBuilder is not null)
+ {
+ throw new InvalidOperationException();
+ }
+
+ return _globalsDeclarationBuilder = new JassGlobalsDeclarationBuilder(globalsToken.PrependLeadingTrivia(BuildTriviaList()));
+ }
+
+ public void EndGlobalsDeclaration(JassSyntaxToken endGlobalsToken)
+ {
+ if (_globalsDeclarationBuilder is null)
+ {
+ throw new InvalidOperationException();
+ }
+
+ _declarationsBuilder.Add(_globalsDeclarationBuilder.ToGlobalsDeclaration(endGlobalsToken));
+ _globalsDeclarationBuilder = null;
+ }
+
+ public JassFunctionDeclarationBuilder BeginFunctionDeclaration(JassFunctionDeclaratorSyntax functionDeclarator)
+ {
+ if (_globalsDeclarationBuilder is not null)
+ {
+ throw new InvalidOperationException();
+ }
+
+ return _functionDeclarationBuilder = new JassFunctionDeclarationBuilder(functionDeclarator.PrependLeadingTrivia(BuildTriviaList()));
+ }
+
+ public void EndFunctionDeclaration(JassSyntaxToken endFunctionToken)
+ {
+ if (_functionDeclarationBuilder is null)
+ {
+ throw new InvalidOperationException();
+ }
+
+ _declarationsBuilder.Add(_functionDeclarationBuilder.ToFunctionDeclaration(endFunctionToken));
+ _functionDeclarationBuilder = null;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/Builders/JassFunctionDeclarationBuilder.cs b/src/War3Net.CodeAnalysis.Jass/Builders/JassFunctionDeclarationBuilder.cs
new file mode 100644
index 00000000..8a1ece30
--- /dev/null
+++ b/src/War3Net.CodeAnalysis.Jass/Builders/JassFunctionDeclarationBuilder.cs
@@ -0,0 +1,32 @@
+// ------------------------------------------------------------------------------
+//
+// Licensed under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// ------------------------------------------------------------------------------
+
+using War3Net.CodeAnalysis.Jass.Extensions;
+using War3Net.CodeAnalysis.Jass.Syntax;
+
+namespace War3Net.CodeAnalysis.Jass.Builders
+{
+ public class JassFunctionDeclarationBuilder : JassStatementListSyntaxBuilder
+ {
+ private readonly JassFunctionDeclaratorSyntax _functionDeclarator;
+
+ public JassFunctionDeclarationBuilder(JassFunctionDeclaratorSyntax functionDeclarator)
+ {
+ _functionDeclarator = functionDeclarator;
+ }
+
+ public JassFunctionDeclarationSyntax ToFunctionDeclaration(JassSyntaxToken endFunctionToken)
+ {
+ JassSyntaxFactory.ThrowHelper.ThrowIfInvalidToken(endFunctionToken, JassSyntaxKind.EndFunctionKeyword);
+
+ return new JassFunctionDeclarationSyntax(
+ _functionDeclarator,
+ BuildStatementList(),
+ endFunctionToken.PrependLeadingTrivia(BuildTriviaList()));
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/Builders/JassGlobalsDeclarationBuilder.cs b/src/War3Net.CodeAnalysis.Jass/Builders/JassGlobalsDeclarationBuilder.cs
new file mode 100644
index 00000000..db826265
--- /dev/null
+++ b/src/War3Net.CodeAnalysis.Jass/Builders/JassGlobalsDeclarationBuilder.cs
@@ -0,0 +1,43 @@
+// ------------------------------------------------------------------------------
+//
+// Licensed under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// ------------------------------------------------------------------------------
+
+using System.Collections.Immutable;
+
+using War3Net.CodeAnalysis.Jass.Extensions;
+using War3Net.CodeAnalysis.Jass.Syntax;
+
+namespace War3Net.CodeAnalysis.Jass.Builders
+{
+ public class JassGlobalsDeclarationBuilder : JassSyntaxBuilder
+ {
+ private readonly ImmutableArray.Builder _globalDeclarationsBuilder;
+ private readonly JassSyntaxToken _globalsToken;
+
+ public JassGlobalsDeclarationBuilder(JassSyntaxToken globalsToken)
+ {
+ JassSyntaxFactory.ThrowHelper.ThrowIfInvalidToken(globalsToken, JassSyntaxKind.GlobalsKeyword);
+
+ _globalDeclarationsBuilder = ImmutableArray.CreateBuilder();
+ _globalsToken = globalsToken;
+ }
+
+ public JassGlobalsDeclarationSyntax ToGlobalsDeclaration(JassSyntaxToken endGlobalsToken)
+ {
+ JassSyntaxFactory.ThrowHelper.ThrowIfInvalidToken(endGlobalsToken, JassSyntaxKind.EndGlobalsKeyword);
+
+ return new JassGlobalsDeclarationSyntax(
+ _globalsToken,
+ _globalDeclarationsBuilder.ToImmutable(),
+ endGlobalsToken.PrependLeadingTrivia(BuildTriviaList()));
+ }
+
+ public void AddGlobalDeclaration(JassGlobalDeclarationSyntax globalDeclaration)
+ {
+ _globalDeclarationsBuilder.Add(globalDeclaration.PrependLeadingTrivia(BuildTriviaList()));
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/Builders/JassIfStatementBuilder.cs b/src/War3Net.CodeAnalysis.Jass/Builders/JassIfStatementBuilder.cs
new file mode 100644
index 00000000..3205180c
--- /dev/null
+++ b/src/War3Net.CodeAnalysis.Jass/Builders/JassIfStatementBuilder.cs
@@ -0,0 +1,92 @@
+// ------------------------------------------------------------------------------
+//
+// Licensed under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// ------------------------------------------------------------------------------
+
+using System;
+using System.Collections.Immutable;
+using System.Diagnostics.CodeAnalysis;
+
+using War3Net.CodeAnalysis.Jass.Extensions;
+using War3Net.CodeAnalysis.Jass.Syntax;
+
+namespace War3Net.CodeAnalysis.Jass.Builders
+{
+ public class JassIfStatementBuilder : JassStatementListSyntaxBuilder
+ {
+ private readonly ImmutableArray.Builder _elseIfClausesBuilder;
+ private readonly JassIfClauseDeclaratorSyntax _ifClauseDeclarator;
+
+ private JassIfClauseSyntax? _ifClause;
+ private JassElseIfClauseDeclaratorSyntax? _elseIfClauseDeclarator;
+ private JassSyntaxToken? _elseToken;
+ private JassElseClauseSyntax? _elseClause;
+
+ public JassIfStatementBuilder(JassIfClauseDeclaratorSyntax ifClauseDeclarator)
+ {
+ _elseIfClausesBuilder = ImmutableArray.CreateBuilder();
+ _ifClauseDeclarator = ifClauseDeclarator;
+ }
+
+ public JassIfStatementSyntax ToIfStatement(JassSyntaxToken endIfToken)
+ {
+ JassSyntaxFactory.ThrowHelper.ThrowIfInvalidToken(endIfToken, JassSyntaxKind.EndIfKeyword);
+
+ EndCurrentClause();
+
+ return new JassIfStatementSyntax(
+ _ifClause,
+ _elseIfClausesBuilder.ToImmutable(),
+ _elseClause,
+ endIfToken);
+ }
+
+ public void BeginElseIfClause(JassElseIfClauseDeclaratorSyntax elseIfClauseDeclarator)
+ {
+ EndCurrentClause();
+ if (_elseClause is not null)
+ {
+ throw new InvalidOperationException();
+ }
+
+ _elseIfClauseDeclarator = elseIfClauseDeclarator.PrependLeadingTrivia(BuildTriviaList());
+ }
+
+ public void BeginElseClause(JassSyntaxToken elseToken)
+ {
+ JassSyntaxFactory.ThrowHelper.ThrowIfInvalidToken(elseToken, JassSyntaxKind.ElseKeyword);
+
+ EndCurrentClause();
+ if (_elseClause is not null)
+ {
+ throw new InvalidOperationException();
+ }
+
+ _elseIfClauseDeclarator = null;
+ _elseToken = elseToken.PrependLeadingTrivia(BuildTriviaList());
+ }
+
+ [MemberNotNull(nameof(_ifClause))]
+ private void EndCurrentClause()
+ {
+ if (_ifClause is null)
+ {
+ _ifClause = new JassIfClauseSyntax(_ifClauseDeclarator, BuildStatementList());
+ }
+ else if (_elseIfClauseDeclarator is not null)
+ {
+ _elseIfClausesBuilder.Add(new JassElseIfClauseSyntax(_elseIfClauseDeclarator, BuildStatementList()));
+ }
+ else if (_elseToken is not null)
+ {
+ _elseClause = new JassElseClauseSyntax(_elseToken, BuildStatementList());
+ }
+ else
+ {
+ throw new InvalidOperationException();
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/Builders/JassLoopStatementBuilder.cs b/src/War3Net.CodeAnalysis.Jass/Builders/JassLoopStatementBuilder.cs
new file mode 100644
index 00000000..f39e32f1
--- /dev/null
+++ b/src/War3Net.CodeAnalysis.Jass/Builders/JassLoopStatementBuilder.cs
@@ -0,0 +1,34 @@
+// ------------------------------------------------------------------------------
+//
+// Licensed under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// ------------------------------------------------------------------------------
+
+using War3Net.CodeAnalysis.Jass.Extensions;
+using War3Net.CodeAnalysis.Jass.Syntax;
+
+namespace War3Net.CodeAnalysis.Jass.Builders
+{
+ public class JassLoopStatementBuilder : JassStatementListSyntaxBuilder
+ {
+ private readonly JassSyntaxToken _loopToken;
+
+ public JassLoopStatementBuilder(JassSyntaxToken loopToken)
+ {
+ JassSyntaxFactory.ThrowHelper.ThrowIfInvalidToken(loopToken, JassSyntaxKind.LoopKeyword);
+
+ _loopToken = loopToken;
+ }
+
+ public JassLoopStatementSyntax ToLoopStatement(JassSyntaxToken endLoopToken)
+ {
+ JassSyntaxFactory.ThrowHelper.ThrowIfInvalidToken(endLoopToken, JassSyntaxKind.EndLoopKeyword);
+
+ return new JassLoopStatementSyntax(
+ _loopToken,
+ BuildStatementList(),
+ endLoopToken.PrependLeadingTrivia(BuildTriviaList()));
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/Builders/JassStatementListSyntaxBuilder.cs b/src/War3Net.CodeAnalysis.Jass/Builders/JassStatementListSyntaxBuilder.cs
new file mode 100644
index 00000000..ec427949
--- /dev/null
+++ b/src/War3Net.CodeAnalysis.Jass/Builders/JassStatementListSyntaxBuilder.cs
@@ -0,0 +1,99 @@
+// ------------------------------------------------------------------------------
+//
+// Licensed under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// ------------------------------------------------------------------------------
+
+using System;
+using System.Collections.Immutable;
+
+using War3Net.CodeAnalysis.Jass.Extensions;
+using War3Net.CodeAnalysis.Jass.Syntax;
+
+namespace War3Net.CodeAnalysis.Jass.Builders
+{
+ public abstract class JassStatementListSyntaxBuilder : JassSyntaxBuilder
+ {
+ private readonly ImmutableArray.Builder _statementsBuilder;
+
+ private JassIfStatementBuilder? _ifStatementBuilder;
+ private JassLoopStatementBuilder? _loopStatementBuilder;
+
+ public JassStatementListSyntaxBuilder()
+ {
+ _statementsBuilder = ImmutableArray.CreateBuilder();
+ }
+
+ public void AddStatement(JassStatementSyntax statement)
+ {
+ if (_ifStatementBuilder is not null ||
+ _loopStatementBuilder is not null)
+ {
+ throw new InvalidOperationException();
+ }
+
+ _statementsBuilder.Add(statement.PrependLeadingTrivia(BuildTriviaList()));
+ }
+
+ public JassIfStatementBuilder BeginIfStatement(JassIfClauseDeclaratorSyntax ifClauseDeclarator)
+ {
+ if (_loopStatementBuilder is not null)
+ {
+ throw new InvalidOperationException();
+ }
+
+ return _ifStatementBuilder = new JassIfStatementBuilder(ifClauseDeclarator.PrependLeadingTrivia(BuildTriviaList()));
+ }
+
+ public void EndIfStatement(JassSyntaxToken endifToken)
+ {
+ if (_ifStatementBuilder is null)
+ {
+ throw new InvalidOperationException();
+ }
+
+ _statementsBuilder.Add(_ifStatementBuilder.ToIfStatement(endifToken));
+ _ifStatementBuilder = null;
+ }
+
+ public JassLoopStatementBuilder BeginLoopStatement(JassSyntaxToken loopToken)
+ {
+ if (_ifStatementBuilder is not null)
+ {
+ throw new InvalidOperationException();
+ }
+
+ return _loopStatementBuilder = new JassLoopStatementBuilder(loopToken.PrependLeadingTrivia(BuildTriviaList()));
+ }
+
+ public void EndLoopStatement(JassSyntaxToken endLoopToken)
+ {
+ if (_loopStatementBuilder is null)
+ {
+ throw new InvalidOperationException();
+ }
+
+ _statementsBuilder.Add(_loopStatementBuilder.ToLoopStatement(endLoopToken));
+ _loopStatementBuilder = null;
+ }
+
+ protected ImmutableArray BuildStatementList()
+ {
+ if (_ifStatementBuilder is not null ||
+ _loopStatementBuilder is not null)
+ {
+ throw new InvalidOperationException();
+ }
+
+ if (_statementsBuilder.Count == 0)
+ {
+ return ImmutableArray.Empty;
+ }
+
+ var result = _statementsBuilder.ToImmutable();
+ _statementsBuilder.Clear();
+ return result;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/Builders/JassSyntaxBuilder.cs b/src/War3Net.CodeAnalysis.Jass/Builders/JassSyntaxBuilder.cs
new file mode 100644
index 00000000..93fb64ac
--- /dev/null
+++ b/src/War3Net.CodeAnalysis.Jass/Builders/JassSyntaxBuilder.cs
@@ -0,0 +1,51 @@
+// ------------------------------------------------------------------------------
+//
+// Licensed under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// ------------------------------------------------------------------------------
+
+using System.Collections.Generic;
+using System.Collections.Immutable;
+
+using War3Net.CodeAnalysis.Jass.Syntax;
+
+namespace War3Net.CodeAnalysis.Jass.Builders
+{
+ public abstract class JassSyntaxBuilder
+ {
+ private readonly ImmutableArray.Builder _triviaBuilder;
+
+ public JassSyntaxBuilder()
+ {
+ _triviaBuilder = ImmutableArray.CreateBuilder();
+ }
+
+ public void AddTrivia(JassSyntaxTrivia trivia)
+ {
+ _triviaBuilder.Add(trivia);
+ }
+
+ public void AddTrivia(params JassSyntaxTrivia[] trivia)
+ {
+ _triviaBuilder.AddRange(trivia);
+ }
+
+ public void AddTrivia(IEnumerable trivia)
+ {
+ _triviaBuilder.AddRange(trivia);
+ }
+
+ protected JassSyntaxTriviaList BuildTriviaList()
+ {
+ if (_triviaBuilder.Count == 0)
+ {
+ return JassSyntaxTriviaList.Empty;
+ }
+
+ var result = new JassSyntaxTriviaList(_triviaBuilder.ToImmutable());
+ _triviaBuilder.Clear();
+ return result;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/Extensions/BinaryOperatorTypeExtensions.cs b/src/War3Net.CodeAnalysis.Jass/Extensions/BinaryOperatorTypeExtensions.cs
deleted file mode 100644
index df09cfa6..00000000
--- a/src/War3Net.CodeAnalysis.Jass/Extensions/BinaryOperatorTypeExtensions.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-// ------------------------------------------------------------------------------
-//
-// Licensed under the MIT license.
-// See the LICENSE file in the project root for more information.
-//
-// ------------------------------------------------------------------------------
-
-using System.ComponentModel;
-
-using War3Net.CodeAnalysis.Jass.Syntax;
-
-namespace War3Net.CodeAnalysis.Jass.Extensions
-{
- public static class BinaryOperatorTypeExtensions
- {
- public static string GetSymbol(this BinaryOperatorType binaryOperator)
- {
- return binaryOperator switch
- {
- BinaryOperatorType.Add => $"{JassSymbol.PlusSign}",
- BinaryOperatorType.Subtract => $"{JassSymbol.MinusSign}",
- BinaryOperatorType.Multiplication => $"{JassSymbol.Asterisk}",
- BinaryOperatorType.Division => $"{JassSymbol.Slash}",
- BinaryOperatorType.GreaterThan => $"{JassSymbol.GreaterThanSign}",
- BinaryOperatorType.LessThan => $"{JassSymbol.LessThanSign}",
- BinaryOperatorType.Equals => $"{JassSymbol.EqualsSign}{JassSymbol.EqualsSign}",
- BinaryOperatorType.NotEquals => $"{JassSymbol.ExclamationMark}{JassSymbol.EqualsSign}",
- BinaryOperatorType.GreaterOrEqual => $"{JassSymbol.GreaterThanSign}{JassSymbol.EqualsSign}",
- BinaryOperatorType.LessOrEqual => $"{JassSymbol.LessThanSign}{JassSymbol.EqualsSign}",
- BinaryOperatorType.And => JassKeyword.And,
- BinaryOperatorType.Or => JassKeyword.Or,
-
- _ => throw new InvalidEnumArgumentException(nameof(binaryOperator), (int)binaryOperator, typeof(BinaryOperatorType)),
- };
- }
- }
-}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/Extensions/ExpressionSyntaxExtensions.cs b/src/War3Net.CodeAnalysis.Jass/Extensions/ExpressionSyntaxExtensions.cs
deleted file mode 100644
index 620a3cc1..00000000
--- a/src/War3Net.CodeAnalysis.Jass/Extensions/ExpressionSyntaxExtensions.cs
+++ /dev/null
@@ -1,106 +0,0 @@
-// ------------------------------------------------------------------------------
-//
-// Licensed under the MIT license.
-// See the LICENSE file in the project root for more information.
-//
-// ------------------------------------------------------------------------------
-
-using System;
-using System.Globalization;
-
-using War3Net.CodeAnalysis.Jass.Syntax;
-
-namespace War3Net.CodeAnalysis.Jass.Extensions
-{
- public static class ExpressionSyntaxExtensions
- {
- public static IExpressionSyntax Deparenthesize(this IExpressionSyntax expression)
- {
- while (expression is JassParenthesizedExpressionSyntax parenthesizedExpression)
- {
- expression = parenthesizedExpression.Expression;
- }
-
- return expression;
- }
-
- public static bool TryGetIntegerExpressionValue(this IExpressionSyntax expression, out int value)
- {
- switch (expression)
- {
- case JassDecimalLiteralExpressionSyntax decimalLiteralExpression:
- value = decimalLiteralExpression.Value;
- return true;
-
- case JassOctalLiteralExpressionSyntax octalLiteralExpression:
- value = octalLiteralExpression.Value;
- return true;
-
- case JassFourCCLiteralExpressionSyntax fourCCLiteralExpression:
- value = fourCCLiteralExpression.Value;
- return true;
-
- case JassUnaryExpressionSyntax unaryExpression:
- return int.TryParse(unaryExpression.ToString(), out value);
-
- case JassHexadecimalLiteralExpressionSyntax hexLiteralExpression:
- value = hexLiteralExpression.Value;
- return true;
-
- default:
- value = default;
- return false;
- }
- }
-
- public static bool TryGetPlayerIdExpressionValue(this IExpressionSyntax expression, int maxPlayerSlots, out int value)
- {
- if (expression is JassVariableReferenceExpressionSyntax variableReferenceExpression)
- {
- if (string.Equals(variableReferenceExpression.IdentifierName.Name, "PLAYER_NEUTRAL_AGGRESSIVE", StringComparison.Ordinal))
- {
- value = maxPlayerSlots;
- return true;
- }
- else if (string.Equals(variableReferenceExpression.IdentifierName.Name, "PLAYER_NEUTRAL_PASSIVE", StringComparison.Ordinal))
- {
- value = maxPlayerSlots + 3;
- return true;
- }
- else
- {
- value = default;
- return false;
- }
- }
- else
- {
- return expression.TryGetIntegerExpressionValue(out value);
- }
- }
-
- public static bool TryGetRealExpressionValue(this IExpressionSyntax expression, out float value)
- {
- if (expression.TryGetIntegerExpressionValue(out var intValue))
- {
- value = intValue;
- return true;
- }
-
- if (expression is JassRealLiteralExpressionSyntax realLiteralExpression &&
- float.TryParse(realLiteralExpression.ToString(), NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out value))
- {
- return true;
- }
-
- if (expression is JassUnaryExpressionSyntax unaryExpression &&
- float.TryParse(unaryExpression.ToString(), NumberStyles.AllowLeadingSign | NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out value))
- {
- return true;
- }
-
- value = default;
- return false;
- }
- }
-}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/Extensions/ImmutableArrayExtensions.cs b/src/War3Net.CodeAnalysis.Jass/Extensions/ImmutableArrayExtensions.cs
new file mode 100644
index 00000000..34476122
--- /dev/null
+++ b/src/War3Net.CodeAnalysis.Jass/Extensions/ImmutableArrayExtensions.cs
@@ -0,0 +1,80 @@
+// ------------------------------------------------------------------------------
+//
+// Licensed under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// ------------------------------------------------------------------------------
+
+using System.Collections.Generic;
+using System.Collections.Immutable;
+using System.IO;
+using System.Linq;
+using System.Text;
+
+using War3Net.CodeAnalysis.Jass.Syntax;
+
+namespace War3Net.CodeAnalysis.Jass.Extensions
+{
+ public static class ImmutableArrayExtensions
+ {
+ public static bool IsEquivalentTo(this ImmutableArray array, ImmutableArray other)
+ where TSyntaxNode : JassSyntaxNode
+ {
+ if (array.Length != other.Length)
+ {
+ return false;
+ }
+
+ for (var i = 0; i < array.Length; i++)
+ {
+ if (!array[i].IsEquivalentTo(other[i]))
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ public static void WriteTo(this ImmutableArray array, TextWriter writer)
+ where TSyntaxNode : JassSyntaxNode
+ {
+ for (var i = 0; i < array.Length; i++)
+ {
+ array[i].WriteTo(writer);
+ }
+ }
+
+ public static IEnumerable GetDescendantNodes(this ImmutableArray array)
+ where TSyntaxNode : JassSyntaxNode
+ {
+ return array.SelectMany(item => item.GetDescendantNodes());
+ }
+
+ public static IEnumerable GetDescendantTokens(this ImmutableArray array)
+ where TSyntaxNode : JassSyntaxNode
+ {
+ return array.SelectMany(item => item.GetDescendantTokens());
+ }
+
+ public static IEnumerable GetDescendantNodesAndTokens(this ImmutableArray array)
+ where TSyntaxNode : JassSyntaxNode
+ {
+ return array.SelectMany(item => item.GetDescendantNodesAndTokens());
+ }
+
+ internal static ImmutableArray ReplaceFirstItem(this ImmutableArray array, T newItem)
+ {
+ var builder = array.ToBuilder();
+ builder[0] = newItem;
+ return builder.ToImmutable();
+ }
+
+ internal static ImmutableArray ReplaceLastItem(this ImmutableArray array, T newItem)
+ {
+ var builder = array.ToBuilder();
+ builder[^1] = newItem;
+ return builder.ToImmutable();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/Renderer/VariableReferenceExpressionRenderer.cs b/src/War3Net.CodeAnalysis.Jass/Extensions/JassCompilationUnitSyntaxExtensions.cs
similarity index 50%
rename from src/War3Net.CodeAnalysis.Jass/Renderer/VariableReferenceExpressionRenderer.cs
rename to src/War3Net.CodeAnalysis.Jass/Extensions/JassCompilationUnitSyntaxExtensions.cs
index 8f048ec5..dc64fc7e 100644
--- a/src/War3Net.CodeAnalysis.Jass/Renderer/VariableReferenceExpressionRenderer.cs
+++ b/src/War3Net.CodeAnalysis.Jass/Extensions/JassCompilationUnitSyntaxExtensions.cs
@@ -1,5 +1,5 @@
// ------------------------------------------------------------------------------
-//
+//
// Licensed under the MIT license.
// See the LICENSE file in the project root for more information.
//
@@ -7,13 +7,13 @@
using War3Net.CodeAnalysis.Jass.Syntax;
-namespace War3Net.CodeAnalysis.Jass
+namespace War3Net.CodeAnalysis.Jass.Extensions
{
- public partial class JassRenderer
+ public static class JassCompilationUnitSyntaxExtensions
{
- public void Render(JassVariableReferenceExpressionSyntax variableReferenceExpressionSyntax)
+ public static JassCompilationUnitSyntax NormalizeWhitespace(this JassCompilationUnitSyntax compilationUnit)
{
- Render(variableReferenceExpressionSyntax.IdentifierName);
+ return new JassSyntaxNormalizer().NormalizeWhitespace(compilationUnit);
}
}
}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/Extensions/JassExpressionSyntaxExtensions.cs b/src/War3Net.CodeAnalysis.Jass/Extensions/JassExpressionSyntaxExtensions.cs
new file mode 100644
index 00000000..1183caf5
--- /dev/null
+++ b/src/War3Net.CodeAnalysis.Jass/Extensions/JassExpressionSyntaxExtensions.cs
@@ -0,0 +1,209 @@
+// ------------------------------------------------------------------------------
+//
+// Licensed under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// ------------------------------------------------------------------------------
+
+using System;
+using System.Diagnostics.CodeAnalysis;
+using System.Globalization;
+
+using War3Net.CodeAnalysis.Jass.Syntax;
+
+namespace War3Net.CodeAnalysis.Jass.Extensions
+{
+ public static class JassExpressionSyntaxExtensions
+ {
+ public static JassExpressionSyntax Deparenthesize(this JassExpressionSyntax expression)
+ {
+ while (expression is JassParenthesizedExpressionSyntax parenthesizedExpression)
+ {
+ expression = parenthesizedExpression.Expression;
+ }
+
+ return expression;
+ }
+
+ public static bool TryGetBooleanExpressionValue(this JassExpressionSyntax expression, out bool value)
+ {
+ if (expression is JassLiteralExpressionSyntax literalExpression)
+ {
+ switch (literalExpression.Token.SyntaxKind)
+ {
+ case JassSyntaxKind.TrueKeyword:
+ value = true;
+ return true;
+
+ case JassSyntaxKind.FalseKeyword:
+ value = false;
+ return true;
+ }
+ }
+
+ value = default;
+ return false;
+ }
+
+ public static bool TryGetCharacterExpressionValue(this JassExpressionSyntax expression, out char value)
+ {
+ if (expression is JassLiteralExpressionSyntax literalExpression &&
+ literalExpression.Token.SyntaxKind == JassSyntaxKind.CharacterLiteralToken)
+ {
+ value = literalExpression.Token.Text[1];
+ return true;
+ }
+
+ value = default;
+ return false;
+ }
+
+ public static bool TryGetIdentifierNameValue(this JassExpressionSyntax expression, [NotNullWhen(true)] out string? value)
+ {
+ if (expression is JassIdentifierNameSyntax identifierName)
+ {
+ value = identifierName.Token.Text;
+ return true;
+ }
+
+ value = null;
+ return false;
+ }
+
+ public static bool TryGetIntegerExpressionValue(this JassExpressionSyntax expression, out int value)
+ {
+ if (expression is JassLiteralExpressionSyntax literalExpression)
+ {
+ switch (literalExpression.Token.SyntaxKind)
+ {
+ case JassSyntaxKind.DecimalLiteralToken:
+ value = int.Parse(literalExpression.Token.Text, CultureInfo.InvariantCulture);
+ return true;
+
+ case JassSyntaxKind.HexadecimalLiteralToken:
+ value = Convert.ToInt32(literalExpression.Token.Text.StartsWith(JassSymbol.DollarChar) ? literalExpression.Token.Text[1..] : literalExpression.Token.Text[2..], 16);
+ return true;
+
+ case JassSyntaxKind.OctalLiteralToken:
+ value = Convert.ToInt32(literalExpression.Token.Text, 8);
+ return true;
+
+ case JassSyntaxKind.FourCCLiteralToken:
+ value = literalExpression.Token.Text[1..^1].FromJassRawcode();
+ return true;
+
+ default:
+ value = default;
+ return false;
+ }
+ }
+ else if (expression is JassUnaryExpressionSyntax unaryExpression)
+ {
+ switch (unaryExpression.OperatorToken.SyntaxKind)
+ {
+ case JassSyntaxKind.PlusToken:
+ return unaryExpression.Expression.TryGetIntegerExpressionValue(out value);
+
+ case JassSyntaxKind.MinusToken:
+ if (unaryExpression.Expression.TryGetIntegerExpressionValue(out var result))
+ {
+ value = -result;
+ return true;
+ }
+
+ break;
+
+ default:
+ value = default;
+ return false;
+ }
+ }
+
+ value = default;
+ return false;
+ }
+
+ public static bool TryGetPlayerIdExpressionValue(this JassExpressionSyntax expression, int maxPlayerSlots, out int value)
+ {
+ if (expression is JassIdentifierNameSyntax identifierName)
+ {
+ if (string.Equals(identifierName.Token.Text, "PLAYER_NEUTRAL_AGGRESSIVE", StringComparison.Ordinal))
+ {
+ value = maxPlayerSlots;
+ return true;
+ }
+ else if (string.Equals(identifierName.Token.Text, "PLAYER_NEUTRAL_PASSIVE", StringComparison.Ordinal))
+ {
+ value = maxPlayerSlots + 3;
+ return true;
+ }
+ else
+ {
+ value = default;
+ return false;
+ }
+ }
+ else
+ {
+ return expression.TryGetIntegerExpressionValue(out value);
+ }
+ }
+
+ public static bool TryGetRealExpressionValue(this JassExpressionSyntax expression, out float value)
+ {
+ if (expression.TryGetIntegerExpressionValue(out var intValue))
+ {
+ value = intValue;
+ return true;
+ }
+
+ if (expression is JassLiteralExpressionSyntax literalExpression &&
+ float.TryParse(literalExpression.Token.Text, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out value))
+ {
+ return true;
+ }
+
+ if (expression is JassUnaryExpressionSyntax unaryExpression &&
+ float.TryParse(unaryExpression.ToString(), NumberStyles.AllowLeadingSign | NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out value))
+ {
+ return true;
+ }
+
+ value = default;
+ return false;
+ }
+
+ public static bool TryGetStringExpressionValue(this JassExpressionSyntax expression, out string? value)
+ {
+ if (expression is JassLiteralExpressionSyntax literalExpression)
+ {
+ switch (literalExpression.Token.SyntaxKind)
+ {
+ case JassSyntaxKind.StringLiteralToken:
+ value = literalExpression.Token.Text[1..^1];
+ return true;
+
+ case JassSyntaxKind.NullKeyword:
+ value = null;
+ return true;
+ }
+ }
+
+ value = null;
+ return false;
+ }
+
+ public static bool TryGetNotNullStringExpressionValue(this JassExpressionSyntax expression, [NotNullWhen(true)] out string? value)
+ {
+ if (expression is JassLiteralExpressionSyntax literalExpression &&
+ literalExpression.Token.SyntaxKind == JassSyntaxKind.StringLiteralToken)
+ {
+ value = literalExpression.Token.Text[1..^1];
+ return true;
+ }
+
+ value = null;
+ return false;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/Extensions/JassParameterListOrEmptyParameterListSyntaxExtensions.cs b/src/War3Net.CodeAnalysis.Jass/Extensions/JassParameterListOrEmptyParameterListSyntaxExtensions.cs
new file mode 100644
index 00000000..2d06dd08
--- /dev/null
+++ b/src/War3Net.CodeAnalysis.Jass/Extensions/JassParameterListOrEmptyParameterListSyntaxExtensions.cs
@@ -0,0 +1,33 @@
+// ------------------------------------------------------------------------------
+//
+// Licensed under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// ------------------------------------------------------------------------------
+
+using System;
+using System.Collections.Immutable;
+
+using War3Net.CodeAnalysis.Jass.Syntax;
+
+namespace War3Net.CodeAnalysis.Jass.Extensions
+{
+ public static class JassParameterListOrEmptyParameterListSyntaxExtensions
+ {
+ public static ImmutableArray GetParameters(this JassParameterListOrEmptyParameterListSyntax parameterListOrEmptyParameterList)
+ {
+ if (parameterListOrEmptyParameterList is JassParameterListSyntax parameterList)
+ {
+ return parameterList.ParameterList.Items;
+ }
+ else if (parameterListOrEmptyParameterList is JassEmptyParameterListSyntax)
+ {
+ return ImmutableArray.Empty;
+ }
+ else
+ {
+ throw new ArgumentException("Unknown parameter list type.", nameof(parameterListOrEmptyParameterList));
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/Extensions/EquatableExtensions.cs b/src/War3Net.CodeAnalysis.Jass/Extensions/JassSyntaxNodeExtensions.cs
similarity index 51%
rename from src/War3Net.CodeAnalysis.Jass/Extensions/EquatableExtensions.cs
rename to src/War3Net.CodeAnalysis.Jass/Extensions/JassSyntaxNodeExtensions.cs
index 8fa626bb..cd3b1edb 100644
--- a/src/War3Net.CodeAnalysis.Jass/Extensions/EquatableExtensions.cs
+++ b/src/War3Net.CodeAnalysis.Jass/Extensions/JassSyntaxNodeExtensions.cs
@@ -1,19 +1,19 @@
// ------------------------------------------------------------------------------
-//
+//
// Licensed under the MIT license.
// See the LICENSE file in the project root for more information.
//
// ------------------------------------------------------------------------------
-using System;
+using War3Net.CodeAnalysis.Jass.Syntax;
namespace War3Net.CodeAnalysis.Jass.Extensions
{
- public static class EquatableExtensions
+ public static class JassSyntaxNodeExtensions
{
- public static bool NullableEquals(this IEquatable? objA, T? objB)
+ public static bool NullableEquivalentTo(this JassSyntaxNode? objA, JassSyntaxNode? objB)
{
- return ReferenceEquals(objA, objB) || objA?.Equals(objB) == true;
+ return ReferenceEquals(objA, objB) || objA?.IsEquivalentTo(objB) == true;
}
}
}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/Extensions/JassSyntaxTokenExtensions.cs b/src/War3Net.CodeAnalysis.Jass/Extensions/JassSyntaxTokenExtensions.cs
new file mode 100644
index 00000000..8d5327a1
--- /dev/null
+++ b/src/War3Net.CodeAnalysis.Jass/Extensions/JassSyntaxTokenExtensions.cs
@@ -0,0 +1,164 @@
+// ------------------------------------------------------------------------------
+//
+// Licensed under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// ------------------------------------------------------------------------------
+
+using System.Collections.Generic;
+using System.Collections.Immutable;
+
+using War3Net.CodeAnalysis.Jass.Syntax;
+
+namespace War3Net.CodeAnalysis.Jass.Extensions
+{
+ public static class JassSyntaxTokenExtensions
+ {
+ public static JassSyntaxToken WithLeadingTrivia(this JassSyntaxToken token, JassSyntaxTriviaList triviaList)
+ {
+ return new JassSyntaxToken(triviaList, token.SyntaxKind, token.Text, token.TrailingTrivia);
+ }
+
+ public static JassSyntaxToken WithTrailingTrivia(this JassSyntaxToken token, JassSyntaxTriviaList triviaList)
+ {
+ return new JassSyntaxToken(token.LeadingTrivia, token.SyntaxKind, token.Text, triviaList);
+ }
+
+ public static JassSyntaxToken AppendLeadingTrivia(this JassSyntaxToken token, JassSyntaxTrivia trivia)
+ {
+ return token.WithLeadingTrivia(AppendTriviaToList(token.LeadingTrivia.Trivia, trivia));
+ }
+
+ public static JassSyntaxToken AppendLeadingTrivia(this JassSyntaxToken token, JassSyntaxTriviaList triviaList)
+ {
+ return token.WithLeadingTrivia(ConcatTriviaLists(token.LeadingTrivia.Trivia, triviaList.Trivia));
+ }
+
+ public static JassSyntaxToken AppendLeadingTrivia(this JassSyntaxToken token, params JassSyntaxTrivia[] triviaList)
+ {
+ return token.WithLeadingTrivia(ConcatTriviaLists(token.LeadingTrivia.Trivia, triviaList));
+ }
+
+ public static JassSyntaxToken AppendLeadingTrivia(this JassSyntaxToken token, IEnumerable triviaList)
+ {
+ return token.WithLeadingTrivia(ConcatTriviaLists(token.LeadingTrivia.Trivia, triviaList));
+ }
+
+ public static JassSyntaxToken AppendLeadingTrivia(this JassSyntaxToken token, ImmutableArray triviaList)
+ {
+ return token.WithLeadingTrivia(ConcatTriviaLists(token.LeadingTrivia.Trivia, triviaList));
+ }
+
+ public static JassSyntaxToken PrependLeadingTrivia(this JassSyntaxToken token, JassSyntaxTrivia trivia)
+ {
+ return token.WithLeadingTrivia(PrependTriviaToList(trivia, token.LeadingTrivia.Trivia));
+ }
+
+ public static JassSyntaxToken PrependLeadingTrivia(this JassSyntaxToken token, JassSyntaxTriviaList triviaList)
+ {
+ return token.WithLeadingTrivia(ConcatTriviaLists(triviaList.Trivia, token.LeadingTrivia.Trivia));
+ }
+
+ public static JassSyntaxToken PrependLeadingTrivia(this JassSyntaxToken token, params JassSyntaxTrivia[] triviaList)
+ {
+ return token.WithLeadingTrivia(ConcatTriviaLists(triviaList, token.LeadingTrivia.Trivia));
+ }
+
+ public static JassSyntaxToken PrependLeadingTrivia(this JassSyntaxToken token, IEnumerable triviaList)
+ {
+ return token.WithLeadingTrivia(ConcatTriviaLists(triviaList, token.LeadingTrivia.Trivia));
+ }
+
+ public static JassSyntaxToken PrependLeadingTrivia(this JassSyntaxToken token, ImmutableArray triviaList)
+ {
+ return token.WithLeadingTrivia(ConcatTriviaLists(triviaList, token.LeadingTrivia.Trivia));
+ }
+
+ public static JassSyntaxToken AppendTrailingTrivia(this JassSyntaxToken token, JassSyntaxTrivia trivia)
+ {
+ return token.WithTrailingTrivia(AppendTriviaToList(token.TrailingTrivia.Trivia, trivia));
+ }
+
+ public static JassSyntaxToken AppendTrailingTrivia(this JassSyntaxToken token, JassSyntaxTriviaList triviaList)
+ {
+ return token.WithTrailingTrivia(ConcatTriviaLists(token.TrailingTrivia.Trivia, triviaList.Trivia));
+ }
+
+ public static JassSyntaxToken AppendTrailingTrivia(this JassSyntaxToken token, params JassSyntaxTrivia[] triviaList)
+ {
+ return token.WithTrailingTrivia(ConcatTriviaLists(token.TrailingTrivia.Trivia, triviaList));
+ }
+
+ public static JassSyntaxToken AppendTrailingTrivia(this JassSyntaxToken token, IEnumerable triviaList)
+ {
+ return token.WithTrailingTrivia(ConcatTriviaLists(token.TrailingTrivia.Trivia, triviaList));
+ }
+
+ public static JassSyntaxToken AppendTrailingTrivia(this JassSyntaxToken token, ImmutableArray triviaList)
+ {
+ return token.WithTrailingTrivia(ConcatTriviaLists(token.TrailingTrivia.Trivia, triviaList));
+ }
+
+ public static JassSyntaxToken PrependTrailingTrivia(this JassSyntaxToken token, JassSyntaxTrivia trivia)
+ {
+ return token.WithTrailingTrivia(PrependTriviaToList(trivia, token.TrailingTrivia.Trivia));
+ }
+
+ public static JassSyntaxToken PrependTrailingTrivia(this JassSyntaxToken token, JassSyntaxTriviaList triviaList)
+ {
+ return token.WithTrailingTrivia(ConcatTriviaLists(triviaList.Trivia, token.TrailingTrivia.Trivia));
+ }
+
+ public static JassSyntaxToken PrependTrailingTrivia(this JassSyntaxToken token, params JassSyntaxTrivia[] triviaList)
+ {
+ return token.WithTrailingTrivia(ConcatTriviaLists(triviaList, token.TrailingTrivia.Trivia));
+ }
+
+ public static JassSyntaxToken PrependTrailingTrivia(this JassSyntaxToken token, IEnumerable triviaList)
+ {
+ return token.WithTrailingTrivia(ConcatTriviaLists(triviaList, token.TrailingTrivia.Trivia));
+ }
+
+ public static JassSyntaxToken PrependTrailingTrivia(this JassSyntaxToken token, ImmutableArray triviaList)
+ {
+ return token.WithTrailingTrivia(ConcatTriviaLists(triviaList, token.TrailingTrivia.Trivia));
+ }
+
+ internal static bool NullableEquals(this JassSyntaxToken? objA, JassSyntaxToken? objB)
+ {
+ return (objA is null) == (objB is null);
+ }
+
+ private static JassSyntaxTriviaList AppendTriviaToList(ImmutableArray triviaList, JassSyntaxTrivia trivia)
+ {
+ var builder = ImmutableArray.CreateBuilder(triviaList.Length + 1);
+ builder.AddRange(triviaList);
+ builder.Add(trivia);
+ return new JassSyntaxTriviaList(builder.MoveToImmutable());
+ }
+
+ private static JassSyntaxTriviaList PrependTriviaToList(JassSyntaxTrivia trivia, ImmutableArray triviaList)
+ {
+ var builder = ImmutableArray.CreateBuilder(triviaList.Length + 1);
+ builder.Add(trivia);
+ builder.AddRange(triviaList);
+ return new JassSyntaxTriviaList(builder.MoveToImmutable());
+ }
+
+ private static JassSyntaxTriviaList ConcatTriviaLists(ImmutableArray firstList, ImmutableArray secondList)
+ {
+ var builder = ImmutableArray.CreateBuilder(firstList.Length + secondList.Length);
+ builder.AddRange(firstList);
+ builder.AddRange(secondList);
+ return new JassSyntaxTriviaList(builder.MoveToImmutable());
+ }
+
+ private static JassSyntaxTriviaList ConcatTriviaLists(IEnumerable firstList, IEnumerable secondList)
+ {
+ var builder = ImmutableArray.CreateBuilder();
+ builder.AddRange(firstList);
+ builder.AddRange(secondList);
+ return new JassSyntaxTriviaList(builder.ToImmutable());
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/Extensions/JassTypeSyntaxExtensions.cs b/src/War3Net.CodeAnalysis.Jass/Extensions/JassTypeSyntaxExtensions.cs
new file mode 100644
index 00000000..394bd979
--- /dev/null
+++ b/src/War3Net.CodeAnalysis.Jass/Extensions/JassTypeSyntaxExtensions.cs
@@ -0,0 +1,32 @@
+// ------------------------------------------------------------------------------
+//
+// Licensed under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// ------------------------------------------------------------------------------
+
+using System;
+
+using War3Net.CodeAnalysis.Jass.Syntax;
+
+namespace War3Net.CodeAnalysis.Jass.Extensions
+{
+ public static class JassTypeSyntaxExtensions
+ {
+ public static JassSyntaxToken GetToken(this JassTypeSyntax type)
+ {
+ if (type is JassIdentifierNameSyntax identifierName)
+ {
+ return identifierName.Token;
+ }
+ else if (type is JassPredefinedTypeSyntax predefinedType)
+ {
+ return predefinedType.Token;
+ }
+ else
+ {
+ throw new ArgumentException("Unknown type.", nameof(type));
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/Extensions/JassVariableOrArrayDeclaratorSyntaxExtensions.cs b/src/War3Net.CodeAnalysis.Jass/Extensions/JassVariableOrArrayDeclaratorSyntaxExtensions.cs
new file mode 100644
index 00000000..d217bb0e
--- /dev/null
+++ b/src/War3Net.CodeAnalysis.Jass/Extensions/JassVariableOrArrayDeclaratorSyntaxExtensions.cs
@@ -0,0 +1,48 @@
+// ------------------------------------------------------------------------------
+//
+// Licensed under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// ------------------------------------------------------------------------------
+
+using System;
+
+using War3Net.CodeAnalysis.Jass.Syntax;
+
+namespace War3Net.CodeAnalysis.Jass.Extensions
+{
+ public static class JassVariableOrArrayDeclaratorSyntaxExtensions
+ {
+ public static JassIdentifierNameSyntax GetIdentifierName(this JassVariableOrArrayDeclaratorSyntax declarator)
+ {
+ if (declarator is JassVariableDeclaratorSyntax variableDeclarator)
+ {
+ return variableDeclarator.IdentifierName;
+ }
+ else if (declarator is JassArrayDeclaratorSyntax arrayDeclarator)
+ {
+ return arrayDeclarator.IdentifierName;
+ }
+ else
+ {
+ throw new ArgumentException("Unknown declarator type.", nameof(declarator));
+ }
+ }
+
+ public static JassTypeSyntax GetVariableType(this JassVariableOrArrayDeclaratorSyntax declarator)
+ {
+ if (declarator is JassVariableDeclaratorSyntax variableDeclarator)
+ {
+ return variableDeclarator.Type;
+ }
+ else if (declarator is JassArrayDeclaratorSyntax arrayDeclarator)
+ {
+ return arrayDeclarator.Type;
+ }
+ else
+ {
+ throw new ArgumentException("Unknown declarator type.", nameof(declarator));
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/Extensions/ObjectExtensions.cs b/src/War3Net.CodeAnalysis.Jass/Extensions/ObjectExtensions.cs
new file mode 100644
index 00000000..fd9db04a
--- /dev/null
+++ b/src/War3Net.CodeAnalysis.Jass/Extensions/ObjectExtensions.cs
@@ -0,0 +1,37 @@
+// ------------------------------------------------------------------------------
+//
+// Licensed under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// ------------------------------------------------------------------------------
+
+namespace War3Net.CodeAnalysis.Jass.Extensions
+{
+ internal static class ObjectExtensions
+ {
+ internal static string Optional(this object? obj)
+ {
+ return obj?.ToString() ?? string.Empty;
+ }
+
+ internal static string OptionalPrefixed(this object? obj, string prefix = " ")
+ {
+ if (obj is null)
+ {
+ return string.Empty;
+ }
+
+ return $"{prefix}{obj}";
+ }
+
+ internal static string OptionalSuffixed(this object? obj, string suffix = " ")
+ {
+ if (obj is null)
+ {
+ return string.Empty;
+ }
+
+ return $"{obj}{suffix}";
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/Extensions/ParserExtensions.cs b/src/War3Net.CodeAnalysis.Jass/Extensions/ParserExtensions.cs
index 3ef55e85..c475619b 100644
--- a/src/War3Net.CodeAnalysis.Jass/Extensions/ParserExtensions.cs
+++ b/src/War3Net.CodeAnalysis.Jass/Extensions/ParserExtensions.cs
@@ -11,20 +11,56 @@
using War3Net.CodeAnalysis.Jass.Syntax;
+using static Pidgin.Parser;
+
namespace War3Net.CodeAnalysis.Jass.Extensions
{
internal static class ParserExtensions
{
- internal static Parser> Prefix(
- this Parser parser)
+ internal static Parser> Prefix(
+ this Parser operatorTokenParser)
+ {
+ return operatorTokenParser.Select>(operatorToken => expression => new JassUnaryExpressionSyntax(
+ operatorToken,
+ expression));
+ }
+
+ internal static Parser> Infix(
+ this Parser operatorTokenParser)
+ {
+ return operatorTokenParser.Select>(operatorToken => (left, right) => new JassBinaryExpressionSyntax(
+ left,
+ operatorToken,
+ right));
+ }
+
+ internal static Parser AsToken(
+ this Parser tokenSymbolParser,
+ Parser trailingTriviaParser,
+ JassSyntaxKind syntaxKind,
+ string symbol)
{
- return parser.Select>(@operator => expression => new JassUnaryExpressionSyntax(@operator, expression));
+ return Map(
+ (_, trailingTrivia) => new JassSyntaxToken(
+ syntaxKind,
+ symbol,
+ trailingTrivia),
+ tokenSymbolParser,
+ trailingTriviaParser);
}
- internal static Parser> Infix(
- this Parser parser)
+ internal static Parser AsToken(
+ this Parser tokenTextParser,
+ Parser trailingTriviaParser,
+ JassSyntaxKind syntaxKind)
{
- return parser.Select>(@operator => (left, right) => new JassBinaryExpressionSyntax(@operator, left, right));
+ return Map(
+ (text, trailingTrivia) => new JassSyntaxToken(
+ syntaxKind,
+ text,
+ trailingTrivia),
+ tokenTextParser,
+ trailingTriviaParser);
}
}
}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/Extensions/SeparatedSyntaxListExtensions.cs b/src/War3Net.CodeAnalysis.Jass/Extensions/SeparatedSyntaxListExtensions.cs
new file mode 100644
index 00000000..13ad1a5c
--- /dev/null
+++ b/src/War3Net.CodeAnalysis.Jass/Extensions/SeparatedSyntaxListExtensions.cs
@@ -0,0 +1,120 @@
+// ------------------------------------------------------------------------------
+//
+// Licensed under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// ------------------------------------------------------------------------------
+
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+
+using War3Net.CodeAnalysis.Jass.Syntax;
+
+namespace War3Net.CodeAnalysis.Jass.Extensions
+{
+ public static class SeparatedSyntaxListExtensions
+ {
+ public static bool IsEquivalentTo(this SeparatedSyntaxList list, SeparatedSyntaxList other)
+ where TSyntaxNode : JassSyntaxNode
+ {
+ return list.Items.IsEquivalentTo(other.Items);
+ }
+
+ public static void WriteTo(this SeparatedSyntaxList list, TextWriter writer)
+ where TSyntaxNode : JassSyntaxNode
+ {
+ if (list.Items.IsEmpty)
+ {
+ return;
+ }
+
+ list.Items[0].WriteTo(writer);
+ for (var i = 1; i < list.Items.Length; i++)
+ {
+ list.Separators[i - 1].WriteTo(writer);
+ list.Items[i].WriteTo(writer);
+ }
+ }
+
+ public static IEnumerable GetChildNodesAndTokens(this SeparatedSyntaxList list)
+ where TSyntaxNode : JassSyntaxNode
+ {
+ if (list.Items.IsEmpty)
+ {
+ yield break;
+ }
+
+ yield return list.Items[0];
+ for (var i = 1; i < list.Items.Length; i++)
+ {
+ yield return list.Separators[i - 1];
+ yield return list.Items[i];
+ }
+ }
+
+ public static IEnumerable GetDescendantNodes(this SeparatedSyntaxList list)
+ where TSyntaxNode : JassSyntaxNode
+ {
+ return list.Items.SelectMany(syntaxNode => syntaxNode.GetDescendantNodes());
+ }
+
+ public static IEnumerable GetDescendantTokens(this SeparatedSyntaxList list)
+ where TSyntaxNode : JassSyntaxNode
+ {
+ if (list.Items.IsEmpty)
+ {
+ yield break;
+ }
+
+ foreach (var descendant in list.Items[0].GetDescendantTokens())
+ {
+ yield return descendant;
+ }
+
+ for (var i = 1; i < list.Items.Length; i++)
+ {
+ yield return list.Separators[i - 1];
+ foreach (var descendant in list.Items[i].GetDescendantTokens())
+ {
+ yield return descendant;
+ }
+ }
+ }
+
+ public static IEnumerable GetDescendantNodesAndTokens(this SeparatedSyntaxList list)
+ where TSyntaxNode : JassSyntaxNode
+ {
+ if (list.Items.IsEmpty)
+ {
+ yield break;
+ }
+
+ foreach (var descendant in list.Items[0].GetDescendantNodesAndTokens())
+ {
+ yield return descendant;
+ }
+
+ for (var i = 1; i < list.Items.Length; i++)
+ {
+ yield return list.Separators[i - 1];
+ foreach (var descendant in list.Items[i].GetDescendantNodesAndTokens())
+ {
+ yield return descendant;
+ }
+ }
+ }
+
+ internal static SeparatedSyntaxList ReplaceFirstItem(this SeparatedSyntaxList list, TItem newItem)
+ {
+ var items = list.Items.ReplaceFirstItem(newItem);
+ return SeparatedSyntaxList.Create(items, list.Separators);
+ }
+
+ internal static SeparatedSyntaxList ReplaceLastItem(this SeparatedSyntaxList list, TItem newItem)
+ {
+ var items = list.Items.ReplaceLastItem(newItem);
+ return SeparatedSyntaxList.Create(items, list.Separators);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/Extensions/SyntaxNodeExtensions.cs b/src/War3Net.CodeAnalysis.Jass/Extensions/SyntaxNodeExtensions.cs
new file mode 100644
index 00000000..eabb9c59
--- /dev/null
+++ b/src/War3Net.CodeAnalysis.Jass/Extensions/SyntaxNodeExtensions.cs
@@ -0,0 +1,193 @@
+// ------------------------------------------------------------------------------
+//
+// Licensed under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// ------------------------------------------------------------------------------
+
+using System.Collections.Generic;
+using System.Collections.Immutable;
+
+using War3Net.CodeAnalysis.Jass.Syntax;
+
+namespace War3Net.CodeAnalysis.Jass.Extensions
+{
+ public static class SyntaxNodeExtensions
+ {
+ public static TSyntaxNode WithLeadingTrivia(this TSyntaxNode syntaxNode, JassSyntaxTriviaList triviaList)
+ where TSyntaxNode : JassSyntaxNode
+ {
+ var oldToken = syntaxNode.GetFirstToken();
+ var newToken = oldToken.WithLeadingTrivia(triviaList);
+ return (TSyntaxNode)syntaxNode.ReplaceFirstToken(newToken);
+ }
+
+ public static TSyntaxNode WithTrailingTrivia(this TSyntaxNode syntaxNode, JassSyntaxTriviaList triviaList)
+ where TSyntaxNode : JassSyntaxNode
+ {
+ var oldToken = syntaxNode.GetLastToken();
+ var newToken = oldToken.WithTrailingTrivia(triviaList);
+ return (TSyntaxNode)syntaxNode.ReplaceLastToken(newToken);
+ }
+
+ public static TSyntaxNode AppendLeadingTrivia(this TSyntaxNode syntaxNode, JassSyntaxTrivia trivia)
+ where TSyntaxNode : JassSyntaxNode
+ {
+ var oldToken = syntaxNode.GetFirstToken();
+ var newToken = oldToken.AppendLeadingTrivia(trivia);
+ return (TSyntaxNode)syntaxNode.ReplaceFirstToken(newToken);
+ }
+
+ public static TSyntaxNode AppendLeadingTrivia(this TSyntaxNode syntaxNode, JassSyntaxTriviaList triviaList)
+ where TSyntaxNode : JassSyntaxNode
+ {
+ var oldToken = syntaxNode.GetFirstToken();
+ var newToken = oldToken.AppendLeadingTrivia(triviaList);
+ return (TSyntaxNode)syntaxNode.ReplaceFirstToken(newToken);
+ }
+
+ public static TSyntaxNode AppendLeadingTrivia(this TSyntaxNode syntaxNode, params JassSyntaxTrivia[] triviaList)
+ where TSyntaxNode : JassSyntaxNode
+ {
+ var oldToken = syntaxNode.GetFirstToken();
+ var newToken = oldToken.AppendLeadingTrivia(triviaList);
+ return (TSyntaxNode)syntaxNode.ReplaceFirstToken(newToken);
+ }
+
+ public static TSyntaxNode AppendLeadingTrivia(this TSyntaxNode syntaxNode, IEnumerable triviaList)
+ where TSyntaxNode : JassSyntaxNode
+ {
+ var oldToken = syntaxNode.GetFirstToken();
+ var newToken = oldToken.AppendLeadingTrivia(triviaList);
+ return (TSyntaxNode)syntaxNode.ReplaceFirstToken(newToken);
+ }
+
+ public static TSyntaxNode AppendLeadingTrivia(this TSyntaxNode syntaxNode, ImmutableArray triviaList)
+ where TSyntaxNode : JassSyntaxNode
+ {
+ var oldToken = syntaxNode.GetFirstToken();
+ var newToken = oldToken.AppendLeadingTrivia(triviaList);
+ return (TSyntaxNode)syntaxNode.ReplaceFirstToken(newToken);
+ }
+
+ public static TSyntaxNode PrependLeadingTrivia(this TSyntaxNode syntaxNode, JassSyntaxTrivia trivia)
+ where TSyntaxNode : JassSyntaxNode
+ {
+ var oldToken = syntaxNode.GetFirstToken();
+ var newToken = oldToken.PrependLeadingTrivia(trivia);
+ return (TSyntaxNode)syntaxNode.ReplaceFirstToken(newToken);
+ }
+
+ public static TSyntaxNode PrependLeadingTrivia(this TSyntaxNode syntaxNode, JassSyntaxTriviaList triviaList)
+ where TSyntaxNode : JassSyntaxNode
+ {
+ var oldToken = syntaxNode.GetFirstToken();
+ var newToken = oldToken.PrependLeadingTrivia(triviaList);
+ return (TSyntaxNode)syntaxNode.ReplaceFirstToken(newToken);
+ }
+
+ public static TSyntaxNode PrependLeadingTrivia(this TSyntaxNode syntaxNode, params JassSyntaxTrivia[] triviaList)
+ where TSyntaxNode : JassSyntaxNode
+ {
+ var oldToken = syntaxNode.GetFirstToken();
+ var newToken = oldToken.PrependLeadingTrivia(triviaList);
+ return (TSyntaxNode)syntaxNode.ReplaceFirstToken(newToken);
+ }
+
+ public static TSyntaxNode PrependLeadingTrivia(this TSyntaxNode syntaxNode, IEnumerable triviaList)
+ where TSyntaxNode : JassSyntaxNode
+ {
+ var oldToken = syntaxNode.GetFirstToken();
+ var newToken = oldToken.PrependLeadingTrivia(triviaList);
+ return (TSyntaxNode)syntaxNode.ReplaceFirstToken(newToken);
+ }
+
+ public static TSyntaxNode PrependLeadingTrivia(this TSyntaxNode syntaxNode, ImmutableArray triviaList)
+ where TSyntaxNode : JassSyntaxNode
+ {
+ var oldToken = syntaxNode.GetFirstToken();
+ var newToken = oldToken.PrependLeadingTrivia(triviaList);
+ return (TSyntaxNode)syntaxNode.ReplaceFirstToken(newToken);
+ }
+
+ public static TSyntaxNode AppendTrailingTrivia(this TSyntaxNode syntaxNode, JassSyntaxTrivia trivia)
+ where TSyntaxNode : JassSyntaxNode
+ {
+ var oldToken = syntaxNode.GetLastToken();
+ var newToken = oldToken.AppendTrailingTrivia(trivia);
+ return (TSyntaxNode)syntaxNode.ReplaceLastToken(newToken);
+ }
+
+ public static TSyntaxNode AppendTrailingTrivia(this TSyntaxNode syntaxNode, JassSyntaxTriviaList triviaList)
+ where TSyntaxNode : JassSyntaxNode
+ {
+ var oldToken = syntaxNode.GetLastToken();
+ var newToken = oldToken.AppendTrailingTrivia(triviaList);
+ return (TSyntaxNode)syntaxNode.ReplaceLastToken(newToken);
+ }
+
+ public static TSyntaxNode AppendTrailingTrivia(this TSyntaxNode syntaxNode, params JassSyntaxTrivia[] triviaList)
+ where TSyntaxNode : JassSyntaxNode
+ {
+ var oldToken = syntaxNode.GetLastToken();
+ var newToken = oldToken.AppendTrailingTrivia(triviaList);
+ return (TSyntaxNode)syntaxNode.ReplaceLastToken(newToken);
+ }
+
+ public static TSyntaxNode AppendTrailingTrivia(this TSyntaxNode syntaxNode, IEnumerable triviaList)
+ where TSyntaxNode : JassSyntaxNode
+ {
+ var oldToken = syntaxNode.GetLastToken();
+ var newToken = oldToken.AppendTrailingTrivia(triviaList);
+ return (TSyntaxNode)syntaxNode.ReplaceLastToken(newToken);
+ }
+
+ public static TSyntaxNode AppendTrailingTrivia(this TSyntaxNode syntaxNode, ImmutableArray triviaList)
+ where TSyntaxNode : JassSyntaxNode
+ {
+ var oldToken = syntaxNode.GetLastToken();
+ var newToken = oldToken.AppendTrailingTrivia(triviaList);
+ return (TSyntaxNode)syntaxNode.ReplaceLastToken(newToken);
+ }
+
+ public static TSyntaxNode PrependTrailingTrivia(this TSyntaxNode syntaxNode, JassSyntaxTrivia trivia)
+ where TSyntaxNode : JassSyntaxNode
+ {
+ var oldToken = syntaxNode.GetLastToken();
+ var newToken = oldToken.PrependTrailingTrivia(trivia);
+ return (TSyntaxNode)syntaxNode.ReplaceLastToken(newToken);
+ }
+
+ public static TSyntaxNode PrependTrailingTrivia(this TSyntaxNode syntaxNode, JassSyntaxTriviaList triviaList)
+ where TSyntaxNode : JassSyntaxNode
+ {
+ var oldToken = syntaxNode.GetLastToken();
+ var newToken = oldToken.PrependTrailingTrivia(triviaList);
+ return (TSyntaxNode)syntaxNode.ReplaceLastToken(newToken);
+ }
+
+ public static TSyntaxNode PrependTrailingTrivia(this TSyntaxNode syntaxNode, params JassSyntaxTrivia[] triviaList)
+ where TSyntaxNode : JassSyntaxNode
+ {
+ var oldToken = syntaxNode.GetLastToken();
+ var newToken = oldToken.PrependTrailingTrivia(triviaList);
+ return (TSyntaxNode)syntaxNode.ReplaceLastToken(newToken);
+ }
+
+ public static TSyntaxNode PrependTrailingTrivia(this TSyntaxNode syntaxNode, IEnumerable triviaList)
+ where TSyntaxNode : JassSyntaxNode
+ {
+ var oldToken = syntaxNode.GetLastToken();
+ var newToken = oldToken.PrependTrailingTrivia(triviaList);
+ return (TSyntaxNode)syntaxNode.ReplaceLastToken(newToken);
+ }
+
+ public static TSyntaxNode PrependTrailingTrivia(this TSyntaxNode syntaxNode, ImmutableArray triviaList)
+ where TSyntaxNode : JassSyntaxNode
+ {
+ var oldToken = syntaxNode.GetLastToken();
+ var newToken = oldToken.PrependTrailingTrivia(triviaList);
+ return (TSyntaxNode)syntaxNode.ReplaceLastToken(newToken);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/Extensions/TypeExtensions.cs b/src/War3Net.CodeAnalysis.Jass/Extensions/TypeExtensions.cs
index 27ef3515..d3fa07e2 100644
--- a/src/War3Net.CodeAnalysis.Jass/Extensions/TypeExtensions.cs
+++ b/src/War3Net.CodeAnalysis.Jass/Extensions/TypeExtensions.cs
@@ -19,22 +19,22 @@ public static JassTypeSyntax ToJassType(this Type type)
var typeCode = Type.GetTypeCode(type);
return typeCode switch
{
- TypeCode.Empty => JassTypeSyntax.Nothing,
- TypeCode.Object => JassTypeSyntax.Handle,
- TypeCode.Boolean => JassTypeSyntax.Boolean,
- TypeCode.Char => JassTypeSyntax.Integer,
- TypeCode.SByte => JassTypeSyntax.Integer,
- TypeCode.Byte => JassTypeSyntax.Integer,
- TypeCode.Int16 => JassTypeSyntax.Integer,
- TypeCode.UInt16 => JassTypeSyntax.Integer,
- TypeCode.Int32 => JassTypeSyntax.Integer,
- TypeCode.UInt32 => JassTypeSyntax.Integer,
- TypeCode.Int64 => JassTypeSyntax.Integer,
- TypeCode.UInt64 => JassTypeSyntax.Integer,
- TypeCode.Single => JassTypeSyntax.Real,
- TypeCode.Double => JassTypeSyntax.Real,
- TypeCode.Decimal => JassTypeSyntax.Real,
- TypeCode.String => JassTypeSyntax.String,
+ TypeCode.Empty => JassPredefinedTypeSyntax.Nothing,
+ TypeCode.Object => JassPredefinedTypeSyntax.Handle,
+ TypeCode.Boolean => JassPredefinedTypeSyntax.Boolean,
+ TypeCode.Char => JassPredefinedTypeSyntax.Integer,
+ TypeCode.SByte => JassPredefinedTypeSyntax.Integer,
+ TypeCode.Byte => JassPredefinedTypeSyntax.Integer,
+ TypeCode.Int16 => JassPredefinedTypeSyntax.Integer,
+ TypeCode.UInt16 => JassPredefinedTypeSyntax.Integer,
+ TypeCode.Int32 => JassPredefinedTypeSyntax.Integer,
+ TypeCode.UInt32 => JassPredefinedTypeSyntax.Integer,
+ TypeCode.Int64 => JassPredefinedTypeSyntax.Integer,
+ TypeCode.UInt64 => JassPredefinedTypeSyntax.Integer,
+ TypeCode.Single => JassPredefinedTypeSyntax.Real,
+ TypeCode.Double => JassPredefinedTypeSyntax.Real,
+ TypeCode.Decimal => JassPredefinedTypeSyntax.Real,
+ TypeCode.String => JassPredefinedTypeSyntax.String,
_ => throw new InvalidEnumArgumentException(nameof(typeCode), (int)typeCode, typeof(TypeCode)),
};
diff --git a/src/War3Net.CodeAnalysis.Jass/Extensions/UnaryOperatorTypeExtensions.cs b/src/War3Net.CodeAnalysis.Jass/Extensions/UnaryOperatorTypeExtensions.cs
deleted file mode 100644
index 66dc6e8a..00000000
--- a/src/War3Net.CodeAnalysis.Jass/Extensions/UnaryOperatorTypeExtensions.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-// ------------------------------------------------------------------------------
-//
-// Licensed under the MIT license.
-// See the LICENSE file in the project root for more information.
-//
-// ------------------------------------------------------------------------------
-
-using System.ComponentModel;
-
-using War3Net.CodeAnalysis.Jass.Syntax;
-
-namespace War3Net.CodeAnalysis.Jass.Extensions
-{
- public static class UnaryOperatorTypeExtensions
- {
- public static string GetSymbol(this UnaryOperatorType unaryOperator)
- {
- return unaryOperator switch
- {
- UnaryOperatorType.Plus => $"{JassSymbol.PlusSign}",
- UnaryOperatorType.Minus => $"{JassSymbol.MinusSign}",
- UnaryOperatorType.Not => JassKeyword.Not,
-
- _ => throw new InvalidEnumArgumentException(nameof(unaryOperator), (int)unaryOperator, typeof(UnaryOperatorType)),
- };
- }
- }
-}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/JassParser.cs b/src/War3Net.CodeAnalysis.Jass/JassParser.cs
index f1e678af..f5deed47 100644
--- a/src/War3Net.CodeAnalysis.Jass/JassParser.cs
+++ b/src/War3Net.CodeAnalysis.Jass/JassParser.cs
@@ -5,6 +5,8 @@
//
// ------------------------------------------------------------------------------
+using System;
+
using Pidgin;
using War3Net.CodeAnalysis.Jass.Syntax;
@@ -19,191 +21,166 @@ internal partial class JassParser
private static readonly JassParser _parser = new JassParser();
private readonly Parser _argumentListParser;
- private readonly Parser _binaryOperatorParser;
- private readonly Parser _commentParser;
+ private readonly Parser _binaryOperatorParser;
private readonly Parser _compilationUnitParser;
- private readonly Parser _declarationParser;
- private readonly Parser _declarationLineParser;
- private readonly Parser _expressionParser;
- private readonly Parser _functionDeclarationParser;
- private readonly Parser _globalDeclarationParser;
- private readonly Parser _globalLineParser;
+ private readonly Parser _expressionParser;
+ private readonly Parser _globalDeclarationParser;
private readonly Parser _identifierNameParser;
- private readonly Parser _parameterListParser;
- private readonly Parser _statementParser;
- private readonly Parser _statementLineParser;
+ private readonly Parser _leadingTriviaListParser;
+ private readonly Parser _parameterListParser;
+ private readonly Parser _statementParser;
+ private readonly Parser _topLevelDeclarationParser;
+ private readonly Parser _trailingTriviaListParser;
private readonly Parser _typeParser;
- private readonly Parser _unaryOperatorParser;
+ private readonly Parser _unaryOperatorParser;
private JassParser()
{
- var whitespaceParser = GetWhitespaceParser();
- var identifierNameParser = GetIdentifierNameParser(whitespaceParser);
- var typeParser = GetTypeParser(identifierNameParser, whitespaceParser);
- var expressionParser = GetExpressionParser(whitespaceParser, identifierNameParser);
- var equalsValueClauseParser = GetEqualsValueClauseParser(whitespaceParser, expressionParser);
-
- var argumentListParser = GetArgumentListParser(whitespaceParser, expressionParser);
- var parameterListParser = GetParameterListParser(whitespaceParser, GetParameterParser(identifierNameParser, typeParser));
- var functionDeclaratorParser = GetFunctionDeclaratorParser(identifierNameParser, parameterListParser, typeParser, whitespaceParser);
- var variableDeclaratorParser = GetVariableDeclaratorParser(equalsValueClauseParser, identifierNameParser, typeParser, whitespaceParser);
-
- var commentStringParser = GetCommentStringParser();
- var newLineParser = GetNewLineParser(whitespaceParser);
- var endOfLineParser = GetEndOfLineParser(commentStringParser, newLineParser);
- var emptyParser = GetEmptyParser();
- var emptyLineParser = GetEmptyLineParser();
- var commentParser = GetCommentParser(commentStringParser);
-
- var setStatementParser = GetSetStatementParser(whitespaceParser, expressionParser, equalsValueClauseParser, identifierNameParser);
- var callStatementParser = GetCallStatementParser(whitespaceParser, argumentListParser, identifierNameParser);
- var exitStatementParser = GetExitStatementParser(expressionParser, whitespaceParser);
- var localVariableDeclarationStatementParser = GetLocalVariableDeclarationStatementParser(variableDeclaratorParser, whitespaceParser);
- var returnStatementParser = GetReturnStatementParser(expressionParser, whitespaceParser);
+ var whitespaceTriviaParser = GetWhitespaceTriviaParser();
+ var newlineTriviaParser = GetNewlineTriviaParser();
+ var singleNewlineTriviaParser = GetSingleNewlineTriviaParser();
+ var singleLineCommentTriviaParser = GetSingleLineCommentTriviaParser();
+
+ var simpleTriviaListParser = GetSimpleTriviaListParser(
+ whitespaceTriviaParser);
+
+ var leadingTriviaListParser = GetLeadingTriviaListParser(
+ whitespaceTriviaParser,
+ newlineTriviaParser,
+ singleLineCommentTriviaParser);
+
+ var trailingTriviaListParser = GetTrailingTriviaListParser(
+ whitespaceTriviaParser,
+ singleNewlineTriviaParser,
+ singleLineCommentTriviaParser);
+
+ var identifierParser = GetIdentifierParser();
+ var identifierNameParser = GetIdentifierNameParser(identifierParser, simpleTriviaListParser);
+ var typeParser = GetTypeParser(identifierParser, simpleTriviaListParser);
+
+ var expressionParser = GetExpressionParser(identifierParser, identifierNameParser, simpleTriviaListParser);
+ var equalsValueClauseParser = GetEqualsValueClauseParser(simpleTriviaListParser, expressionParser);
+
+ var parameterParser = GetParameterParser(identifierNameParser, typeParser);
+ var parameterListParser = GetParameterListParser(simpleTriviaListParser, parameterParser);
+ var argumentListParser = GetArgumentListParser(simpleTriviaListParser, expressionParser);
+ var returnClauseParser = GetReturnClauseParser(typeParser, simpleTriviaListParser);
+ var functionDeclaratorParser = GetFunctionDeclaratorParser(identifierNameParser, parameterListParser, returnClauseParser, simpleTriviaListParser, trailingTriviaListParser);
+ var variableOrArrayDeclaratorParser = GetVariableOrArrayDeclaratorParser(equalsValueClauseParser, identifierNameParser, typeParser, simpleTriviaListParser);
+ var elementAccessClauseParser = GetElementAccessClauseParser(simpleTriviaListParser, expressionParser);
+
+ var setStatementParser = GetSetStatementParser(identifierNameParser, elementAccessClauseParser, equalsValueClauseParser, simpleTriviaListParser, trailingTriviaListParser);
+ var callStatementParser = GetCallStatementParser(identifierNameParser, argumentListParser, simpleTriviaListParser, trailingTriviaListParser);
+ var exitStatementParser = GetExitStatementParser(expressionParser, simpleTriviaListParser, trailingTriviaListParser);
+ var localVariableDeclarationStatementParser = GetLocalVariableDeclarationStatementParser(variableOrArrayDeclaratorParser, simpleTriviaListParser, trailingTriviaListParser);
+ var returnStatementParser = GetReturnStatementParser(expressionParser, simpleTriviaListParser, trailingTriviaListParser);
+
+ var ifClauseDeclaratorParser = GetIfClauseDeclaratorParser(expressionParser, simpleTriviaListParser, trailingTriviaListParser);
+ var elseIfClauseDeclaratorParser = GetElseIfClauseDeclaratorParser(expressionParser, simpleTriviaListParser, trailingTriviaListParser);
var statementParser = GetStatementParser(
- emptyParser,
- commentParser,
localVariableDeclarationStatementParser,
exitStatementParser,
returnStatementParser,
setStatementParser,
callStatementParser,
- expressionParser,
- whitespaceParser,
- endOfLineParser);
-
- var statementLineParser = GetStatementLineParser(
- emptyLineParser,
- commentParser,
- localVariableDeclarationStatementParser,
- setStatementParser,
- callStatementParser,
- exitStatementParser,
- returnStatementParser,
- expressionParser,
- whitespaceParser);
+ ifClauseDeclaratorParser,
+ elseIfClauseDeclaratorParser,
+ simpleTriviaListParser,
+ leadingTriviaListParser,
+ trailingTriviaListParser);
- var constantDeclarationParser = GetConstantDeclarationParser(
+ var globalConstantDeclarationParser = GetGlobalConstantDeclarationParser(
equalsValueClauseParser,
identifierNameParser,
typeParser,
- whitespaceParser);
+ simpleTriviaListParser,
+ trailingTriviaListParser);
- var variableDeclarationParser = GetVariableDeclarationParser(
- equalsValueClauseParser,
- identifierNameParser,
- typeParser,
- whitespaceParser);
+ var globalVariableDeclarationParser = GetGlobalVariableDeclarationParser(
+ variableOrArrayDeclaratorParser,
+ trailingTriviaListParser);
var globalDeclarationParser = GetGlobalDeclarationParser(
- emptyParser,
- commentParser,
- constantDeclarationParser,
- variableDeclarationParser);
-
- var globalLineParser = GetGlobalLineParser(
- emptyLineParser,
- commentParser,
- constantDeclarationParser,
- variableDeclarationParser,
- whitespaceParser);
-
- var statementListParser = GetStatementListParser(
- statementParser,
- endOfLineParser);
+ globalConstantDeclarationParser,
+ globalVariableDeclarationParser);
var functionDeclarationParser = GetFunctionDeclarationParser(
functionDeclaratorParser,
- statementListParser,
- whitespaceParser,
- endOfLineParser);
+ statementParser,
+ leadingTriviaListParser,
+ trailingTriviaListParser);
var typeDeclarationParser = GetTypeDeclarationParser(
identifierNameParser,
typeParser,
- whitespaceParser);
+ simpleTriviaListParser,
+ trailingTriviaListParser);
var nativeFunctionDeclarationParser = GetNativeFunctionDeclarationParser(
- functionDeclaratorParser,
- whitespaceParser);
+ identifierNameParser,
+ parameterListParser,
+ returnClauseParser,
+ simpleTriviaListParser,
+ trailingTriviaListParser);
- var declarationParser = GetDeclarationParser(
- emptyParser,
- commentParser,
+ var topLevelDeclarationParser = GetTopLevelDeclarationParser(
typeDeclarationParser,
nativeFunctionDeclarationParser,
functionDeclarationParser,
- globalDeclarationParser.Before(endOfLineParser),
- whitespaceParser,
- endOfLineParser);
-
- var declarationLineParser = GetDeclarationLineParser(
- emptyLineParser,
- commentParser,
- typeDeclarationParser,
- nativeFunctionDeclarationParser,
- functionDeclaratorParser,
- whitespaceParser);
+ globalDeclarationParser,
+ simpleTriviaListParser,
+ leadingTriviaListParser,
+ trailingTriviaListParser);
var compilationUnitParser = GetCompilationUnitParser(
- declarationParser,
- commentStringParser,
- newLineParser);
+ topLevelDeclarationParser,
+ leadingTriviaListParser);
- Parser Create(Parser parser) => whitespaceParser.Then(parser).Before(End);
+ Parser Create(Parser parser) => simpleTriviaListParser.Then(parser).Before(End);
_argumentListParser = Create(argumentListParser);
- _binaryOperatorParser = Create(GetBinaryOperatorParser(whitespaceParser));
- _commentParser = Create(commentParser);
+ _binaryOperatorParser = Create(GetBinaryOperatorParser(simpleTriviaListParser));
_compilationUnitParser = Create(compilationUnitParser);
- _declarationParser = Create(declarationParser);
- _declarationLineParser = Create(declarationLineParser);
_expressionParser = Create(expressionParser);
- _functionDeclarationParser = Create(functionDeclarationParser);
_globalDeclarationParser = Create(globalDeclarationParser);
- _globalLineParser = Create(globalLineParser);
_identifierNameParser = Create(identifierNameParser);
+ _leadingTriviaListParser = leadingTriviaListParser.Before(End);
_parameterListParser = Create(parameterListParser);
_statementParser = Create(statementParser);
- _statementLineParser = Create(statementLineParser.Before(commentStringParser.Optional()));
+ _topLevelDeclarationParser = Create(topLevelDeclarationParser);
+ _trailingTriviaListParser = trailingTriviaListParser.Before(End);
_typeParser = Create(typeParser);
- _unaryOperatorParser = Create(GetUnaryOperatorParser(whitespaceParser));
+ _unaryOperatorParser = Create(GetUnaryOperatorParser(simpleTriviaListParser));
}
internal static JassParser Instance => _parser;
internal Parser ArgumentListParser => _argumentListParser;
- internal Parser BinaryOperatorParser => _binaryOperatorParser;
-
- internal Parser CommentParser => _commentParser;
+ internal Parser BinaryOperatorParser => _binaryOperatorParser;
internal Parser CompilationUnitParser => _compilationUnitParser;
- internal Parser DeclarationParser => _declarationParser;
-
- internal Parser DeclarationLineParser => _declarationLineParser;
-
- internal Parser ExpressionParser => _expressionParser;
+ internal Parser ExpressionParser => _expressionParser;
- internal Parser FunctionDeclarationParser => _functionDeclarationParser;
+ internal Parser GlobalDeclarationParser => _globalDeclarationParser;
- internal Parser GlobalDeclarationParser => _globalDeclarationParser;
+ internal Parser IdentifierNameParser => _identifierNameParser;
- internal Parser GlobalLineParser => _globalLineParser;
+ internal Parser LeadingTriviaListParser => _leadingTriviaListParser;
- internal Parser IdentifierNameParser => _identifierNameParser;
+ internal Parser ParameterListParser => _parameterListParser;
- internal Parser ParameterListParser => _parameterListParser;
+ internal Parser StatementParser => _statementParser;
- internal Parser StatementParser => _statementParser;
+ internal Parser TopLevelDeclarationParser => _topLevelDeclarationParser;
- internal Parser StatementLineParser => _statementLineParser;
+ internal Parser TrailingTriviaListParser => _trailingTriviaListParser;
internal Parser TypeParser => _typeParser;
- internal Parser UnaryOperatorParser => _unaryOperatorParser;
+ internal Parser UnaryOperatorParser => _unaryOperatorParser;
private static class Keyword
{
@@ -298,31 +275,35 @@ private static Parser GetKeywordParser(string keyword, Parser LineFeed = Char(JassSymbol.LineFeed);
- internal static readonly Parser CarriageReturn = Char(JassSymbol.CarriageReturn);
- internal static readonly Parser QuotationMark = Char(JassSymbol.QuotationMark);
- internal static readonly Parser DollarSign = Char(JassSymbol.DollarSign);
- internal static readonly Parser Apostrophe = Char(JassSymbol.Apostrophe);
- internal static readonly Parser LeftParenthesis = Char(JassSymbol.LeftParenthesis);
- internal static readonly Parser RightParenthesis = Char(JassSymbol.RightParenthesis);
- internal static readonly Parser Asterisk = Char(JassSymbol.Asterisk);
- internal static readonly Parser PlusSign = Char(JassSymbol.PlusSign);
- internal static readonly Parser Comma = Char(JassSymbol.Comma);
- internal static readonly Parser MinusSign = Char(JassSymbol.MinusSign);
- internal static readonly Parser FullStop = Char(JassSymbol.FullStop);
- internal static readonly Parser Slash = Char(JassSymbol.Slash);
- internal static readonly Parser Zero = Char(JassSymbol.Zero);
- internal static readonly Parser LessThanSign = Char(JassSymbol.LessThanSign);
- internal static readonly Parser EqualsSign = Char(JassSymbol.EqualsSign);
- internal static readonly Parser GreaterThanSign = Char(JassSymbol.GreaterThanSign);
- internal static readonly Parser LeftSquareBracket = Char(JassSymbol.LeftSquareBracket);
- internal static readonly Parser RightSquareBracket = Char(JassSymbol.RightSquareBracket);
- internal static readonly Parser X = CIChar(JassSymbol.X);
-
- internal static readonly Parser EqualsEquals = String($"{JassSymbol.EqualsSign}{JassSymbol.EqualsSign}");
- internal static readonly Parser LessOrEquals = String($"{JassSymbol.LessThanSign}{JassSymbol.EqualsSign}");
- internal static readonly Parser GreaterOrEquals = String($"{JassSymbol.GreaterThanSign}{JassSymbol.EqualsSign}");
- internal static readonly Parser NotEquals = String($"{JassSymbol.ExclamationMark}{JassSymbol.EqualsSign}");
+ internal static readonly Parser LineFeed = Char(JassSymbol.LineFeedChar);
+ internal static readonly Parser CarriageReturn = Char(JassSymbol.CarriageReturnChar);
+ internal static readonly Parser DoubleQuote = Char(JassSymbol.DoubleQuoteChar);
+ internal static readonly Parser Dollar = Char(JassSymbol.DollarChar);
+ internal static readonly Parser SingleQuote = Char(JassSymbol.SingleQuoteChar);
+ internal static readonly Parser OpenParen = Char(JassSymbol.OpenParenChar);
+ internal static readonly Parser CloseParen = Char(JassSymbol.CloseParenChar);
+ internal static readonly Parser Asterisk = Char(JassSymbol.AsteriskChar);
+ internal static readonly Parser Plus = Char(JassSymbol.PlusChar);
+ internal static readonly Parser Comma = Char(JassSymbol.CommaChar);
+ internal static readonly Parser Minus = Char(JassSymbol.MinusChar);
+ internal static readonly Parser Dot = Char(JassSymbol.DotChar);
+ internal static readonly Parser Slash = Char(JassSymbol.SlashChar);
+ internal static readonly Parser Zero = Char(JassSymbol.ZeroChar);
+ internal static readonly Parser LessThan = Char(JassSymbol.LessThanChar);
+ internal static new readonly Parser Equals = Char(JassSymbol.EqualsChar);
+ internal static readonly Parser GreaterThan = Char(JassSymbol.GreaterThanChar);
+ internal static readonly Parser OpenBracket = Char(JassSymbol.OpenBracketChar);
+ internal static readonly Parser CloseBracket = Char(JassSymbol.CloseBracketChar);
+ internal static readonly Parser X = CIChar(JassSymbol.XChar);
+
+ internal static readonly Parser CarriageReturnLineFeed = String(JassSymbol.CarriageReturnLineFeed);
+ internal static readonly Parser CarriageReturnString = String(JassSymbol.CarriageReturn);
+ internal static readonly Parser LineFeedString = String(JassSymbol.LineFeed);
+ internal static readonly Parser EqualsEquals = String(JassSymbol.EqualsEquals);
+ internal static readonly Parser LessThanEquals = String(JassSymbol.LessThanEquals);
+ internal static readonly Parser GreaterThanEquals = String(JassSymbol.GreaterThanEquals);
+ internal static readonly Parser ExclamationEquals = String(JassSymbol.ExclamationEquals);
+ internal static readonly Parser SlashSlash = String(JassSymbol.SlashSlash);
}
}
}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/JassParser/ArgumentListParser.cs b/src/War3Net.CodeAnalysis.Jass/JassParser/ArgumentListParser.cs
new file mode 100644
index 00000000..9e90566d
--- /dev/null
+++ b/src/War3Net.CodeAnalysis.Jass/JassParser/ArgumentListParser.cs
@@ -0,0 +1,33 @@
+// ------------------------------------------------------------------------------
+//
+// Licensed under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// ------------------------------------------------------------------------------
+
+using Pidgin;
+
+using War3Net.CodeAnalysis.Jass.Extensions;
+using War3Net.CodeAnalysis.Jass.Syntax;
+
+using static Pidgin.Parser;
+
+namespace War3Net.CodeAnalysis.Jass
+{
+ internal partial class JassParser
+ {
+ internal static Parser GetArgumentListParser(
+ Parser triviaParser,
+ Parser expressionParser)
+ {
+ return Map(
+ (openParenToken, argumentList, closeParenToken) => new JassArgumentListSyntax(
+ openParenToken,
+ argumentList,
+ closeParenToken),
+ Symbol.OpenParen.AsToken(triviaParser, JassSyntaxKind.OpenParenToken, JassSymbol.OpenParen),
+ expressionParser.SeparatedList(Symbol.Comma.AsToken(triviaParser, JassSyntaxKind.CommaToken, JassSymbol.Comma)),
+ Symbol.CloseParen.AsToken(triviaParser, JassSyntaxKind.CloseParenToken, JassSymbol.CloseParen));
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/JassParser/BinaryOperatorParser.cs b/src/War3Net.CodeAnalysis.Jass/JassParser/BinaryOperatorParser.cs
new file mode 100644
index 00000000..2e8d81f3
--- /dev/null
+++ b/src/War3Net.CodeAnalysis.Jass/JassParser/BinaryOperatorParser.cs
@@ -0,0 +1,109 @@
+// ------------------------------------------------------------------------------
+//
+// Licensed under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// ------------------------------------------------------------------------------
+
+using Pidgin;
+
+using War3Net.CodeAnalysis.Jass.Extensions;
+using War3Net.CodeAnalysis.Jass.Syntax;
+
+using static Pidgin.Parser;
+
+namespace War3Net.CodeAnalysis.Jass
+{
+ internal partial class JassParser
+ {
+ internal static Parser GetBinaryOperatorParser(
+ Parser triviaParser)
+ {
+ return OneOf(
+ GetBinaryAddOperatorParser(triviaParser),
+ GetBinarySubtractOperatorParser(triviaParser),
+ GetBinaryMultiplicationOperatorParser(triviaParser),
+ GetBinaryDivisionOperatorParser(triviaParser),
+ GetBinaryGreaterOrEqualOperatorParser(triviaParser),
+ GetBinaryLessOrEqualOperatorParser(triviaParser),
+ GetBinaryEqualsOperatorParser(triviaParser),
+ GetBinaryNotEqualsOperatorParser(triviaParser),
+ GetBinaryGreaterThanOperatorParser(triviaParser),
+ GetBinaryLessThanOperatorParser(triviaParser),
+ GetBinaryAndOperatorParser(triviaParser),
+ GetBinaryOrOperatorParser(triviaParser));
+ }
+
+ internal static Parser GetBinaryAddOperatorParser(
+ Parser triviaParser)
+ {
+ return Symbol.Plus.AsToken(triviaParser, JassSyntaxKind.PlusToken, JassSymbol.Plus);
+ }
+
+ internal static Parser GetBinarySubtractOperatorParser(
+ Parser triviaParser)
+ {
+ return Symbol.Minus.AsToken(triviaParser, JassSyntaxKind.MinusToken, JassSymbol.Minus);
+ }
+
+ internal static Parser GetBinaryMultiplicationOperatorParser(
+ Parser triviaParser)
+ {
+ return Symbol.Asterisk.AsToken(triviaParser, JassSyntaxKind.AsteriskToken, JassSymbol.Asterisk);
+ }
+
+ internal static Parser GetBinaryDivisionOperatorParser(
+ Parser triviaParser)
+ {
+ return Try(Symbol.Slash.Before(Not(Lookahead(Symbol.Slash)))).AsToken(triviaParser, JassSyntaxKind.SlashToken, JassSymbol.Slash);
+ }
+
+ internal static Parser GetBinaryGreaterOrEqualOperatorParser(
+ Parser triviaParser)
+ {
+ return Try(Symbol.GreaterThanEquals).AsToken(triviaParser, JassSyntaxKind.GreaterThanEqualsToken);
+ }
+
+ internal static Parser GetBinaryLessOrEqualOperatorParser(
+ Parser triviaParser)
+ {
+ return Try(Symbol.LessThanEquals).AsToken(triviaParser, JassSyntaxKind.LessThanEqualsToken);
+ }
+
+ internal static Parser GetBinaryEqualsOperatorParser(
+ Parser triviaParser)
+ {
+ return Symbol.EqualsEquals.AsToken(triviaParser, JassSyntaxKind.EqualsEqualsToken);
+ }
+
+ internal static Parser GetBinaryNotEqualsOperatorParser(
+ Parser triviaParser)
+ {
+ return Symbol.ExclamationEquals.AsToken(triviaParser, JassSyntaxKind.ExclamationEqualsToken);
+ }
+
+ internal static Parser GetBinaryGreaterThanOperatorParser(
+ Parser triviaParser)
+ {
+ return Symbol.GreaterThan.AsToken(triviaParser, JassSyntaxKind.GreaterThanToken, JassSymbol.GreaterThan);
+ }
+
+ internal static Parser GetBinaryLessThanOperatorParser(
+ Parser triviaParser)
+ {
+ return Symbol.LessThan.AsToken(triviaParser, JassSyntaxKind.LessThanToken, JassSymbol.LessThan);
+ }
+
+ internal static Parser GetBinaryAndOperatorParser(
+ Parser triviaParser)
+ {
+ return Keyword.And.AsToken(triviaParser, JassSyntaxKind.AndKeyword);
+ }
+
+ internal static Parser GetBinaryOrOperatorParser(
+ Parser triviaParser)
+ {
+ return Keyword.Or.AsToken(triviaParser, JassSyntaxKind.OrKeyword);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/JassParser/CallStatementParser.cs b/src/War3Net.CodeAnalysis.Jass/JassParser/CallStatementParser.cs
new file mode 100644
index 00000000..fd86241f
--- /dev/null
+++ b/src/War3Net.CodeAnalysis.Jass/JassParser/CallStatementParser.cs
@@ -0,0 +1,36 @@
+// ------------------------------------------------------------------------------
+//
+// Licensed under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// ------------------------------------------------------------------------------
+
+using Pidgin;
+
+using War3Net.CodeAnalysis.Jass.Extensions;
+using War3Net.CodeAnalysis.Jass.Syntax;
+
+using static Pidgin.Parser;
+
+namespace War3Net.CodeAnalysis.Jass
+{
+ internal partial class JassParser
+ {
+ internal static Parser GetCallStatementParser(
+ Parser identifierNameParser,
+ Parser argumentListParser,
+ Parser triviaParser,
+ Parser trailingTriviaParser)
+ {
+ return Map(
+ (callToken, identifierName, argumentList, trailingTrivia) => (JassStatementSyntax)new JassCallStatementSyntax(
+ callToken,
+ identifierName,
+ argumentList.AppendTrailingTrivia(trailingTrivia)),
+ Keyword.Call.AsToken(triviaParser, JassSyntaxKind.CallKeyword),
+ identifierNameParser,
+ argumentListParser,
+ trailingTriviaParser);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/Parser/CharacterLiteralExpressionParser.cs b/src/War3Net.CodeAnalysis.Jass/JassParser/CharacterLiteralExpressionParser.cs
similarity index 53%
rename from src/War3Net.CodeAnalysis.Jass/Parser/CharacterLiteralExpressionParser.cs
rename to src/War3Net.CodeAnalysis.Jass/JassParser/CharacterLiteralExpressionParser.cs
index e6e0d5b5..18afaaf2 100644
--- a/src/War3Net.CodeAnalysis.Jass/Parser/CharacterLiteralExpressionParser.cs
+++ b/src/War3Net.CodeAnalysis.Jass/JassParser/CharacterLiteralExpressionParser.cs
@@ -1,4 +1,4 @@
-// ------------------------------------------------------------------------------
+// ------------------------------------------------------------------------------
//
// Licensed under the MIT license.
// See the LICENSE file in the project root for more information.
@@ -15,11 +15,12 @@ namespace War3Net.CodeAnalysis.Jass
{
internal partial class JassParser
{
- internal static Parser GetCharacterLiteralExpressionParser()
+ internal static Parser GetCharacterLiteralExpressionParser(
+ Parser triviaParser)
{
var escapeCharacterParser = OneOf(
- Symbol.QuotationMark.ThenReturn(JassSymbol.QuotationMark),
- Symbol.Apostrophe.ThenReturn(JassSymbol.Apostrophe),
+ Symbol.DoubleQuote,
+ Symbol.SingleQuote,
Char('r').ThenReturn('\r'),
Char('n').ThenReturn('\n'),
Char('t').ThenReturn('\t'),
@@ -27,8 +28,12 @@ internal static Parser GetCharacterLiteralExpressionPar
Char('f').ThenReturn('\f'),
Char('\\').ThenReturn('\\'));
- return Try(Char('\\').Then(escapeCharacterParser).Or(AnyCharExcept(JassSymbol.Apostrophe)).Between(Symbol.Apostrophe))
- .Select(value => new JassCharacterLiteralExpressionSyntax(value))
+ return Map(
+ (value, trivia) => (JassExpressionSyntax)new JassLiteralExpressionSyntax(new JassSyntaxToken(JassSyntaxKind.CharacterLiteralToken, $"'{value}'", trivia)),
+ Try(OneOf(
+ Char('\\').Then(escapeCharacterParser),
+ AnyCharExcept(JassSymbol.SingleQuoteChar)).Between(Symbol.SingleQuote)),
+ triviaParser)
.Labelled("character literal");
}
}
diff --git a/src/War3Net.CodeAnalysis.Jass/JassParser/CompilationUnitParser.cs b/src/War3Net.CodeAnalysis.Jass/JassParser/CompilationUnitParser.cs
new file mode 100644
index 00000000..b1685921
--- /dev/null
+++ b/src/War3Net.CodeAnalysis.Jass/JassParser/CompilationUnitParser.cs
@@ -0,0 +1,35 @@
+// ------------------------------------------------------------------------------
+//
+// Licensed under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// ------------------------------------------------------------------------------
+
+using System.Collections.Immutable;
+
+using Pidgin;
+
+using War3Net.CodeAnalysis.Jass.Extensions;
+using War3Net.CodeAnalysis.Jass.Syntax;
+
+using static Pidgin.Parser;
+
+namespace War3Net.CodeAnalysis.Jass
+{
+ internal partial class JassParser
+ {
+ internal static Parser GetCompilationUnitParser(
+ Parser declarationParser,
+ Parser leadingTriviaParser)
+ {
+ return declarationParser.UntilWithLeading(
+ leadingTriviaParser,
+ leadingTriviaParser,
+ End,
+ (leadingTrivia, declaration) => declaration.WithLeadingTrivia(leadingTrivia),
+ (firstTrivia, declarations, lastTrivia, _) => new JassCompilationUnitSyntax(
+ declarations.ToImmutableArray(),
+ new JassSyntaxToken(lastTrivia, JassSyntaxKind.EndOfFileToken, string.Empty, JassSyntaxTriviaList.Empty)).WithLeadingTrivia(firstTrivia));
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/JassParser/DebugStatementParser.cs b/src/War3Net.CodeAnalysis.Jass/JassParser/DebugStatementParser.cs
new file mode 100644
index 00000000..5431dbda
--- /dev/null
+++ b/src/War3Net.CodeAnalysis.Jass/JassParser/DebugStatementParser.cs
@@ -0,0 +1,40 @@
+// ------------------------------------------------------------------------------
+//
+// Licensed under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// ------------------------------------------------------------------------------
+
+using Pidgin;
+
+using War3Net.CodeAnalysis.Jass.Extensions;
+using War3Net.CodeAnalysis.Jass.Syntax;
+
+using static Pidgin.Parser;
+
+namespace War3Net.CodeAnalysis.Jass
+{
+ internal partial class JassParser
+ {
+ internal static Parser GetDebugStatementParser(
+ Parser setStatementParser,
+ Parser callStatementParser,
+ Parser ifStatementParser,
+ Parser loopStatementParser,
+ Parser triviaParser,
+ Parser trailingTriviaParser)
+ {
+ return Map(
+ (debugToken, statement, trailingTrivia) => (JassStatementSyntax)new JassDebugStatementSyntax(
+ debugToken,
+ statement.AppendTrailingTrivia(trailingTrivia)),
+ Keyword.Debug.AsToken(triviaParser, JassSyntaxKind.DebugKeyword),
+ OneOf(
+ setStatementParser,
+ callStatementParser,
+ ifStatementParser,
+ loopStatementParser),
+ trailingTriviaParser);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/Parser/DecimalLiteralExpressionParser.cs b/src/War3Net.CodeAnalysis.Jass/JassParser/DecimalLiteralExpressionParser.cs
similarity index 52%
rename from src/War3Net.CodeAnalysis.Jass/Parser/DecimalLiteralExpressionParser.cs
rename to src/War3Net.CodeAnalysis.Jass/JassParser/DecimalLiteralExpressionParser.cs
index cdae40e6..69c4e3f8 100644
--- a/src/War3Net.CodeAnalysis.Jass/Parser/DecimalLiteralExpressionParser.cs
+++ b/src/War3Net.CodeAnalysis.Jass/JassParser/DecimalLiteralExpressionParser.cs
@@ -1,4 +1,4 @@
-// ------------------------------------------------------------------------------
+// ------------------------------------------------------------------------------
//
// Licensed under the MIT license.
// See the LICENSE file in the project root for more information.
@@ -7,6 +7,7 @@
using Pidgin;
+using War3Net.CodeAnalysis.Jass.Extensions;
using War3Net.CodeAnalysis.Jass.Syntax;
using static Pidgin.Parser;
@@ -15,10 +16,13 @@ namespace War3Net.CodeAnalysis.Jass
{
internal partial class JassParser
{
- internal static Parser GetDecimalLiteralExpressionParser()
+ internal static Parser GetDecimalLiteralExpressionParser(
+ Parser triviaParser)
{
return Try(UnsignedInt(10))
- .Select(value => new JassDecimalLiteralExpressionSyntax(value))
+ .MapWithInput((s, _) => s.ToString())
+ .AsToken(triviaParser, JassSyntaxKind.DecimalLiteralToken)
+ .Map(token => (JassExpressionSyntax)new JassLiteralExpressionSyntax(token))
.Labelled("decimal literal");
}
}
diff --git a/src/War3Net.CodeAnalysis.Jass/JassParser/ElementAccessClauseParser.cs b/src/War3Net.CodeAnalysis.Jass/JassParser/ElementAccessClauseParser.cs
new file mode 100644
index 00000000..8676021e
--- /dev/null
+++ b/src/War3Net.CodeAnalysis.Jass/JassParser/ElementAccessClauseParser.cs
@@ -0,0 +1,33 @@
+// ------------------------------------------------------------------------------
+//
+// Licensed under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// ------------------------------------------------------------------------------
+
+using Pidgin;
+
+using War3Net.CodeAnalysis.Jass.Extensions;
+using War3Net.CodeAnalysis.Jass.Syntax;
+
+using static Pidgin.Parser;
+
+namespace War3Net.CodeAnalysis.Jass
+{
+ internal partial class JassParser
+ {
+ internal static Parser GetElementAccessClauseParser(
+ Parser triviaParser,
+ Parser expressionParser)
+ {
+ return Map(
+ (openBracketToken, expression, closeBracketToken) => new JassElementAccessClauseSyntax(
+ openBracketToken,
+ expression,
+ closeBracketToken),
+ Symbol.OpenBracket.AsToken(triviaParser, JassSyntaxKind.OpenBracketToken, JassSymbol.OpenBracket),
+ expressionParser,
+ Symbol.CloseBracket.AsToken(triviaParser, JassSyntaxKind.CloseBracketToken, JassSymbol.CloseBracket));
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/JassParser/ElseIfClauseDeclaratorParser.cs b/src/War3Net.CodeAnalysis.Jass/JassParser/ElseIfClauseDeclaratorParser.cs
new file mode 100644
index 00000000..2a5a8572
--- /dev/null
+++ b/src/War3Net.CodeAnalysis.Jass/JassParser/ElseIfClauseDeclaratorParser.cs
@@ -0,0 +1,34 @@
+// ------------------------------------------------------------------------------
+//
+// Licensed under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// ------------------------------------------------------------------------------
+
+using Pidgin;
+
+using War3Net.CodeAnalysis.Jass.Extensions;
+using War3Net.CodeAnalysis.Jass.Syntax;
+
+using static Pidgin.Parser;
+
+namespace War3Net.CodeAnalysis.Jass
+{
+ internal partial class JassParser
+ {
+ internal static Parser GetElseIfClauseDeclaratorParser(
+ Parser expressionParser,
+ Parser triviaParser,
+ Parser trailingTriviaParser)
+ {
+ return Map(
+ (elseIfToken, condition, thenToken) => new JassElseIfClauseDeclaratorSyntax(
+ elseIfToken,
+ condition,
+ thenToken),
+ Keyword.ElseIf.AsToken(triviaParser, JassSyntaxKind.ElseIfKeyword),
+ expressionParser,
+ Keyword.Then.AsToken(trailingTriviaParser, JassSyntaxKind.ThenKeyword));
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/JassParser/EqualsValueClauseParser.cs b/src/War3Net.CodeAnalysis.Jass/JassParser/EqualsValueClauseParser.cs
new file mode 100644
index 00000000..f7f0514d
--- /dev/null
+++ b/src/War3Net.CodeAnalysis.Jass/JassParser/EqualsValueClauseParser.cs
@@ -0,0 +1,31 @@
+// ------------------------------------------------------------------------------
+//
+// Licensed under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// ------------------------------------------------------------------------------
+
+using Pidgin;
+
+using War3Net.CodeAnalysis.Jass.Extensions;
+using War3Net.CodeAnalysis.Jass.Syntax;
+
+using static Pidgin.Parser;
+
+namespace War3Net.CodeAnalysis.Jass
+{
+ internal partial class JassParser
+ {
+ internal static Parser GetEqualsValueClauseParser(
+ Parser triviaParser,
+ Parser expressionParser)
+ {
+ return Map(
+ (equalsToken, expression) => new JassEqualsValueClauseSyntax(
+ equalsToken,
+ expression),
+ Symbol.Equals.AsToken(triviaParser, JassSyntaxKind.EqualsToken, JassSymbol.Equals),
+ expressionParser);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/JassParser/ExitStatementParser.cs b/src/War3Net.CodeAnalysis.Jass/JassParser/ExitStatementParser.cs
new file mode 100644
index 00000000..d63d5a70
--- /dev/null
+++ b/src/War3Net.CodeAnalysis.Jass/JassParser/ExitStatementParser.cs
@@ -0,0 +1,33 @@
+// ------------------------------------------------------------------------------
+//
+// Licensed under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// ------------------------------------------------------------------------------
+
+using Pidgin;
+
+using War3Net.CodeAnalysis.Jass.Extensions;
+using War3Net.CodeAnalysis.Jass.Syntax;
+
+using static Pidgin.Parser;
+
+namespace War3Net.CodeAnalysis.Jass
+{
+ internal partial class JassParser
+ {
+ internal static Parser GetExitStatementParser(
+ Parser expressionParser,
+ Parser triviaParser,
+ Parser trailingTriviaParser)
+ {
+ return Map(
+ (exitWhenToken, expression, trailingTrivia) => (JassStatementSyntax)new JassExitStatementSyntax(
+ exitWhenToken,
+ expression.AppendTrailingTrivia(trailingTrivia)),
+ Keyword.ExitWhen.AsToken(triviaParser, JassSyntaxKind.ExitWhenKeyword),
+ expressionParser,
+ trailingTriviaParser);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/JassParser/ExpressionParser.cs b/src/War3Net.CodeAnalysis.Jass/JassParser/ExpressionParser.cs
new file mode 100644
index 00000000..bbc21815
--- /dev/null
+++ b/src/War3Net.CodeAnalysis.Jass/JassParser/ExpressionParser.cs
@@ -0,0 +1,68 @@
+// ------------------------------------------------------------------------------
+//
+// Licensed under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// ------------------------------------------------------------------------------
+
+using Pidgin;
+using Pidgin.Expression;
+
+using War3Net.CodeAnalysis.Jass.Extensions;
+using War3Net.CodeAnalysis.Jass.Parsers;
+using War3Net.CodeAnalysis.Jass.Syntax;
+
+using static Pidgin.Parser;
+
+namespace War3Net.CodeAnalysis.Jass
+{
+ internal partial class JassParser
+ {
+ internal static Parser GetExpressionParser(
+ Parser identifierParser,
+ Parser identifierNameParser,
+ Parser triviaParser)
+ {
+ return Pidgin.Expression.ExpressionParser.Build(
+ expressionParser =>
+ {
+ var argumentListParser = GetArgumentListParser(triviaParser, expressionParser);
+ var elementAccessClauseParser = GetElementAccessClauseParser(triviaParser, expressionParser);
+
+ return (OneOf(
+ GetCharacterLiteralExpressionParser(triviaParser),
+ GetFourCCLiteralExpressionParser(triviaParser),
+ GetHexadecimalLiteralExpressionParser(triviaParser),
+ GetRealLiteralExpressionParser(triviaParser),
+ GetOctalLiteralExpressionParser(triviaParser),
+ GetDecimalLiteralExpressionParser(triviaParser),
+ GetStringLiteralExpressionParser(triviaParser),
+ new IdentifierExpressionParser(
+ identifierParser,
+ identifierNameParser,
+ argumentListParser,
+ elementAccessClauseParser,
+ triviaParser),
+ GetParenthesizedExpressionParser(triviaParser, expressionParser)),
+ new[]
+ {
+ // https://www.hiveworkshop.com/threads/precedence-in-jass.43500/#post-378439
+ Operator.PrefixChainable(GetUnaryNotOperatorParser(triviaParser).Prefix()),
+ Operator.PrefixChainable(GetUnaryPlusOperatorParser(triviaParser).Prefix(), GetUnaryMinusOperatorParser(triviaParser).Prefix()),
+ Operator.InfixL(GetBinaryMultiplicationOperatorParser(triviaParser).Infix())
+ .And(Operator.InfixL(GetBinaryDivisionOperatorParser(triviaParser).Infix())),
+ Operator.InfixL(GetBinaryAddOperatorParser(triviaParser).Infix())
+ .And(Operator.InfixL(GetBinarySubtractOperatorParser(triviaParser).Infix())),
+ Operator.InfixL(GetBinaryGreaterOrEqualOperatorParser(triviaParser).Infix())
+ .And(Operator.InfixL(GetBinaryLessOrEqualOperatorParser(triviaParser).Infix()))
+ .And(Operator.InfixL(GetBinaryEqualsOperatorParser(triviaParser).Infix()))
+ .And(Operator.InfixL(GetBinaryNotEqualsOperatorParser(triviaParser).Infix()))
+ .And(Operator.InfixL(GetBinaryGreaterThanOperatorParser(triviaParser).Infix()))
+ .And(Operator.InfixL(GetBinaryLessThanOperatorParser(triviaParser).Infix())),
+ Operator.InfixL(GetBinaryAndOperatorParser(triviaParser).Infix())
+ .And(Operator.InfixL(GetBinaryOrOperatorParser(triviaParser).Infix())),
+ });
+ });
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/Parser/FourCCLiteralExpressionParser.cs b/src/War3Net.CodeAnalysis.Jass/JassParser/FourCCLiteralExpressionParser.cs
similarity index 51%
rename from src/War3Net.CodeAnalysis.Jass/Parser/FourCCLiteralExpressionParser.cs
rename to src/War3Net.CodeAnalysis.Jass/JassParser/FourCCLiteralExpressionParser.cs
index 0b3191c5..94b5cd84 100644
--- a/src/War3Net.CodeAnalysis.Jass/Parser/FourCCLiteralExpressionParser.cs
+++ b/src/War3Net.CodeAnalysis.Jass/JassParser/FourCCLiteralExpressionParser.cs
@@ -1,4 +1,4 @@
-// ------------------------------------------------------------------------------
+// ------------------------------------------------------------------------------
//
// Licensed under the MIT license.
// See the LICENSE file in the project root for more information.
@@ -16,11 +16,14 @@ namespace War3Net.CodeAnalysis.Jass
{
internal partial class JassParser
{
- internal static Parser GetFourCCLiteralExpressionParser()
+ internal static Parser GetFourCCLiteralExpressionParser(
+ Parser triviaParser)
{
- return Symbol.Apostrophe.Then(AnyCharExcept(JassSymbol.Apostrophe).ManyString()).Before(Symbol.Apostrophe)
+ return Symbol.SingleQuote.Then(AnyCharExcept(JassSymbol.SingleQuoteChar).ManyString()).Before(Symbol.SingleQuote)
.Assert(value => value.IsJassRawcode())
- .Select(value => new JassFourCCLiteralExpressionSyntax(value.FromJassRawcode()))
+ .MapWithInput((s, _) => s.ToString())
+ .AsToken(triviaParser, JassSyntaxKind.FourCCLiteralToken)
+ .Map(token => (JassExpressionSyntax)new JassLiteralExpressionSyntax(token))
.Labelled("fourCC literal");
}
}
diff --git a/src/War3Net.CodeAnalysis.Jass/JassParser/FunctionDeclarationParser.cs b/src/War3Net.CodeAnalysis.Jass/JassParser/FunctionDeclarationParser.cs
new file mode 100644
index 00000000..b428ffd0
--- /dev/null
+++ b/src/War3Net.CodeAnalysis.Jass/JassParser/FunctionDeclarationParser.cs
@@ -0,0 +1,37 @@
+// ------------------------------------------------------------------------------
+//
+// Licensed under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// ------------------------------------------------------------------------------
+
+using System;
+using System.Collections.Immutable;
+
+using Pidgin;
+
+using War3Net.CodeAnalysis.Jass.Extensions;
+using War3Net.CodeAnalysis.Jass.Syntax;
+
+namespace War3Net.CodeAnalysis.Jass
+{
+ internal partial class JassParser
+ {
+ internal static Parser, JassTopLevelDeclarationSyntax>> GetFunctionDeclarationParser(
+ Parser, JassFunctionDeclaratorSyntax>> functionDeclaratorParser,
+ Parser statementParser,
+ Parser leadingTriviaParser,
+ Parser trailingTriviaParser)
+ {
+ return statementParser.UntilWithLeading, JassFunctionDeclaratorSyntax>, JassStatementSyntax, JassSyntaxToken, Func, JassTopLevelDeclarationSyntax>>(
+ leadingTriviaParser,
+ functionDeclaratorParser,
+ Keyword.EndFunction.AsToken(trailingTriviaParser, JassSyntaxKind.EndFunctionKeyword),
+ (leadingTrivia, statement) => statement.WithLeadingTrivia(leadingTrivia),
+ (declaratorFunc, statements, leadingTrivia, endFunctionToken) => constantToken => new JassFunctionDeclarationSyntax(
+ declaratorFunc(constantToken),
+ statements.ToImmutableArray(),
+ endFunctionToken.WithLeadingTrivia(leadingTrivia)));
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/JassParser/FunctionDeclaratorParser.cs b/src/War3Net.CodeAnalysis.Jass/JassParser/FunctionDeclaratorParser.cs
new file mode 100644
index 00000000..ec7ba2df
--- /dev/null
+++ b/src/War3Net.CodeAnalysis.Jass/JassParser/FunctionDeclaratorParser.cs
@@ -0,0 +1,42 @@
+// ------------------------------------------------------------------------------
+//
+// Licensed under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// ------------------------------------------------------------------------------
+
+using System;
+
+using Pidgin;
+
+using War3Net.CodeAnalysis.Jass.Extensions;
+using War3Net.CodeAnalysis.Jass.Syntax;
+
+using static Pidgin.Parser;
+
+namespace War3Net.CodeAnalysis.Jass
+{
+ internal partial class JassParser
+ {
+ internal static Parser, JassFunctionDeclaratorSyntax>> GetFunctionDeclaratorParser(
+ Parser identifierNameParser,
+ Parser parameterListParser,
+ Parser returnClauseParser,
+ Parser triviaParser,
+ Parser trailingTriviaParser)
+ {
+ return Map, JassFunctionDeclaratorSyntax>>(
+ (functionToken, identifierName, parameterList, returnClause, trailingTrivia) => constantToken => new JassFunctionDeclaratorSyntax(
+ constantToken.GetValueOrDefault(),
+ functionToken,
+ identifierName,
+ parameterList,
+ returnClause.AppendTrailingTrivia(trailingTrivia)),
+ Keyword.Function.AsToken(triviaParser, JassSyntaxKind.FunctionKeyword),
+ identifierNameParser,
+ parameterListParser,
+ returnClauseParser,
+ trailingTriviaParser);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/JassParser/GlobalConstantDeclarationParser.cs b/src/War3Net.CodeAnalysis.Jass/JassParser/GlobalConstantDeclarationParser.cs
new file mode 100644
index 00000000..b7401b7b
--- /dev/null
+++ b/src/War3Net.CodeAnalysis.Jass/JassParser/GlobalConstantDeclarationParser.cs
@@ -0,0 +1,39 @@
+// ------------------------------------------------------------------------------
+//
+// Licensed under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// ------------------------------------------------------------------------------
+
+using Pidgin;
+
+using War3Net.CodeAnalysis.Jass.Extensions;
+using War3Net.CodeAnalysis.Jass.Syntax;
+
+using static Pidgin.Parser;
+
+namespace War3Net.CodeAnalysis.Jass
+{
+ internal partial class JassParser
+ {
+ internal static Parser GetGlobalConstantDeclarationParser(
+ Parser equalsValueClauseParser,
+ Parser identifierNameParser,
+ Parser typeParser,
+ Parser triviaParser,
+ Parser trailingTriviaParser)
+ {
+ return Map(
+ (constantToken, type, identifierName, value, trailingTrivia) => (JassGlobalDeclarationSyntax)new JassGlobalConstantDeclarationSyntax(
+ constantToken,
+ type,
+ identifierName,
+ value.AppendTrailingTrivia(trailingTrivia)),
+ Keyword.Constant.AsToken(triviaParser, JassSyntaxKind.ConstantKeyword),
+ typeParser,
+ identifierNameParser,
+ equalsValueClauseParser,
+ trailingTriviaParser);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/JassParser/GlobalDeclarationParser.cs b/src/War3Net.CodeAnalysis.Jass/JassParser/GlobalDeclarationParser.cs
new file mode 100644
index 00000000..009143f6
--- /dev/null
+++ b/src/War3Net.CodeAnalysis.Jass/JassParser/GlobalDeclarationParser.cs
@@ -0,0 +1,27 @@
+// ------------------------------------------------------------------------------
+//
+// Licensed under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// ------------------------------------------------------------------------------
+
+using Pidgin;
+
+using War3Net.CodeAnalysis.Jass.Syntax;
+
+using static Pidgin.Parser;
+
+namespace War3Net.CodeAnalysis.Jass
+{
+ internal partial class JassParser
+ {
+ internal static Parser GetGlobalDeclarationParser(
+ Parser globalConstantDeclarationParser,
+ Parser globalVariableDeclarationParser)
+ {
+ return OneOf(
+ globalConstantDeclarationParser,
+ globalVariableDeclarationParser);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/JassParser/GlobalVariableDeclarationParser.cs b/src/War3Net.CodeAnalysis.Jass/JassParser/GlobalVariableDeclarationParser.cs
new file mode 100644
index 00000000..dfa3bb4b
--- /dev/null
+++ b/src/War3Net.CodeAnalysis.Jass/JassParser/GlobalVariableDeclarationParser.cs
@@ -0,0 +1,29 @@
+// ------------------------------------------------------------------------------
+//
+// Licensed under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// ------------------------------------------------------------------------------
+
+using Pidgin;
+
+using War3Net.CodeAnalysis.Jass.Extensions;
+using War3Net.CodeAnalysis.Jass.Syntax;
+
+using static Pidgin.Parser;
+
+namespace War3Net.CodeAnalysis.Jass
+{
+ internal partial class JassParser
+ {
+ internal static Parser GetGlobalVariableDeclarationParser(
+ Parser variableOrArrayDeclaratorParser,
+ Parser trailingTriviaParser)
+ {
+ return Map(
+ (declarator, trailingTrivia) => (JassGlobalDeclarationSyntax)new JassGlobalVariableDeclarationSyntax(declarator.AppendTrailingTrivia(trailingTrivia)),
+ variableOrArrayDeclaratorParser,
+ trailingTriviaParser);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/War3Net.CodeAnalysis.Jass/JassParser/GlobalsDeclarationParser.cs b/src/War3Net.CodeAnalysis.Jass/JassParser/GlobalsDeclarationParser.cs
new file mode 100644
index 00000000..04413f9c
--- /dev/null
+++ b/src/War3Net.CodeAnalysis.Jass/JassParser/GlobalsDeclarationParser.cs
@@ -0,0 +1,35 @@
+// ------------------------------------------------------------------------------
+//
+// Licensed under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// ------------------------------------------------------------------------------
+
+using System.Collections.Immutable;
+
+using Pidgin;
+
+using War3Net.CodeAnalysis.Jass.Extensions;
+using War3Net.CodeAnalysis.Jass.Syntax;
+
+namespace War3Net.CodeAnalysis.Jass
+{
+ internal partial class JassParser
+ {
+ internal static Parser GetGlobalsDeclarationParser(
+ Parser globalDeclarationParser,
+ Parser