UNPKG

plaxtony

Version:

Static code analysis of SC2 Galaxy Script

784 lines (666 loc) 19.2 kB
import * as lsp from 'vscode-languageserver'; /* @internal */ export const enum CharacterCodes { nullCharacter = 0, maxAsciiCharacter = 0x7F, lineFeed = 0x0A, // \n carriageReturn = 0x0D, // \r lineSeparator = 0x2028, paragraphSeparator = 0x2029, nextLine = 0x0085, // Unicode 3.0 space characters space = 0x0020, // " " nonBreakingSpace = 0x00A0, // enQuad = 0x2000, emQuad = 0x2001, enSpace = 0x2002, emSpace = 0x2003, threePerEmSpace = 0x2004, fourPerEmSpace = 0x2005, sixPerEmSpace = 0x2006, figureSpace = 0x2007, punctuationSpace = 0x2008, thinSpace = 0x2009, hairSpace = 0x200A, zeroWidthSpace = 0x200B, narrowNoBreakSpace = 0x202F, ideographicSpace = 0x3000, mathematicalSpace = 0x205F, ogham = 0x1680, _ = 0x5F, $ = 0x24, _0 = 0x30, _1 = 0x31, _2 = 0x32, _3 = 0x33, _4 = 0x34, _5 = 0x35, _6 = 0x36, _7 = 0x37, _8 = 0x38, _9 = 0x39, a = 0x61, b = 0x62, c = 0x63, d = 0x64, e = 0x65, f = 0x66, g = 0x67, h = 0x68, i = 0x69, j = 0x6A, k = 0x6B, l = 0x6C, m = 0x6D, n = 0x6E, o = 0x6F, p = 0x70, q = 0x71, r = 0x72, s = 0x73, t = 0x74, u = 0x75, v = 0x76, w = 0x77, x = 0x78, y = 0x79, z = 0x7A, A = 0x41, B = 0x42, C = 0x43, D = 0x44, E = 0x45, F = 0x46, G = 0x47, H = 0x48, I = 0x49, J = 0x4A, K = 0x4B, L = 0x4C, M = 0x4D, N = 0x4E, O = 0x4F, P = 0x50, Q = 0x51, R = 0x52, S = 0x53, T = 0x54, U = 0x55, V = 0x56, W = 0x57, X = 0x58, Y = 0x59, Z = 0x5a, ampersand = 0x26, // & asterisk = 0x2A, // * at = 0x40, // @ backslash = 0x5C, // \ backtick = 0x60, // ` bar = 0x7C, // | caret = 0x5E, // ^ closeBrace = 0x7D, // } closeBracket = 0x5D, // ] closeParen = 0x29, // ) colon = 0x3A, // : comma = 0x2C, // , dot = 0x2E, // . doubleQuote = 0x22, // " equals = 0x3D, // = exclamation = 0x21, // ! greaterThan = 0x3E, // > hash = 0x23, // # lessThan = 0x3C, // < minus = 0x2D, // - openBrace = 0x7B, // { openBracket = 0x5B, // [ openParen = 0x28, // ( percent = 0x25, // % plus = 0x2B, // + question = 0x3F, // ? semicolon = 0x3B, // ; singleQuote = 0x27, // ' slash = 0x2F, // / tilde = 0x7E, // ~ backspace = 0x08, // \b formFeed = 0x0C, // \f byteOrderMark = 0xFEFF, tab = 0x09, // \t verticalTab = 0x0B, // \v } export const enum SyntaxKind { Unknown, SingleLineCommentTrivia, // Literals NumericLiteral, StringLiteral, // Punctuation OpenBraceToken, CloseBraceToken, OpenParenToken, CloseParenToken, OpenBracketToken, CloseBracketToken, DotToken, SemicolonToken, CommaToken, // Comparison LessThanToken, GreaterThanToken, LessThanEqualsToken, GreaterThanEqualsToken, EqualsEqualsToken, ExclamationEqualsToken, EqualsGreaterThanToken, PlusToken, MinusToken, AsteriskToken, SlashToken, PercentToken, PlusPlusToken, MinusMinusToken, LessThanLessThanToken, GreaterThanGreaterThanToken, AmpersandToken, BarToken, CaretToken, ExclamationToken, TildeToken, AmpersandAmpersandToken, BarBarToken, QuestionToken, ColonToken, AtToken, // Assignments EqualsToken, PlusEqualsToken, MinusEqualsToken, AsteriskEqualsToken, SlashEqualsToken, PercentEqualsToken, LessThanLessThanEqualsToken, GreaterThanGreaterThanEqualsToken, AmpersandEqualsToken, BarEqualsToken, CaretEqualsToken, // Reserved words IncludeKeyword, StructKeyword, StaticKeyword, ConstKeyword, NativeKeyword, BreakKeyword, ContinueKeyword, BreakpointKeyword, ReturnKeyword, SwitchKeyword, // CaseKeyword, DefaultKeyword, NewKeyword, DoKeyword, ForKeyword, WhileKeyword, IfKeyword, ElseKeyword, TrueKeyword, FalseKeyword, NullKeyword, TypedefKeyword, // Basic types BoolKeyword, ByteKeyword, CharKeyword, IntKeyword, FixedKeyword, StringKeyword, // Native complex types AbilcmdKeyword, ActorKeyword, ActorscopeKeyword, AifilterKeyword, BankKeyword, BitmaskKeyword, CamerainfoKeyword, ColorKeyword, DatetimeKeyword, DoodadKeyword, HandleKeyword, GenerichandleKeyword, EffecthistoryKeyword, MarkerKeyword, OrderKeyword, PlayergroupKeyword, PointKeyword, RegionKeyword, RevealerKeyword, SoundKeyword, SoundlinkKeyword, TextKeyword, TimerKeyword, TransmissionsourceKeyword, TriggerKeyword, UnitKeyword, UnitfilterKeyword, UnitgroupKeyword, UnitrefKeyword, VoidKeyword, WaveKeyword, WaveinfoKeyword, WavetargetKeyword, // Ref types ArrayrefKeyword, StructrefKeyword, FuncrefKeyword, // Identifier, EndOfFileToken, // Elements TypeReference, MappedType, ArrayType, ArrayLiteralExpression, ElementAccessExpression, PropertyAccessExpression, CallExpression, PrefixUnaryExpression, PostfixUnaryExpression, BinaryExpression, TypeAssertionExpression, ParenthesizedExpression, SourceFile, Block, IfStatement, DoStatement, WhileStatement, ForStatement, BreakStatement, ContinueStatement, BreakpointStatement, IncludeStatement, ReturnStatement, ExpressionStatement, EmptyStatement, StructDeclaration, VariableDeclaration, FunctionDeclaration, ParameterDeclaration, PropertyDeclaration, TypedefDeclaration, } export const enum SyntaxKindMarker { FirstToken = SyntaxKind.NumericLiteral, LastToken = SyntaxKind.Identifier, FirstKeyword = SyntaxKind.IncludeKeyword, LastKeyword = SyntaxKind.FuncrefKeyword, FirstBasicType = SyntaxKind.BoolKeyword, LastBasicType = SyntaxKind.StringKeyword, FirstComplexType = SyntaxKind.AbilcmdKeyword, LastComplexType = SyntaxKind.WavetargetKeyword, FirstTypeNode = SyntaxKind.TypeReference, LastTypeNode = SyntaxKind.ArrayType, FirstKeywordType = SyntaxKind.BoolKeyword, LastKeywordType = SyntaxKind.ArrayType, }; export type Modifier = Token<SyntaxKind.ConstKeyword> | Token<SyntaxKind.NativeKeyword> | Token<SyntaxKind.StaticKeyword> ; export const enum SymbolFlags { None = 0, LocalVariable = 1 << 1, FunctionParameter = 1 << 2, GlobalVariable = 1 << 3, Property = 1 << 4, Function = 1 << 5, Struct = 1 << 6, Typedef = 1 << 7, Static = 1 << 10, Native = 1 << 11, Variable = LocalVariable | FunctionParameter | GlobalVariable, FunctionScopedVariable = LocalVariable | FunctionParameter, } export interface Symbol { id?: number; flags: SymbolFlags; // Symbol flags escapedName: string; // Name of symbol declarations: Declaration[]; // Declarations associated with this symbol valueDeclaration?: Declaration; // First value declaration of the symbol members?: SymbolTable; // members target?: Symbol; // Resolved (non-alias) target of an alias /* @internal */ parent?: Symbol; // Parent symbol /* @internal */ isReferenced?: boolean; // True if the symbol is referenced elsewhere /* @internal */ isAssigned?: boolean; // True if the symbol is a parameter with assignments } export type SymbolTable = Map<string, Symbol>; export const enum TypeFlags { Unknown = 1 << 0, String = 1 << 1, Integer = 1 << 2, Byte = 1 << 3, Char = 1 << 4, Fixed = 1 << 5, Boolean = 1 << 6, Nullable = 1 << 7, StringLiteral = 1 << 8, NumericLiteral = 1 << 9, BooleanLiteral = 1 << 10, Void = 1 << 11, Null = 1 << 12, Struct = 1 << 13, Function = 1 << 14, Complex = 1 << 15, Array = 1 << 16, Mapped = 1 << 17, Reference = 1 << 18, Typedef = 1 << 21, True = 1 << 22, False = 1 << 23, /* @internal */ Literal = StringLiteral | NumericLiteral | BooleanLiteral, IntLike = Integer | Byte, Numeric = Integer | Byte | Fixed, } export interface Type { flags: TypeFlags; // Flags symbol?: Symbol; // Symbol associated with type (if any) } // String literal types (TypeFlags.StringLiteral) // Numeric literal types (TypeFlags.NumberLiteral) export interface LiteralType extends Type { value: string | number; // Value of literal freshType?: LiteralType; // Fresh version of type regularType?: LiteralType; // Regular version of type } export interface StringLiteralType extends LiteralType { value: string; } export interface NumberLiteralType extends LiteralType { value: number; } export interface StructType extends Type { } export interface FunctionType extends Type { } export interface TypedefType extends Type { // aliasOf: Type; referencedType: Type; } export interface ArrayType extends Type { elementType: Type; } export interface MappedType extends Type { returnType: Type; referencedType: Type; } export interface ComplexType extends Type { kind: SyntaxKind; } export const enum NodeCheckFlags { TypeChecked = 1 << 0, // Node has been type checked ContextChecked = 1 << 1, // Contextual types have been assigned } /* @internal */ export interface NodeLinks { flags?: NodeCheckFlags; // Set of flags specific to Node resolvedType?: Type; // Cached type of type node resolvedSymbol?: Symbol; // Cached name resolution result } export interface TextRange { line: number; char: number; pos: number; end: number; } export interface Token<TKind extends SyntaxKind> extends Node { kind: TKind; } export interface Node extends TextRange { // token: Token; id?: number; kind: SyntaxKind; /* @internal */ kindName?: string; // debug purposes parent?: Node; syntaxTokens: Node[]; } export interface NodeArray<T extends Node> extends ReadonlyArray<T>, TextRange { } export type MutableNodeArray<T extends Node> = NodeArray<T> & T[]; export interface Statement extends Node { // kind: SyntaxKind.Identifier; } export interface ExpressionStatement extends Statement { kind: SyntaxKind.ExpressionStatement; expression: Expression; } export interface EmptyStatement extends Statement { kind: SyntaxKind.EmptyStatement; } export interface Block extends Statement { kind: SyntaxKind.Block; statements: NodeArray<Statement>; /* @internal */ hasReturn?: boolean; } export interface IncludeStatement extends Statement { kind: SyntaxKind.IncludeStatement; path: StringLiteral; } export interface TypeNode extends Node { symbol?: Symbol; // Symbol associated with type (if any) } export interface ArrayTypeNode extends TypeNode { kind: SyntaxKind.ArrayType; elementType: TypeNode; size: Expression; } export interface MappedTypeNode extends TypeNode { kind: SyntaxKind.MappedType; returnType: TypeNode; typeArguments?: NodeArray<TypeNode>; } export interface Declaration extends Node { // name?: Identifier; modifiers?: NodeArray<Modifier>; /* @internal */ symbol?: Symbol; // Symbol declared by node (initialized by binding) } export interface NamedDeclaration extends Declaration { name: Identifier; } export interface ParameterDeclaration extends NamedDeclaration { kind: SyntaxKind.ParameterDeclaration; type: TypeNode; } export interface SignatureDeclaration extends Declaration { type: TypeNode; parameters: NodeArray<ParameterDeclaration>; } export interface VariableDeclaration extends NamedDeclaration { kind: SyntaxKind.VariableDeclaration; type: TypeNode; initializer?: Expression; } export interface StructDeclaration extends NamedDeclaration { kind: SyntaxKind.StructDeclaration; members: NodeArray<PropertyDeclaration>; } export interface PropertyDeclaration extends NamedDeclaration { kind: SyntaxKind.PropertyDeclaration; type: TypeNode; } export interface FunctionDeclaration extends SignatureDeclaration, NamedDeclaration { kind: SyntaxKind.FunctionDeclaration; body?: Block; } export interface TypedefDeclaration extends NamedDeclaration { kind: SyntaxKind.TypedefDeclaration; type: TypeNode; } export interface ReturnStatement extends Statement { kind: SyntaxKind.ReturnStatement; expression?: Expression; } export interface SourceFile extends Declaration { kind: SyntaxKind.SourceFile; fileName: string; statements: NodeArray<Statement>; lineMap: number[]; commentsLineMap: Map<number, Token<SyntaxKind.SingleLineCommentTrivia>>; /* @internal */ text: string; /* @internal */ parseDiagnostics: Diagnostic[]; // File-level diagnostics reported by the parser /* @internal */ bindDiagnostics: Diagnostic[]; // File-level diagnostics reported by the binder. /* @internal */ additionalSyntacticDiagnostics: Diagnostic[]; // Stores additional file-level diagnostics reported by the program } export interface Expression extends Node { } export interface ParenthesizedExpression extends PrimaryExpression { kind: SyntaxKind.ParenthesizedExpression; expression: Expression; } export interface Literal extends Expression { value?: string; text?: string; } export interface StringLiteral extends Literal { kind: SyntaxKind.StringLiteral; } export interface NumericLiteral extends Literal { kind: SyntaxKind.NumericLiteral; } export interface Identifier extends PrimaryExpression { kind: SyntaxKind.Identifier; name: string; resolvedSymbol?: Symbol; } export type EntityNameExpression = Identifier | PropertyAccessExpression | ParenthesizedExpression; export type PrefixUnaryOperator = SyntaxKind.MinusToken | SyntaxKind.PlusToken | SyntaxKind.TildeToken | SyntaxKind.ExclamationToken | SyntaxKind.MinusMinusToken | SyntaxKind.PlusPlusToken ; export type PostfixUnaryOperator = SyntaxKind.PlusPlusToken | SyntaxKind.MinusMinusToken ; export type BinaryOperator = SyntaxKind.MinusToken | SyntaxKind.PlusToken | SyntaxKind.AsteriskToken | SyntaxKind.SlashToken | SyntaxKind.PercentToken | SyntaxKind.AmpersandToken | SyntaxKind.BarToken | SyntaxKind.CaretToken | SyntaxKind.LessThanLessThanToken | SyntaxKind.GreaterThanGreaterThanToken | SyntaxKind.BarBarToken | SyntaxKind.AmpersandAmpersandToken ; export type BinaryOperatorToken = Token<BinaryOperator>; export interface UpdateExpression extends UnaryExpression { } export interface LeftHandSideExpression extends UpdateExpression { } export interface MemberExpression extends LeftHandSideExpression { } export interface PrimaryExpression extends MemberExpression { } export interface UnaryExpression extends Expression { } export interface BinaryExpression extends Expression { kind: SyntaxKind.BinaryExpression; left: Expression; operatorToken: Token<BinaryOperator>; right: Expression; } export interface PrefixUnaryExpression extends UnaryExpression { kind: SyntaxKind.PrefixUnaryExpression; operator: Token<PrefixUnaryOperator>; operand: UnaryExpression; } export interface PostfixUnaryExpression extends UnaryExpression { kind: SyntaxKind.PostfixUnaryExpression; operand: LeftHandSideExpression; operator: Token<PostfixUnaryOperator>; } export interface ElementAccessExpression extends MemberExpression { kind: SyntaxKind.ElementAccessExpression; expression: LeftHandSideExpression; argumentExpression: Expression; } export interface SymbolLink { symbolLink: Symbol; } export interface PropertyAccessExpression extends MemberExpression, NamedDeclaration { kind: SyntaxKind.PropertyAccessExpression; expression: LeftHandSideExpression; name: Identifier; } export interface CallExpression extends LeftHandSideExpression, Declaration { kind: SyntaxKind.CallExpression; expression: LeftHandSideExpression; arguments: NodeArray<Expression>; } export interface BreakStatement extends Statement { kind: SyntaxKind.BreakStatement; } export interface ContinueStatement extends Statement { kind: SyntaxKind.ContinueStatement; } export type BreakOrContinueStatement = BreakStatement | ContinueStatement; export interface BreakpointStatement extends Statement { kind: SyntaxKind.BreakpointStatement; } export interface IfStatement extends Statement { kind: SyntaxKind.IfStatement; expression: Expression; thenStatement: Statement; elseStatement?: Statement; /* @internal */ hasReturn?: boolean; } export interface IterationStatement extends Statement { statement: Statement; } export interface DoStatement extends IterationStatement { kind: SyntaxKind.DoStatement; expression: Expression; } export interface WhileStatement extends IterationStatement { kind: SyntaxKind.WhileStatement; expression: Expression; } export interface ForStatement extends IterationStatement { kind: SyntaxKind.ForStatement; initializer?: Expression; condition?: Expression; incrementor?: Expression; } // // Diagnostics // export enum DiagnosticCategory { Error = 1, Warning = 2, Message = 3, Hint = 4, } export interface DiagnosticMessage { // key: string; category: DiagnosticCategory; code: number; message: string; } export interface Diagnostic { file?: SourceFile; start?: number; length?: number; messageText: string; category: DiagnosticCategory; tags?: lsp.DiagnosticTag[]; code: number; source?: string; line?: number; col?: number; toString(): string; }