@rsconcept/domain 1.7.5 → 1.7.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  import { t as AstNode } from "./ast-C8sIpKdL.js";
2
2
  import { f as ExpressionType, g as TypeClass } from "./typification-DDuv88ir.js";
3
- import { i as RSErrorDescription } from "./error-toW0TUHF.js";
3
+ import { i as RSErrorDescription } from "./error-CzIbnP-N.js";
4
4
  import { t as ValueClass } from "./value-class-CNI-lqXJ.js";
5
5
 
6
6
  //#region src/rslang/semantic/analyzer.d.ts
@@ -36,4 +36,4 @@ declare class RSLangAnalyzer {
36
36
  }
37
37
  //#endregion
38
38
  export { RSLangAnalyzer as a, AnalysisOptions as i, AnalysisFast as n, AnalysisFull as r, AnalysisBase as t };
39
- //# sourceMappingURL=analyzer-BiQEKLHB.d.ts.map
39
+ //# sourceMappingURL=analyzer-DqjdciC5.d.ts.map
@@ -1,6 +1,6 @@
1
1
  import { t as AstNode } from "./ast-C8sIpKdL.js";
2
2
  import { f as ExpressionType } from "./typification-DDuv88ir.js";
3
- import { a as RSErrorInfo, r as RSErrorCode } from "./error-toW0TUHF.js";
3
+ import { a as RSErrorInfo, r as RSErrorCode } from "./error-CzIbnP-N.js";
4
4
 
5
5
  //#region src/rslang/ast-annotations.d.ts
6
6
  /** Appends {@link ExpressionType} onto the node's `annotation.rsType`. */
@@ -13,4 +13,4 @@ declare function annotateError(node: AstNode, code: RSErrorCode, params?: readon
13
13
  declare function readErrorAnnotation(node: AstNode): RSErrorInfo | null;
14
14
  //#endregion
15
15
  export { readTypeAnnotation as i, annotateType as n, readErrorAnnotation as r, annotateError as t };
16
- //# sourceMappingURL=ast-annotations-Bb5TBP_P.d.ts.map
16
+ //# sourceMappingURL=ast-annotations-CZCzs9Uk.d.ts.map
@@ -1,6 +1,6 @@
1
1
  import { t as AstNode } from "./ast-C8sIpKdL.js";
2
2
  import { f as ExpressionType } from "./typification-DDuv88ir.js";
3
- import { i as RSErrorDescription } from "./error-toW0TUHF.js";
3
+ import { i as RSErrorDescription } from "./error-CzIbnP-N.js";
4
4
  import { l as Value } from "./value-BduA_ZGp.js";
5
5
 
6
6
  //#region src/rslang/eval/calculator.d.ts
@@ -36,4 +36,4 @@ declare class RSCalculator {
36
36
  }
37
37
  //#endregion
38
38
  export { CalculatorResult as n, RSCalculator as r, CalculatorEvaluateOptions as t };
39
- //# sourceMappingURL=calculator-h1kKnZ17.d.ts.map
39
+ //# sourceMappingURL=calculator-Dt03dsnd.d.ts.map
@@ -44,11 +44,11 @@ declare const RSErrorCode: {
44
44
  readonly expectedArgument: 33827;
45
45
  readonly expectedLocal: 33813;
46
46
  readonly expectedType: 33814;
47
- readonly localDoubleDeclare: 10241;
48
47
  readonly localNotUsed: 10242;
49
48
  readonly localUndeclared: 34817;
50
49
  readonly localShadowing: 34818;
51
- readonly typesNotEqual: 34819;
50
+ readonly localDoubleDeclare: 34819;
51
+ readonly typesNotEqual: 34826;
52
52
  readonly globalNotTyped: 34820;
53
53
  readonly invalidDecart: 34821;
54
54
  readonly invalidBoolean: 34822;
@@ -106,4 +106,4 @@ declare function getRSErrorPrefix(code: RSErrorCode): string;
106
106
  declare function isCritical(code: RSErrorCode): boolean;
107
107
  //#endregion
108
108
  export { RSErrorInfo as a, RSErrorDescription as i, RSErrorClass as n, getRSErrorPrefix as o, RSErrorCode as r, isCritical as s, ErrorReporter as t };
109
- //# sourceMappingURL=error-toW0TUHF.d.ts.map
109
+ //# sourceMappingURL=error-CzIbnP-N.d.ts.map
package/dist/index.d.ts CHANGED
@@ -9,15 +9,15 @@ import { a as TOKEN_ERROR, c as flattenAst, d as printAst, f as visitAstDFS, i a
9
9
  import { t as Branded } from "./branded-ZlzIcxzu.js";
10
10
  import { n as generateStub, t as applyHash_fnv1a } from "./hash-Y8I4c6Al.js";
11
11
  import { b as Typification, d as EmptySetT, f as ExpressionType, g as TypeClass, k as makeTypePath, m as LogicT, t as AnyTypificationT, v as TypeID, y as TypePath } from "./typification-DDuv88ir.js";
12
- import { i as RSErrorDescription, r as RSErrorCode } from "./error-toW0TUHF.js";
13
- import { i as readTypeAnnotation, r as readErrorAnnotation } from "./ast-annotations-Bb5TBP_P.js";
12
+ import { i as RSErrorDescription, r as RSErrorCode } from "./error-CzIbnP-N.js";
13
+ import { i as readTypeAnnotation, r as readErrorAnnotation } from "./ast-annotations-CZCzs9Uk.js";
14
14
  import { d as ValuePath, l as Value, o as TUPLE_ID, p as makeValuePath } from "./value-BduA_ZGp.js";
15
- import { n as CalculatorResult, r as RSCalculator, t as CalculatorEvaluateOptions } from "./calculator-h1kKnZ17.js";
15
+ import { n as CalculatorResult, r as RSCalculator, t as CalculatorEvaluateOptions } from "./calculator-Dt03dsnd.js";
16
16
  import { d as printValue } from "./value-api-C2X4Pom5.js";
17
17
  import { t as parser } from "./parser-Bwd8LxJ1.js";
18
18
  import { t as TokenID } from "./token-DeXAmzwr.js";
19
19
  import { t as ValueClass } from "./value-class-CNI-lqXJ.js";
20
- import { a as RSLangAnalyzer, n as AnalysisFast, r as AnalysisFull, t as AnalysisBase } from "./analyzer-BiQEKLHB.js";
20
+ import { a as RSLangAnalyzer, n as AnalysisFast, r as AnalysisFull, t as AnalysisBase } from "./analyzer-DqjdciC5.js";
21
21
  import { n as ArgumentsType } from "./arguments-extractor-Dd1lFom9.js";
22
22
  import { n as applyAsciiTypeSubstitutions, r as parseTypeText } from "./typification-parser-DHO42ZRc.js";
23
23
  import { n as TypificationNodeData, t as TypificationGraph } from "./typification-graph-8VdK6_Fh.js";
@@ -1,6 +1,6 @@
1
1
  import { t as AstNode } from "../ast-C8sIpKdL.js";
2
2
  import { l as Value } from "../value-BduA_ZGp.js";
3
- import { n as CalculatorResult, r as RSCalculator, t as CalculatorEvaluateOptions } from "../calculator-h1kKnZ17.js";
3
+ import { n as CalculatorResult, r as RSCalculator, t as CalculatorEvaluateOptions } from "../calculator-Dt03dsnd.js";
4
4
  import { CstType, RSForm } from "./rsform.js";
5
5
  import { BasicBinding, BasicsContext, EvalStatus, RSModel } from "./rsmodel.js";
6
6
 
@@ -1,7 +1,7 @@
1
1
  import { r as LibraryItem } from "../library-CYun28Xz.js";
2
2
  import { g as TypeClass, y as TypePath } from "../typification-DDuv88ir.js";
3
3
  import { t as ValueClass } from "../value-class-CNI-lqXJ.js";
4
- import { r as AnalysisFull } from "../analyzer-BiQEKLHB.js";
4
+ import { r as AnalysisFull } from "../analyzer-DqjdciC5.js";
5
5
  import { ArgumentValue, Constituenta, CstClass, CstStatus, CstType, RSForm, RSFormStats } from "./rsform.js";
6
6
  import { AliasMapping } from "../rslang/api.js";
7
7
 
@@ -1,7 +1,7 @@
1
1
  import { t as Graph } from "../graph-DR8rL2o3.js";
2
2
  import { i as LibraryItemReference, n as CurrentVersion, r as LibraryItem, s as VersionInfo } from "../library-CYun28Xz.js";
3
3
  import { f as ExpressionType, y as TypePath } from "../typification-DDuv88ir.js";
4
- import { a as RSLangAnalyzer, t as AnalysisBase } from "../analyzer-BiQEKLHB.js";
4
+ import { a as RSLangAnalyzer, t as AnalysisBase } from "../analyzer-DqjdciC5.js";
5
5
  //#region src/library/rsform.d.ts
6
6
  /** Represents {@link Constituenta} type. */
7
7
  declare const CstType: {
@@ -1,2 +1,2 @@
1
- import { i as readTypeAnnotation, n as annotateType, r as readErrorAnnotation, t as annotateError } from "../ast-annotations-Bb5TBP_P.js";
1
+ import { i as readTypeAnnotation, n as annotateType, r as readErrorAnnotation, t as annotateError } from "../ast-annotations-CZCzs9Uk.js";
2
2
  export { annotateError, annotateType, readErrorAnnotation, readTypeAnnotation };
@@ -1,2 +1,2 @@
1
- import { a as RSErrorInfo, i as RSErrorDescription, n as RSErrorClass, o as getRSErrorPrefix, r as RSErrorCode, s as isCritical, t as ErrorReporter } from "../error-toW0TUHF.js";
1
+ import { a as RSErrorInfo, i as RSErrorDescription, n as RSErrorClass, o as getRSErrorPrefix, r as RSErrorCode, s as isCritical, t as ErrorReporter } from "../error-CzIbnP-N.js";
2
2
  export { ErrorReporter, RSErrorClass, RSErrorCode, RSErrorDescription, RSErrorInfo, getRSErrorPrefix, isCritical };
@@ -31,11 +31,11 @@ const RSErrorCode = {
31
31
  expectedArgument: 33827,
32
32
  expectedLocal: 33813,
33
33
  expectedType: 33814,
34
- localDoubleDeclare: 10241,
35
34
  localNotUsed: 10242,
36
35
  localUndeclared: 34817,
37
36
  localShadowing: 34818,
38
- typesNotEqual: 34819,
37
+ localDoubleDeclare: 34819,
38
+ typesNotEqual: 34826,
39
39
  globalNotTyped: 34820,
40
40
  invalidDecart: 34821,
41
41
  invalidBoolean: 34822,
@@ -111,7 +111,8 @@ function getRSErrorPrefix(code) {
111
111
  }
112
112
  /** Checks if error is critical. */
113
113
  function isCritical(code) {
114
- return code !== RSErrorCode.localDoubleDeclare && code !== RSErrorCode.localNotUsed;
114
+ if ((code & 61440) === 8192) return false;
115
+ return true;
115
116
  }
116
117
  //#endregion
117
118
  export { RSErrorClass, RSErrorCode, getRSErrorPrefix, isCritical };
@@ -1 +1 @@
1
- {"version":3,"file":"error.js","names":[],"sources":["../../src/rslang/error.ts"],"sourcesContent":["/** Module: Error types and functions. */\n\n/** Represents error class. */\nexport const RSErrorClass = {\n LEXER: 0,\n PARSER: 1,\n SEMANTIC: 2,\n EVALUATION: 3,\n UNKNOWN: 4\n} as const;\nexport type RSErrorClass = (typeof RSErrorClass)[keyof typeof RSErrorClass];\n\n/** Represents RSLang expression error information. */\nexport interface RSErrorInfo {\n code: RSErrorCode;\n params?: readonly string[];\n}\n\n/** Represents RSLang expression error description. */\nexport interface RSErrorDescription extends RSErrorInfo {\n from: number;\n to: number;\n}\n\n/** Error reporter function type. */\nexport type ErrorReporter = (error: RSErrorDescription) => void;\n\n/** Represents RSLang expression error types. */\nexport const RSErrorCode = {\n unknownSyntax: 0x8400, // 33792\n forbiddenCharacter: 0x8401, // 33793\n bracketMismatch: 0x8409, // 33801\n doubleParenthesis: 0x840a, // 33802\n missingOpenBracket: 0x840b, // 33803\n missingCloseBracket: 0x840c, // 33804\n invalidFilterSyntax: 0x8417, // 33815\n expectedFunctionBody: 0x8418, // 33816\n expectedExpressionBody: 0x8419, // 33817\n expectedLogicBody: 0x841a, // 33818\n expectedQuantifierBody: 0x841b, // 33819\n expectedDeclarativeBody: 0x841c, // 33820\n expectedImperativeBody: 0x841d, // 33821\n expectedRecursiveBody: 0x841e, // 33822\n expectedQuantifierDomain: 0x841f, // 33823\n expectedRightOperand: 0x8420, // 33824\n expectedUnaryOperand: 0x8421, // 33825\n globalFuncParenCall: 0x8422, // 33826\n expectedArgument: 0x8423, // 33827\n expectedLocal: 0x8415, // 33813\n expectedType: 0x8416, // 33814\n\n localDoubleDeclare: 0x2801, // 10241\n localNotUsed: 0x2802, // 10242\n\n localUndeclared: 0x8801, // 34817\n localShadowing: 0x8802, // 34818\n\n typesNotEqual: 0x8803, // 34819\n globalNotTyped: 0x8804, // 34820\n invalidDecart: 0x8805, // 34821\n invalidBoolean: 0x8806, // 34822\n invalidTypeOperation: 0x8807, // 34823\n invalidCard: 0x8808, // 34824\n invalidDebool: 0x8809, // 34825\n globalFuncWithoutArgs: 0x880b, // 34827\n invalidReduce: 0x8810, // 34832\n invalidEnumeration: 0x8813, // 34835\n projectionSetArgumentNotSet: 0x8830, // 34864\n projectionSetArgumentNotTupleSet: 0x8831, // 34865\n projectionSetIndexOutOfRange: 0x8832, // 34866\n projectionTupleArgumentNotTuple: 0x8833, // 34867\n projectionTupleIndexOutOfRange: 0x8834, // 34868\n invalidCortegeDeclare: 0x8814, // 34836\n localOutOfScope: 0x8815, // 34837\n invalidElementPredicate: 0x8816, // 34838\n invalidEmptySetUsage: 0x8817, // 34839\n invalidArgsArity: 0x8818, // 34840\n invalidArgumentType: 0x8819, // 34841\n globalStructure: 0x881c, // 34844\n radicalUsage: 0x8821, // 34849\n invalidFilterArgumentType: 0x8822, // 34850\n invalidFilterArity: 0x8823, // 34851\n arithmeticNotSupported: 0x8824, // 34852\n typesNotCompatible: 0x8825, // 34853\n orderingNotSupported: 0x8826, // 34854\n expectedLogic: 0x8827, // 34855\n expectedSetexpr: 0x8828, // 34856\n invalidArgumentCortegeDeclare: 0x8829, // 34857\n invalidQuantifierDomain: 0x882a, // 34858\n invalidFilterParameterType: 0x882b, // 34859\n invalidFilterIndex: 0x882c, // 34860\n invalidFilterBooleanEchelon: 0x882d, // 34861\n localOutOfScopeParentheses: 0x882e, // 34862\n localUndeclaredInSubexpr: 0x882f, // 34863\n\n globalNoValue: 0x8840, // 34880\n invalidPropertyUsage: 0x8841, // 34881\n\n // Value evaluation (runtime)\n calcUnknownError: 0x8100, // 35328\n setOverflow: 0x8101, // 35329\n booleanBaseLimit: 0x8102, // 35330\n calcGlobalMissing: 0x8103, // 35331\n iterationsLimit: 0x8104, // 35332\n calcInvalidDebool: 0x8105, // 35333\n iterateInfinity: 0x8106, // 35334\n calculationNotSupported: 0x8107, // 35335\n calcInvalidData: 0x8108, // 35336\n\n cstEmptyDerived: 0x8861, // 34913\n definitionNotAllowed: 0x8862 // 34914\n} as const;\nexport type RSErrorCode = (typeof RSErrorCode)[keyof typeof RSErrorCode];\n\nconst ERROR_EVALUATION_MASK = 0x0100;\nconst ERROR_LEXER_MASK = 0x0200;\nconst ERROR_PARSER_MASK = 0x0400;\nconst ERROR_SEMANTIC_MASK = 0x0800;\n\n/** Infers error class from error type (code). */\nfunction inferErrorClass(error: RSErrorCode): RSErrorClass {\n if ((error & ERROR_EVALUATION_MASK) !== 0) {\n return RSErrorClass.EVALUATION;\n } else if ((error & ERROR_LEXER_MASK) !== 0) {\n return RSErrorClass.LEXER;\n } else if ((error & ERROR_PARSER_MASK) !== 0) {\n return RSErrorClass.PARSER;\n } else if ((error & ERROR_SEMANTIC_MASK) !== 0) {\n return RSErrorClass.SEMANTIC;\n } else {\n return RSErrorClass.UNKNOWN;\n }\n}\n\n/** Generate ErrorID label. */\nexport function getRSErrorPrefix(code: RSErrorCode): string {\n const id = code.toString(16).toUpperCase();\n // prettier-ignore\n switch (inferErrorClass(code)) {\n case RSErrorClass.LEXER: return 'L' + id;\n case RSErrorClass.PARSER: return 'P' + id;\n case RSErrorClass.SEMANTIC: return 'S' + id;\n case RSErrorClass.EVALUATION: return 'E' + id;\n case RSErrorClass.UNKNOWN: return 'U' + id;\n }\n}\n\n/** Checks if error is critical. */\nexport function isCritical(code: RSErrorCode): boolean {\n return code !== RSErrorCode.localDoubleDeclare && code !== RSErrorCode.localNotUsed;\n}\n"],"mappings":";;;AAGA,MAAa,eAAe;CAC1B,OAAO;CACP,QAAQ;CACR,UAAU;CACV,YAAY;CACZ,SAAS;AACX;;AAmBA,MAAa,cAAc;CACzB,eAAe;CACf,oBAAoB;CACpB,iBAAiB;CACjB,mBAAmB;CACnB,oBAAoB;CACpB,qBAAqB;CACrB,qBAAqB;CACrB,sBAAsB;CACtB,wBAAwB;CACxB,mBAAmB;CACnB,wBAAwB;CACxB,yBAAyB;CACzB,wBAAwB;CACxB,uBAAuB;CACvB,0BAA0B;CAC1B,sBAAsB;CACtB,sBAAsB;CACtB,qBAAqB;CACrB,kBAAkB;CAClB,eAAe;CACf,cAAc;CAEd,oBAAoB;CACpB,cAAc;CAEd,iBAAiB;CACjB,gBAAgB;CAEhB,eAAe;CACf,gBAAgB;CAChB,eAAe;CACf,gBAAgB;CAChB,sBAAsB;CACtB,aAAa;CACb,eAAe;CACf,uBAAuB;CACvB,eAAe;CACf,oBAAoB;CACpB,6BAA6B;CAC7B,kCAAkC;CAClC,8BAA8B;CAC9B,iCAAiC;CACjC,gCAAgC;CAChC,uBAAuB;CACvB,iBAAiB;CACjB,yBAAyB;CACzB,sBAAsB;CACtB,kBAAkB;CAClB,qBAAqB;CACrB,iBAAiB;CACjB,cAAc;CACd,2BAA2B;CAC3B,oBAAoB;CACpB,wBAAwB;CACxB,oBAAoB;CACpB,sBAAsB;CACtB,eAAe;CACf,iBAAiB;CACjB,+BAA+B;CAC/B,yBAAyB;CACzB,4BAA4B;CAC5B,oBAAoB;CACpB,6BAA6B;CAC7B,4BAA4B;CAC5B,0BAA0B;CAE1B,eAAe;CACf,sBAAsB;CAGtB,kBAAkB;CAClB,aAAa;CACb,kBAAkB;CAClB,mBAAmB;CACnB,iBAAiB;CACjB,mBAAmB;CACnB,iBAAiB;CACjB,yBAAyB;CACzB,iBAAiB;CAEjB,iBAAiB;CACjB,sBAAsB;AACxB;AAGA,MAAM,wBAAwB;AAC9B,MAAM,mBAAmB;AACzB,MAAM,oBAAoB;AAC1B,MAAM,sBAAsB;;AAG5B,SAAS,gBAAgB,OAAkC;CACzD,KAAK,QAAQ,2BAA2B,GACtC,OAAO,aAAa;MACf,KAAK,QAAQ,sBAAsB,GACxC,OAAO,aAAa;MACf,KAAK,QAAQ,uBAAuB,GACzC,OAAO,aAAa;MACf,KAAK,QAAQ,yBAAyB,GAC3C,OAAO,aAAa;MAEpB,OAAO,aAAa;AAExB;;AAGA,SAAgB,iBAAiB,MAA2B;CAC1D,MAAM,KAAK,KAAK,SAAS,EAAE,CAAC,CAAC,YAAY;CAEzC,QAAQ,gBAAgB,IAAI,GAA5B;EACE,KAAK,aAAa,OAAO,OAAO,MAAM;EACtC,KAAK,aAAa,QAAQ,OAAO,MAAM;EACvC,KAAK,aAAa,UAAU,OAAO,MAAM;EACzC,KAAK,aAAa,YAAY,OAAO,MAAM;EAC3C,KAAK,aAAa,SAAS,OAAO,MAAM;CAC1C;AACF;;AAGA,SAAgB,WAAW,MAA4B;CACrD,OAAO,SAAS,YAAY,sBAAsB,SAAS,YAAY;AACzE"}
1
+ {"version":3,"file":"error.js","names":[],"sources":["../../src/rslang/error.ts"],"sourcesContent":["/** Module: Error types and functions. */\n\n/** Represents error class. */\nexport const RSErrorClass = {\n LEXER: 0,\n PARSER: 1,\n SEMANTIC: 2,\n EVALUATION: 3,\n UNKNOWN: 4\n} as const;\nexport type RSErrorClass = (typeof RSErrorClass)[keyof typeof RSErrorClass];\n\n/** Represents RSLang expression error information. */\nexport interface RSErrorInfo {\n code: RSErrorCode;\n params?: readonly string[];\n}\n\n/** Represents RSLang expression error description. */\nexport interface RSErrorDescription extends RSErrorInfo {\n from: number;\n to: number;\n}\n\n/** Error reporter function type. */\nexport type ErrorReporter = (error: RSErrorDescription) => void;\n\n/** Represents RSLang expression error types. */\nexport const RSErrorCode = {\n unknownSyntax: 0x8400, // 33792\n forbiddenCharacter: 0x8401, // 33793\n bracketMismatch: 0x8409, // 33801\n doubleParenthesis: 0x840a, // 33802\n missingOpenBracket: 0x840b, // 33803\n missingCloseBracket: 0x840c, // 33804\n invalidFilterSyntax: 0x8417, // 33815\n expectedFunctionBody: 0x8418, // 33816\n expectedExpressionBody: 0x8419, // 33817\n expectedLogicBody: 0x841a, // 33818\n expectedQuantifierBody: 0x841b, // 33819\n expectedDeclarativeBody: 0x841c, // 33820\n expectedImperativeBody: 0x841d, // 33821\n expectedRecursiveBody: 0x841e, // 33822\n expectedQuantifierDomain: 0x841f, // 33823\n expectedRightOperand: 0x8420, // 33824\n expectedUnaryOperand: 0x8421, // 33825\n globalFuncParenCall: 0x8422, // 33826\n expectedArgument: 0x8423, // 33827\n expectedLocal: 0x8415, // 33813\n expectedType: 0x8416, // 33814\n\n localNotUsed: 0x2802, // 10242\n\n localUndeclared: 0x8801, // 34817\n localShadowing: 0x8802, // 34818\n localDoubleDeclare: 0x8803, // 34819\n\n typesNotEqual: 0x880a, // 34826\n globalNotTyped: 0x8804, // 34820\n invalidDecart: 0x8805, // 34821\n invalidBoolean: 0x8806, // 34822\n invalidTypeOperation: 0x8807, // 34823\n invalidCard: 0x8808, // 34824\n invalidDebool: 0x8809, // 34825\n globalFuncWithoutArgs: 0x880b, // 34827\n invalidReduce: 0x8810, // 34832\n invalidEnumeration: 0x8813, // 34835\n projectionSetArgumentNotSet: 0x8830, // 34864\n projectionSetArgumentNotTupleSet: 0x8831, // 34865\n projectionSetIndexOutOfRange: 0x8832, // 34866\n projectionTupleArgumentNotTuple: 0x8833, // 34867\n projectionTupleIndexOutOfRange: 0x8834, // 34868\n invalidCortegeDeclare: 0x8814, // 34836\n localOutOfScope: 0x8815, // 34837\n invalidElementPredicate: 0x8816, // 34838\n invalidEmptySetUsage: 0x8817, // 34839\n invalidArgsArity: 0x8818, // 34840\n invalidArgumentType: 0x8819, // 34841\n globalStructure: 0x881c, // 34844\n radicalUsage: 0x8821, // 34849\n invalidFilterArgumentType: 0x8822, // 34850\n invalidFilterArity: 0x8823, // 34851\n arithmeticNotSupported: 0x8824, // 34852\n typesNotCompatible: 0x8825, // 34853\n orderingNotSupported: 0x8826, // 34854\n expectedLogic: 0x8827, // 34855\n expectedSetexpr: 0x8828, // 34856\n invalidArgumentCortegeDeclare: 0x8829, // 34857\n invalidQuantifierDomain: 0x882a, // 34858\n invalidFilterParameterType: 0x882b, // 34859\n invalidFilterIndex: 0x882c, // 34860\n invalidFilterBooleanEchelon: 0x882d, // 34861\n localOutOfScopeParentheses: 0x882e, // 34862\n localUndeclaredInSubexpr: 0x882f, // 34863\n\n globalNoValue: 0x8840, // 34880\n invalidPropertyUsage: 0x8841, // 34881\n\n // Value evaluation (runtime)\n calcUnknownError: 0x8100, // 35328\n setOverflow: 0x8101, // 35329\n booleanBaseLimit: 0x8102, // 35330\n calcGlobalMissing: 0x8103, // 35331\n iterationsLimit: 0x8104, // 35332\n calcInvalidDebool: 0x8105, // 35333\n iterateInfinity: 0x8106, // 35334\n calculationNotSupported: 0x8107, // 35335\n calcInvalidData: 0x8108, // 35336\n\n cstEmptyDerived: 0x8861, // 34913\n definitionNotAllowed: 0x8862 // 34914\n} as const;\nexport type RSErrorCode = (typeof RSErrorCode)[keyof typeof RSErrorCode];\n\nconst ERROR_EVALUATION_MASK = 0x0100;\nconst ERROR_LEXER_MASK = 0x0200;\nconst ERROR_PARSER_MASK = 0x0400;\nconst ERROR_SEMANTIC_MASK = 0x0800;\n\n/** Infers error class from error type (code). */\nfunction inferErrorClass(error: RSErrorCode): RSErrorClass {\n if ((error & ERROR_EVALUATION_MASK) !== 0) {\n return RSErrorClass.EVALUATION;\n } else if ((error & ERROR_LEXER_MASK) !== 0) {\n return RSErrorClass.LEXER;\n } else if ((error & ERROR_PARSER_MASK) !== 0) {\n return RSErrorClass.PARSER;\n } else if ((error & ERROR_SEMANTIC_MASK) !== 0) {\n return RSErrorClass.SEMANTIC;\n } else {\n return RSErrorClass.UNKNOWN;\n }\n}\n\n/** Generate ErrorID label. */\nexport function getRSErrorPrefix(code: RSErrorCode): string {\n const id = code.toString(16).toUpperCase();\n // prettier-ignore\n switch (inferErrorClass(code)) {\n case RSErrorClass.LEXER: return 'L' + id;\n case RSErrorClass.PARSER: return 'P' + id;\n case RSErrorClass.SEMANTIC: return 'S' + id;\n case RSErrorClass.EVALUATION: return 'E' + id;\n case RSErrorClass.UNKNOWN: return 'U' + id;\n }\n}\n\n/** Checks if error is critical. */\nexport function isCritical(code: RSErrorCode): boolean {\n if ((code & 0xf000) === 0x2000) {\n return false;\n }\n return true;\n}\n"],"mappings":";;;AAGA,MAAa,eAAe;CAC1B,OAAO;CACP,QAAQ;CACR,UAAU;CACV,YAAY;CACZ,SAAS;AACX;;AAmBA,MAAa,cAAc;CACzB,eAAe;CACf,oBAAoB;CACpB,iBAAiB;CACjB,mBAAmB;CACnB,oBAAoB;CACpB,qBAAqB;CACrB,qBAAqB;CACrB,sBAAsB;CACtB,wBAAwB;CACxB,mBAAmB;CACnB,wBAAwB;CACxB,yBAAyB;CACzB,wBAAwB;CACxB,uBAAuB;CACvB,0BAA0B;CAC1B,sBAAsB;CACtB,sBAAsB;CACtB,qBAAqB;CACrB,kBAAkB;CAClB,eAAe;CACf,cAAc;CAEd,cAAc;CAEd,iBAAiB;CACjB,gBAAgB;CAChB,oBAAoB;CAEpB,eAAe;CACf,gBAAgB;CAChB,eAAe;CACf,gBAAgB;CAChB,sBAAsB;CACtB,aAAa;CACb,eAAe;CACf,uBAAuB;CACvB,eAAe;CACf,oBAAoB;CACpB,6BAA6B;CAC7B,kCAAkC;CAClC,8BAA8B;CAC9B,iCAAiC;CACjC,gCAAgC;CAChC,uBAAuB;CACvB,iBAAiB;CACjB,yBAAyB;CACzB,sBAAsB;CACtB,kBAAkB;CAClB,qBAAqB;CACrB,iBAAiB;CACjB,cAAc;CACd,2BAA2B;CAC3B,oBAAoB;CACpB,wBAAwB;CACxB,oBAAoB;CACpB,sBAAsB;CACtB,eAAe;CACf,iBAAiB;CACjB,+BAA+B;CAC/B,yBAAyB;CACzB,4BAA4B;CAC5B,oBAAoB;CACpB,6BAA6B;CAC7B,4BAA4B;CAC5B,0BAA0B;CAE1B,eAAe;CACf,sBAAsB;CAGtB,kBAAkB;CAClB,aAAa;CACb,kBAAkB;CAClB,mBAAmB;CACnB,iBAAiB;CACjB,mBAAmB;CACnB,iBAAiB;CACjB,yBAAyB;CACzB,iBAAiB;CAEjB,iBAAiB;CACjB,sBAAsB;AACxB;AAGA,MAAM,wBAAwB;AAC9B,MAAM,mBAAmB;AACzB,MAAM,oBAAoB;AAC1B,MAAM,sBAAsB;;AAG5B,SAAS,gBAAgB,OAAkC;CACzD,KAAK,QAAQ,2BAA2B,GACtC,OAAO,aAAa;MACf,KAAK,QAAQ,sBAAsB,GACxC,OAAO,aAAa;MACf,KAAK,QAAQ,uBAAuB,GACzC,OAAO,aAAa;MACf,KAAK,QAAQ,yBAAyB,GAC3C,OAAO,aAAa;MAEpB,OAAO,aAAa;AAExB;;AAGA,SAAgB,iBAAiB,MAA2B;CAC1D,MAAM,KAAK,KAAK,SAAS,EAAE,CAAC,CAAC,YAAY;CAEzC,QAAQ,gBAAgB,IAAI,GAA5B;EACE,KAAK,aAAa,OAAO,OAAO,MAAM;EACtC,KAAK,aAAa,QAAQ,OAAO,MAAM;EACvC,KAAK,aAAa,UAAU,OAAO,MAAM;EACzC,KAAK,aAAa,YAAY,OAAO,MAAM;EAC3C,KAAK,aAAa,SAAS,OAAO,MAAM;CAC1C;AACF;;AAGA,SAAgB,WAAW,MAA4B;CACrD,KAAK,OAAO,WAAY,MACtB,OAAO;CAET,OAAO;AACT"}
@@ -1,2 +1,2 @@
1
- import { n as CalculatorResult, r as RSCalculator, t as CalculatorEvaluateOptions } from "../../calculator-h1kKnZ17.js";
1
+ import { n as CalculatorResult, r as RSCalculator, t as CalculatorEvaluateOptions } from "../../calculator-Dt03dsnd.js";
2
2
  export { CalculatorEvaluateOptions, CalculatorResult, RSCalculator };
@@ -1,5 +1,5 @@
1
1
  import { t as AstNode } from "../../ast-C8sIpKdL.js";
2
- import { t as ErrorReporter } from "../../error-toW0TUHF.js";
2
+ import { t as ErrorReporter } from "../../error-CzIbnP-N.js";
3
3
  import { l as Value, u as ValueContext } from "../../value-BduA_ZGp.js";
4
4
 
5
5
  //#region src/rslang/eval/evaluator.d.ts
@@ -1,13 +1,13 @@
1
1
  import { b as Typification, d as EmptySetT, f as ExpressionType, g as TypeClass, k as makeTypePath, m as LogicT, t as AnyTypificationT, v as TypeID, y as TypePath } from "../typification-DDuv88ir.js";
2
- import { i as RSErrorDescription, r as RSErrorCode } from "../error-toW0TUHF.js";
3
- import { i as readTypeAnnotation, r as readErrorAnnotation } from "../ast-annotations-Bb5TBP_P.js";
2
+ import { i as RSErrorDescription, r as RSErrorCode } from "../error-CzIbnP-N.js";
3
+ import { i as readTypeAnnotation, r as readErrorAnnotation } from "../ast-annotations-CZCzs9Uk.js";
4
4
  import { d as ValuePath, l as Value, p as makeValuePath } from "../value-BduA_ZGp.js";
5
- import { n as CalculatorResult, r as RSCalculator, t as CalculatorEvaluateOptions } from "../calculator-h1kKnZ17.js";
5
+ import { n as CalculatorResult, r as RSCalculator, t as CalculatorEvaluateOptions } from "../calculator-Dt03dsnd.js";
6
6
  import { d as printValue } from "../value-api-C2X4Pom5.js";
7
7
  import { t as parser } from "../parser-Bwd8LxJ1.js";
8
8
  import { t as TokenID } from "../token-DeXAmzwr.js";
9
9
  import { t as ValueClass } from "../value-class-CNI-lqXJ.js";
10
- import { a as RSLangAnalyzer, n as AnalysisFast, r as AnalysisFull, t as AnalysisBase } from "../analyzer-BiQEKLHB.js";
10
+ import { a as RSLangAnalyzer, n as AnalysisFast, r as AnalysisFull, t as AnalysisBase } from "../analyzer-DqjdciC5.js";
11
11
  import { n as ArgumentsType } from "../arguments-extractor-Dd1lFom9.js";
12
12
  import { n as applyAsciiTypeSubstitutions, r as parseTypeText } from "../typification-parser-DHO42ZRc.js";
13
13
  import { n as TypificationNodeData, t as TypificationGraph } from "../typification-graph-8VdK6_Fh.js";
@@ -1,6 +1,6 @@
1
1
  import { t as AstNode } from "../../../ast-C8sIpKdL.js";
2
2
  import { g as TypeClass } from "../../../typification-DDuv88ir.js";
3
- import { t as ErrorReporter } from "../../../error-toW0TUHF.js";
3
+ import { t as ErrorReporter } from "../../../error-CzIbnP-N.js";
4
4
 
5
5
  //#region src/rslang/parser/syntax-errors/index.d.ts
6
6
  /** When set, refines incomplete formal headers (`[α∈…]`, quantifiers). */
@@ -1,2 +1,2 @@
1
- import { a as RSLangAnalyzer, i as AnalysisOptions, n as AnalysisFast, r as AnalysisFull, t as AnalysisBase } from "../../analyzer-BiQEKLHB.js";
1
+ import { a as RSLangAnalyzer, i as AnalysisOptions, n as AnalysisFast, r as AnalysisFull, t as AnalysisBase } from "../../analyzer-DqjdciC5.js";
2
2
  export { AnalysisBase, AnalysisFast, AnalysisFull, AnalysisOptions, RSLangAnalyzer };
@@ -1,6 +1,6 @@
1
1
  import { t as AstNode } from "../../ast-C8sIpKdL.js";
2
2
  import { _ as TypeContext, f as ExpressionType } from "../../typification-DDuv88ir.js";
3
- import { t as ErrorReporter } from "../../error-toW0TUHF.js";
3
+ import { t as ErrorReporter } from "../../error-CzIbnP-N.js";
4
4
 
5
5
  //#region src/rslang/semantic/type-auditor.d.ts
6
6
  /** Type auditor for AST type checking. */
@@ -696,8 +696,7 @@ var LocalContext = class {
696
696
  return false;
697
697
  } else {
698
698
  this.onError(RSErrorCode.localDoubleDeclare, node, [alias]);
699
- const index = this.data.indexOf(existing);
700
- if (index !== -1) this.data.splice(index, 1);
699
+ return false;
701
700
  }
702
701
  this.data.push({
703
702
  alias,
@@ -710,17 +709,14 @@ var LocalContext = class {
710
709
  getLocalType(node) {
711
710
  const alias = getNodeText(node);
712
711
  const local = this.data.find((data) => data.alias === alias);
713
- if (local === void 0) {
714
- this.onError(RSErrorCode.localUndeclared, node, [alias]);
715
- return null;
716
- } else if (local.level < 1) {
712
+ if (local === void 0) return this.onError(RSErrorCode.localUndeclared, node, [alias]);
713
+ else if (local.level < 1) {
717
714
  const subexprRoot = findRightLogicOperandRoot(node);
718
715
  if (subexprRoot !== null) {
719
716
  if (pathContainsQuantifier(node, subexprRoot)) return this.onError(RSErrorCode.localUndeclaredInSubexpr, node, [alias, labelType(local.type)]);
720
717
  return this.onError(RSErrorCode.localOutOfScopeParentheses, node, [alias]);
721
718
  }
722
- this.onError(RSErrorCode.localOutOfScope, node, [alias]);
723
- return null;
719
+ return this.onError(RSErrorCode.localOutOfScope, node, [alias]);
724
720
  } else {
725
721
  local.useCount++;
726
722
  return local.type;
@@ -1 +1 @@
1
- {"version":3,"file":"type-auditor.js","names":[],"sources":["../../../src/rslang/semantic/type-auditor.ts"],"sourcesContent":["/**\n * Module: Type auditor for AST type checking.\n */\n\nimport { type AstNode, getNodeIndices, getNodeText } from '../../parsing';\nimport { annotateError, annotateType } from '../ast-annotations';\nimport { type ErrorReporter, RSErrorCode } from '../error';\nimport { labelRSLangNode, labelToken, labelType } from '../labels';\nimport { TokenID } from '../parser/token';\n\nimport {\n type Argument,\n bool,\n component,\n debool,\n type EchelonTuple,\n EmptySetT,\n type ExpressionType,\n IntegerT,\n isTemplateRadical,\n isTypification,\n LogicT,\n mangleRadicalId,\n type Parametrized,\n tuple,\n type TypeContext,\n TypeID,\n type Typification\n} from './typification';\nimport {\n checkCompatibility,\n checkEquality,\n cloneTypification,\n compareTemplated,\n hasGenerics,\n mergeTypifications,\n substituteBase\n} from './typification-api';\n\n/** Type auditor for AST type checking. */\nexport class TypeAuditor {\n private static readonly TYPE_DEDUCTION_DEPTH = 5;\n\n private context: TypeContext;\n private reporter?: ErrorReporter;\n private locals: LocalContext;\n private annotateTypes: boolean;\n private annotateErrors: boolean;\n\n constructor(context: TypeContext) {\n this.annotateTypes = false;\n this.annotateErrors = false;\n this.context = context;\n this.locals = new LocalContext(this.onError.bind(this));\n }\n\n public run(\n ast: AstNode,\n annotateTypes: boolean,\n reporter?: ErrorReporter,\n annotateErrors: boolean = false\n ): ExpressionType | null {\n if (ast.hasError) {\n return null;\n }\n this.annotateTypes = annotateTypes;\n this.annotateErrors = annotateErrors;\n this.reporter = reporter;\n this.clear();\n return this.dispatchVisit(ast);\n }\n\n private clear(): void {\n this.locals = new LocalContext(this.onError.bind(this));\n }\n\n private dispatchDeclare(node: AstNode, domain: Typification): boolean {\n const result = this.processDeclare(node, domain);\n if (result === true && this.annotateTypes) {\n annotateType(node, domain);\n }\n return result;\n }\n\n private processDeclare(node: AstNode, domain: Typification): boolean {\n switch (node.typeID) {\n case TokenID.ID_LOCAL:\n return this.declareLocal(node, domain);\n case TokenID.NT_TUPLE_DECL:\n return this.declareTuple(node, domain);\n case TokenID.NT_ENUM_DECL:\n return this.declareEnumeration(node, domain);\n }\n return false;\n }\n\n private declareLocal(node: AstNode, domain: Typification): boolean {\n return this.locals.pushLocal(node, domain);\n }\n\n private declareTuple(node: AstNode, domain: Typification): boolean {\n if (domain.typeID !== TypeID.tuple || domain.factors.length !== node.children.length) {\n this.onError(RSErrorCode.invalidCortegeDeclare, node.children[0]);\n return false;\n }\n for (let child = 0; child < node.children.length; child++) {\n if (!this.visitChildDeclaration(node, child, component(domain, child + 1)!)) {\n return false;\n }\n }\n return true;\n }\n\n private declareEnumeration(node: AstNode, domain: Typification): boolean {\n for (const child of node.children) {\n if (!this.dispatchDeclare(child, domain)) {\n return false;\n }\n }\n return true;\n }\n\n private dispatchVisit(node: AstNode): ExpressionType | null {\n const result = this.processVisit(node);\n if (result !== null && this.annotateTypes) {\n annotateType(node, result);\n }\n return result;\n }\n\n private processVisit(node: AstNode): ExpressionType | null {\n switch (node.typeID) {\n case TokenID.ID_GLOBAL:\n case TokenID.ID_FUNCTION:\n case TokenID.ID_PREDICATE:\n return this.visitGlobal(node);\n\n case TokenID.ID_LOCAL:\n return this.visitLocal(node);\n case TokenID.ID_RADICAL:\n return this.visitRadical(node);\n\n case TokenID.LIT_INTEGER:\n return IntegerT;\n case TokenID.LIT_WHOLE_NUMBERS:\n return bool(IntegerT);\n case TokenID.LIT_EMPTYSET:\n return this.visitEmptySet(node);\n\n case TokenID.NT_ARGUMENTS:\n return this.visitArgumentsEnum(node);\n case TokenID.NT_ARG_DECL:\n return this.visitArgument(node);\n\n case TokenID.PLUS:\n case TokenID.MINUS:\n case TokenID.MULTIPLY:\n return this.visitArithmetic(node);\n\n case TokenID.QUANTOR_UNIVERSAL:\n case TokenID.QUANTOR_EXISTS:\n return this.visitQuantifier(node);\n\n case TokenID.LOGIC_NOT:\n return this.visitNegation(node);\n\n case TokenID.LOGIC_AND:\n case TokenID.LOGIC_OR:\n case TokenID.LOGIC_IMPLICATION:\n case TokenID.LOGIC_EQUIVALENT:\n return this.visitLogicBinary(node);\n\n case TokenID.EQUAL:\n case TokenID.NOTEQUAL:\n return this.visitEquals(node);\n\n case TokenID.GREATER:\n case TokenID.LESSER:\n case TokenID.GREATER_OR_EQ:\n case TokenID.LESSER_OR_EQ:\n return this.visitIntegerPredicate(node);\n\n case TokenID.SET_IN:\n case TokenID.SET_NOT_IN:\n case TokenID.SUBSET:\n case TokenID.SUBSET_OR_EQ:\n case TokenID.NOT_SUBSET:\n return this.visitSetexprPredicate(node);\n\n case TokenID.DECART:\n return this.visitDecart(node);\n case TokenID.BOOLEAN:\n return this.visitBoolean(node);\n\n case TokenID.NT_TUPLE:\n return this.visitTuple(node);\n case TokenID.NT_ENUMERATION:\n return this.visitEnumeration(node);\n\n case TokenID.BIGPR:\n return this.visitProjectSet(node);\n case TokenID.SMALLPR:\n return this.visitProjectTuple(node);\n case TokenID.FILTER:\n return this.visitFilter(node);\n\n case TokenID.CARD:\n return this.visitCard(node);\n case TokenID.REDUCE:\n return this.visitReduce(node);\n case TokenID.BOOL:\n return this.visitBool(node);\n case TokenID.DEBOOL:\n return this.visitDebool(node);\n\n case TokenID.SET_UNION:\n case TokenID.SET_INTERSECTION:\n case TokenID.SET_MINUS:\n case TokenID.SET_SYMMETRIC_MINUS:\n return this.visitSetexprBinary(node);\n\n case TokenID.NT_FUNC_DEFINITION:\n return this.visitFunctionDefinition(node);\n\n case TokenID.NT_FUNC_CALL:\n return this.visitFunctionCall(node);\n\n case TokenID.ITERATE:\n return this.visitIterate(node);\n case TokenID.ASSIGN:\n return this.visitAssign(node);\n\n case TokenID.NT_DECLARATIVE_EXPR:\n return this.visitDeclarative(node);\n case TokenID.NT_IMPERATIVE_EXPR:\n return this.visitImperative(node);\n\n case TokenID.NT_RECURSIVE_FULL:\n case TokenID.NT_RECURSIVE_SHORT:\n return this.visitRecursion(node);\n }\n return null;\n }\n\n private onError(code: RSErrorCode, node: AstNode, params?: string[]): null {\n this.reporter?.({ code, from: node.from, to: node.to, params });\n if (this.annotateErrors) {\n annotateError(node, code, params);\n }\n return null;\n }\n\n private visitChild(node: AstNode, index: number): ExpressionType | null {\n if (index >= node.children.length) {\n return null;\n }\n return this.dispatchVisit(node.children[index]);\n }\n\n private visitChildDeclaration(node: AstNode, index: number, domain: Typification): boolean {\n if (index >= node.children.length) {\n return false;\n }\n if (!this.dispatchDeclare(node.children[index], domain)) {\n return false;\n }\n return true;\n }\n\n private visitAllAndReturn(node: AstNode, type: ExpressionType | null): ExpressionType | null {\n for (const child of node.children) {\n if (!this.dispatchVisit(child)) {\n return null;\n }\n }\n return type;\n }\n\n private childTypification(node: AstNode, index: number): Typification | null {\n const result = this.visitChild(node, index);\n if (result === null) {\n return null;\n }\n if (!isTypification(result)) {\n this.onError(RSErrorCode.expectedSetexpr, node.children[index], [labelType(result)]);\n return null;\n }\n return result as Typification;\n }\n\n private childLogic(node: AstNode, index: number): boolean {\n const result = this.visitChild(node, index);\n if (result === null) {\n return false;\n }\n if (result.typeID !== TypeID.logic) {\n this.onError(RSErrorCode.expectedLogic, node.children[index], [labelType(result)]);\n return false;\n }\n return true;\n }\n\n private childTypeDebool(\n node: AstNode,\n index: number,\n errorCode: RSErrorCode,\n operation?: string\n ): Typification | null {\n const result = this.childTypification(node, index);\n if (result === null) {\n return null;\n }\n if (result.typeID === TypeID.anyTypification) {\n return result;\n }\n if (result.typeID !== TypeID.collection) {\n const params =\n errorCode === RSErrorCode.invalidTypeOperation && operation !== undefined\n ? [operation, labelType(result)]\n : [labelType(result)];\n this.onError(errorCode, node.children[index], params);\n return null;\n }\n return debool(result);\n }\n\n private childQuantifierDomain(node: AstNode, index: number, operator: string): Typification | null {\n const result = this.visitChild(node, index);\n if (result === null) {\n return null;\n }\n if (!isTypification(result)) {\n this.onError(RSErrorCode.invalidQuantifierDomain, node.children[index], [operator, labelType(result)]);\n return null;\n }\n if (result.typeID === TypeID.anyTypification) {\n return result;\n }\n if (result.typeID !== TypeID.collection) {\n this.onError(RSErrorCode.invalidQuantifierDomain, node.children[index], [operator, labelType(result)]);\n return null;\n }\n return debool(result);\n }\n\n private visitLocal(node: AstNode): ExpressionType | null {\n return this.locals.getLocalType(node);\n }\n\n private visitGlobal(node: AstNode): ExpressionType | null {\n const alias = getNodeText(node);\n const type = this.context.get(alias);\n if (!type) {\n return this.onError(RSErrorCode.globalNotTyped, node, [alias]);\n }\n if (type.typeID === TypeID.function || type.typeID === TypeID.predicate) {\n return this.onError(RSErrorCode.globalFuncWithoutArgs, node, [alias]);\n }\n return type;\n }\n\n private visitFunctionDefinition(node: AstNode): ExpressionType | null {\n this.locals.startScope();\n if (!this.visitChild(node, 0)) {\n return null;\n }\n\n const args: Argument[] = [];\n for (const local of this.locals.data) {\n if (local.level === 1) {\n args.push({ alias: local.alias, type: local.type });\n }\n }\n\n const result = this.visitChild(node, 1);\n if (result === null || result.typeID === TypeID.function || result.typeID === TypeID.predicate) {\n return null;\n }\n this.locals.endScope(node.children[1]);\n if (result.typeID === TypeID.logic) {\n return {\n typeID: TypeID.predicate,\n result: result,\n args: args\n };\n } else {\n return {\n typeID: TypeID.function,\n result: result,\n args: args\n };\n }\n }\n\n private visitFunctionCall(node: AstNode): ExpressionType | null {\n const funcName = getNodeText(node.children[0]);\n const funcType = this.context.get(funcName);\n if (funcType?.typeID !== TypeID.function && funcType?.typeID !== TypeID.predicate) {\n return this.onError(RSErrorCode.globalNotTyped, node.children[0], [funcName]);\n }\n if (this.annotateTypes) {\n annotateType(node.children[0], funcType);\n }\n\n const substitutes = this.checkFuncArguments(node, funcName, funcType);\n if (substitutes === null) {\n return null;\n }\n if (funcType.result.typeID === TypeID.logic) {\n return funcType.result;\n } else {\n const result = mangleRadicals(funcName, funcType.result);\n if (substitutes.size > 0) {\n substituteBase(result, substitutes);\n }\n return result;\n }\n }\n\n private visitRadical(node: AstNode): ExpressionType | null {\n const alias = getNodeText(node);\n if (!this.isInsideFuncArgument(node)) {\n return this.onError(RSErrorCode.radicalUsage, node, [alias]);\n }\n return bool({ typeID: TypeID.basic, baseID: alias });\n }\n\n private visitEmptySet(node: AstNode): ExpressionType | null {\n const invalidParents: TokenID[] = [\n TokenID.CARD,\n TokenID.DEBOOL,\n TokenID.SET_UNION,\n TokenID.SET_INTERSECTION,\n TokenID.SET_MINUS,\n TokenID.SET_SYMMETRIC_MINUS,\n TokenID.REDUCE,\n TokenID.BIGPR,\n TokenID.SMALLPR\n ];\n if (invalidParents.includes(node.parent?.typeID as TokenID)) {\n return this.onError(RSErrorCode.invalidEmptySetUsage, node);\n }\n return EmptySetT;\n }\n\n private visitArgument(node: AstNode): ExpressionType | null {\n const variable = node.children[0];\n if (variable.typeID === TokenID.NT_TUPLE_DECL) {\n return this.onError(RSErrorCode.invalidArgumentCortegeDeclare, variable);\n }\n const domain = this.childTypeDebool(node, 1, RSErrorCode.invalidTypeOperation, labelToken(TokenID.ITERATE));\n if (domain === null) {\n return null;\n }\n if (!this.visitChildDeclaration(node, 0, domain)) {\n return null;\n }\n return domain;\n }\n\n private visitCard(node: AstNode): ExpressionType | null {\n if (!this.childTypeDebool(node, 0, RSErrorCode.invalidCard)) {\n return null;\n }\n return IntegerT;\n }\n\n private visitArithmetic(node: AstNode): ExpressionType | null {\n const operator = labelRSLangNode(node);\n const type1 = this.childTypification(node, 0);\n if (type1 === null) {\n return null;\n }\n if (!('isArithmetic' in type1 && type1.isArithmetic)) {\n return this.onError(RSErrorCode.arithmeticNotSupported, node.children[0], [labelType(type1), operator]);\n }\n\n const type2 = this.childTypification(node, 1);\n if (type2 === null) {\n return null;\n }\n if (!('isArithmetic' in type2 && type2.isArithmetic)) {\n return this.onError(RSErrorCode.arithmeticNotSupported, node.children[1], [labelType(type2), operator]);\n }\n\n const result = mergeTypifications(type1, type2);\n if (result === null) {\n return this.onError(RSErrorCode.typesNotCompatible, node, [labelType(type1), labelType(type2), operator]);\n }\n return result;\n }\n\n private visitIntegerPredicate(node: AstNode): ExpressionType | null {\n const operator = labelRSLangNode(node);\n const type1 = this.childTypification(node, 0);\n if (type1 === null) {\n return null;\n }\n if (!('isOrdered' in type1 && type1.isOrdered)) {\n return this.onError(RSErrorCode.orderingNotSupported, node.children[0], [labelType(type1), operator]);\n }\n\n const type2 = this.childTypification(node, 1);\n if (type2 === null) {\n return null;\n }\n if (!('isOrdered' in type2 && type2.isOrdered)) {\n return this.onError(RSErrorCode.orderingNotSupported, node.children[1], [labelType(type2), operator]);\n }\n\n if (!checkCompatibility(type1, type2)) {\n return this.onError(RSErrorCode.typesNotCompatible, node, [labelType(type1), labelType(type2), operator]);\n }\n return LogicT;\n }\n\n private visitQuantifier(node: AstNode): ExpressionType | null {\n this.locals.startScope();\n\n const operator = labelRSLangNode(node);\n const domain = this.childQuantifierDomain(node, 1, operator);\n if (domain === null) {\n return null;\n } else if (!this.visitChildDeclaration(node, 0, domain)) {\n return null;\n } else if (!this.childLogic(node, 2)) {\n return null;\n }\n\n this.locals.endScope(node.children[2]);\n return LogicT;\n }\n\n private visitNegation(node: AstNode): ExpressionType | null {\n if (!this.childLogic(node, 0)) {\n return null;\n }\n return LogicT;\n }\n\n private visitLogicBinary(node: AstNode): ExpressionType | null {\n if (!this.childLogic(node, 0) || !this.childLogic(node, 1)) {\n return null;\n }\n return LogicT;\n }\n\n private visitEquals(node: AstNode): ExpressionType | null {\n const operator = labelRSLangNode(node);\n const type1 = this.childTypification(node, 0);\n if (type1 === null) {\n return null;\n }\n\n const type2 = this.childTypification(node, 1);\n if (type2 === null) {\n return null;\n }\n if (!checkCompatibility(type1, type2)) {\n return this.onError(RSErrorCode.typesNotCompatible, node, [labelType(type1), labelType(type2), operator]);\n }\n return LogicT;\n }\n\n private visitSetexprPredicate(node: AstNode): ExpressionType | null {\n const operator = labelRSLangNode(node);\n let type2 = this.childTypeDebool(node, 1, RSErrorCode.invalidTypeOperation, operator);\n if (type2 === null) {\n return null;\n }\n const isSubset = this.isSubset(node.typeID as TokenID);\n if (isSubset) {\n type2 = bool(type2);\n }\n const type1 = this.childTypification(node, 0);\n if (type1 === null) {\n return null;\n }\n\n if (!checkCompatibility(type1, type2)) {\n if (isSubset) {\n return this.onError(RSErrorCode.typesNotEqual, node, [labelType(type1), labelType(type2), operator]);\n } else {\n return this.onError(RSErrorCode.invalidElementPredicate, node, [\n labelType(type1),\n operator,\n labelType(bool(type2))\n ]);\n }\n }\n return LogicT;\n }\n\n private visitDecart(node: AstNode): ExpressionType | null {\n const factors: Typification[] = [];\n for (let child = 0; child < node.children.length; child++) {\n const type = this.childTypeDebool(node, child, RSErrorCode.invalidDecart);\n if (type === null) {\n return null;\n } else {\n factors.push(type);\n }\n }\n return bool(tuple(factors));\n }\n\n private visitBoolean(node: AstNode): ExpressionType | null {\n const type = this.childTypeDebool(node, 0, RSErrorCode.invalidBoolean);\n if (type === null) {\n return null;\n }\n return bool(bool(type));\n }\n\n private visitTuple(node: AstNode): ExpressionType | null {\n const components: Typification[] = [];\n for (let child = 0; child < node.children.length; child++) {\n const type = this.childTypification(node, child);\n if (type === null) {\n return null;\n }\n components.push(type);\n }\n return tuple(components);\n }\n\n private visitEnumeration(node: AstNode): ExpressionType | null {\n let type: ExpressionType | null = this.childTypification(node, 0);\n if (type === null) {\n return null;\n }\n for (let child = 1; child < node.children.length; child++) {\n const childType = this.childTypification(node, child);\n if (childType === null) {\n return null;\n }\n\n const merge = mergeTypifications(type, childType);\n if (merge === null) {\n return this.onError(RSErrorCode.invalidEnumeration, node.children[child], [\n labelType(type),\n labelType(childType)\n ]);\n }\n type = merge;\n }\n return bool(type);\n }\n\n private visitBool(node: AstNode): ExpressionType | null {\n return this.visitEnumeration(node);\n }\n\n private visitDebool(node: AstNode): ExpressionType | null {\n return this.childTypeDebool(node, 0, RSErrorCode.invalidDebool);\n }\n\n private visitSetexprBinary(node: AstNode): ExpressionType | null {\n const operator = labelRSLangNode(node);\n const type1 = this.childTypeDebool(node, 0, RSErrorCode.invalidTypeOperation, operator);\n if (type1 === null) {\n return null;\n }\n\n const type2 = this.childTypeDebool(node, 1, RSErrorCode.invalidTypeOperation, operator);\n if (type2 === null) {\n return null;\n }\n\n const result = mergeTypifications(type1, type2);\n if (result === null) {\n return this.onError(RSErrorCode.typesNotEqual, node, [labelType(bool(type1)), labelType(bool(type2)), operator]);\n }\n return bool(result);\n }\n\n private visitProjectSet(node: AstNode): ExpressionType | null {\n const operator = labelRSLangNode(node);\n const argNode = node.children[0];\n const argType = this.childTypification(node, 0);\n if (argType === null) {\n return null;\n }\n if (argType.typeID === TypeID.anyTypification) {\n return EmptySetT;\n }\n if (argType.typeID !== TypeID.collection) {\n return this.onError(RSErrorCode.projectionSetArgumentNotSet, argNode, [operator, labelType(argType)]);\n }\n const argument = debool(argType);\n if (argument.typeID !== TypeID.tuple) {\n return this.onError(RSErrorCode.projectionSetArgumentNotTupleSet, argNode, [operator, labelType(bool(argument))]);\n }\n\n const indices = getNodeIndices(node);\n const components: Typification[] = [];\n for (const index of indices) {\n const newComponent = component(argument, index);\n if (newComponent === null) {\n return this.onError(RSErrorCode.projectionSetIndexOutOfRange, argNode, [\n operator,\n String(index),\n String(argument.factors.length),\n labelType(bool(argument))\n ]);\n } else {\n components.push(newComponent);\n }\n }\n if (components.length === 1) {\n return bool(components[0]);\n } else {\n return bool(tuple(components));\n }\n }\n\n private visitProjectTuple(node: AstNode): ExpressionType | null {\n const operator = labelRSLangNode(node);\n const argNode = node.children[0];\n const argument = this.childTypification(node, 0);\n if (argument === null) {\n return null;\n }\n if (argument.typeID === TypeID.anyTypification) {\n return argument;\n }\n if (argument.typeID !== TypeID.tuple) {\n return this.onError(RSErrorCode.projectionTupleArgumentNotTuple, argNode, [operator, labelType(argument)]);\n }\n\n const indices = getNodeIndices(node);\n const components: Typification[] = [];\n for (const index of indices) {\n const newComponent = component(argument, index);\n if (newComponent === null) {\n return this.onError(RSErrorCode.projectionTupleIndexOutOfRange, argNode, [\n operator,\n String(index),\n String(argument.factors.length),\n labelType(argument)\n ]);\n } else {\n components.push(newComponent);\n }\n }\n if (components.length === 1) {\n return components[0];\n } else {\n return tuple(components);\n }\n }\n\n private visitFilter(node: AstNode): ExpressionType | null {\n const operator = labelRSLangNode(node);\n const indices = getNodeIndices(node);\n const tupleParam = indices.length === node.children.length - 1;\n if (!tupleParam && node.children.length > 2) {\n const extraParam = node.children[indices.length];\n return this.onError(RSErrorCode.invalidFilterArity, extraParam ?? node, [\n String(indices.length),\n String(node.children.length - 1),\n operator\n ]);\n }\n\n const argument = this.childTypification(node, node.children.length - 1);\n if (argument === null) {\n return null;\n }\n if (\n argument.typeID === TypeID.anyTypification ||\n (argument.typeID === TypeID.collection && argument.base.typeID === TypeID.anyTypification)\n ) {\n return EmptySetT;\n }\n const expectedArgument = this.expectedFilterArgumentLabel(indices);\n if (argument.typeID !== TypeID.collection || argument.base.typeID !== TypeID.tuple) {\n return this.onError(RSErrorCode.invalidFilterArgumentType, node.children[node.children.length - 1], [\n operator,\n labelType(argument),\n expectedArgument\n ]);\n }\n\n const argBase = debool(argument) as EchelonTuple;\n const bases: Typification[] = [];\n for (const index of indices) {\n const newBase = component(argBase, index);\n if (newBase === null) {\n return this.onError(RSErrorCode.invalidFilterIndex, node.children[node.children.length - 1], [\n operator,\n labelType(argument),\n String(index),\n String(argBase.factors.length)\n ]);\n }\n bases.push(newBase);\n }\n\n if (tupleParam) {\n for (let child = 0; child + 1 < node.children.length; child++) {\n const param = this.childTypification(node, child);\n if (param === null) {\n return null;\n }\n const expectedParam = bool(bases[child]);\n if (param.typeID !== TypeID.collection || !checkCompatibility(bases[child], debool(param))) {\n return this.reportFilterParameterError(node, child, param, expectedParam, operator);\n }\n }\n } else {\n const param = this.childTypification(node, 0);\n if (param === null) {\n return null;\n }\n const paramType = param;\n const expected = bool(tuple(bases));\n if (paramType.typeID !== TypeID.collection || !checkCompatibility(expected, paramType)) {\n return this.reportFilterParameterError(node, 0, paramType, expected, operator);\n }\n }\n return argument;\n }\n\n private expectedFilterArgumentLabel(indices: number[]): string {\n const maxIndex = Math.max(...indices, 0);\n if (maxIndex <= 1) {\n return labelType(bool({ typeID: TypeID.anyTypification }));\n }\n const factors: Typification[] = [];\n for (let index = 1; index <= maxIndex; index++) {\n factors.push({ typeID: TypeID.anyTypification });\n }\n return labelType(bool(tuple(factors)));\n }\n\n private reportFilterParameterError(\n node: AstNode,\n childIndex: number,\n param: Typification,\n expected: Typification,\n operator: string\n ): null {\n const wrapped = bool(param);\n if (checkEquality(wrapped, expected) || checkCompatibility(wrapped, expected)) {\n return this.onError(RSErrorCode.invalidFilterBooleanEchelon, node.children[childIndex], [\n operator,\n labelType(param)\n ]);\n }\n return this.onError(RSErrorCode.invalidFilterParameterType, node.children[childIndex], [\n labelType(param),\n labelType(expected),\n operator\n ]);\n }\n\n private visitReduce(node: AstNode): ExpressionType | null {\n const argument = this.childTypification(node, 0);\n if (argument === null) {\n return null;\n }\n if (\n argument.typeID === TypeID.anyTypification ||\n (argument.typeID === TypeID.collection && argument.base.typeID === TypeID.anyTypification)\n ) {\n return EmptySetT;\n }\n if (argument.typeID !== TypeID.collection || argument.base.typeID !== TypeID.collection) {\n return this.onError(RSErrorCode.invalidReduce, node.children[0], [labelType(argument)]);\n }\n return debool(argument);\n }\n\n private visitArgumentsEnum(node: AstNode): ExpressionType | null {\n return this.visitAllAndReturn(node, LogicT);\n }\n\n private visitDeclarative(node: AstNode): ExpressionType | null {\n this.locals.startScope();\n\n const domain = this.childTypeDebool(\n node,\n 1,\n RSErrorCode.invalidTypeOperation,\n labelToken(TokenID.NT_DECLARATIVE_EXPR)\n );\n if (domain === null) {\n return null;\n } else if (!this.visitChildDeclaration(node, 0, domain)) {\n return null;\n } else if (!this.childLogic(node, 2)) {\n return null;\n }\n\n this.locals.endScope(node.children[2]);\n return bool(domain);\n }\n\n private visitImperative(node: AstNode): ExpressionType | null {\n this.locals.startScope();\n\n for (let child = 1; child < node.children.length; child++) {\n if (!this.childLogic(node, child)) {\n return null;\n }\n }\n\n const type = this.childTypification(node, 0);\n if (type === null) {\n return null;\n }\n\n this.locals.endScope(node);\n return bool(type);\n }\n\n private visitIterate(node: AstNode): ExpressionType | null {\n const domain = this.childTypeDebool(node, 1, RSErrorCode.invalidTypeOperation, labelToken(TokenID.ITERATE));\n if (domain === null) {\n return null;\n }\n if (!this.visitChildDeclaration(node, 0, domain)) {\n return null;\n }\n return LogicT;\n }\n\n private visitAssign(node: AstNode): ExpressionType | null {\n const domain = this.childTypification(node, 1);\n if (domain === null) {\n return null;\n }\n if (!this.visitChildDeclaration(node, 0, domain)) {\n return null;\n }\n return LogicT;\n }\n\n private visitRecursion(node: AstNode): ExpressionType | null {\n this.locals.startScope();\n\n const initType = this.childTypification(node, 1);\n if (initType === null) {\n return null;\n }\n if (!this.visitChildDeclaration(node, 0, initType)) {\n return null;\n }\n\n const isFull = node.typeID === TokenID.NT_RECURSIVE_FULL;\n const iterationIndex = isFull ? 3 : 2;\n\n let iterationValue = this.childTypification(node, iterationIndex);\n if (iterationValue === null) {\n return null;\n }\n if (!checkCompatibility(iterationValue, initType)) {\n return this.onError(RSErrorCode.typesNotEqual, node.children[iterationIndex], [\n labelType(iterationValue),\n labelType(initType),\n labelToken(node.typeID as TokenID)\n ]);\n }\n\n if (hasGenerics(initType)) {\n for (let retries = TypeAuditor.TYPE_DEDUCTION_DEPTH; retries > 0; retries--) {\n this.locals.endScope(node);\n this.locals.clearUnused();\n this.locals.startScope();\n if (!this.visitChildDeclaration(node, 0, iterationValue)) {\n return null;\n }\n const newIteration = this.childTypification(node, iterationIndex);\n if (newIteration === null) {\n return null;\n }\n if (checkEquality(newIteration, iterationValue)) {\n break;\n }\n iterationValue = newIteration;\n }\n }\n\n if (isFull) {\n if (!this.childLogic(node, 2)) {\n return null;\n }\n }\n\n this.locals.endScope(node);\n return iterationValue;\n }\n\n private isSubset(token: TokenID): boolean {\n return token === TokenID.SUBSET || token === TokenID.SUBSET_OR_EQ || token === TokenID.NOT_SUBSET;\n }\n\n private isInsideFuncArgument(node: AstNode): boolean {\n while (node.parent && node.parent !== node) {\n if (node.typeID === TokenID.NT_ARGUMENTS) return true;\n node = node.parent;\n }\n return false;\n }\n\n private checkFuncArguments(node: AstNode, alias: string, type: Parametrized): Map<string, Typification> | null {\n if (node.children.length - 1 !== type.args.length) {\n return this.onError(RSErrorCode.invalidArgsArity, node, [\n String(type.args.length),\n String(node.children.length - 1)\n ]);\n }\n\n const substitutes = new Map<string, Typification>();\n for (let child = 1; child < node.children.length; child++) {\n const childType = this.childTypification(node, child);\n if (childType === null) {\n return null;\n }\n const argType = mangleRadicals(alias, type.args[child - 1].type);\n if (!compareTemplated(substitutes, argType, childType)) {\n const expectedType = cloneTypification(argType);\n if (substitutes.size > 0) {\n substituteBase(expectedType, substitutes);\n }\n this.onError(RSErrorCode.invalidArgumentType, node.children[child], [\n `${type.args[child - 1].alias}∈${labelType(expectedType)}`,\n labelType(childType)\n ]);\n return null;\n }\n }\n return substitutes;\n }\n}\n\n// ========= Internals ========\nfunction mangleRadicals(funcName: string, type: Typification): Typification {\n switch (type.typeID) {\n default:\n throw new Error(`Unexpected type for ${funcName}: ${JSON.stringify(type)}`);\n case TypeID.anyTypification:\n case TypeID.integer:\n return type;\n case TypeID.basic: {\n if (isTemplateRadical(type.baseID)) {\n return {\n typeID: type.typeID,\n baseID: mangleRadicalId(type.baseID, funcName)\n };\n }\n return type;\n }\n case TypeID.collection: {\n return {\n typeID: type.typeID,\n base: mangleRadicals(funcName, debool(type))\n };\n }\n case TypeID.tuple: {\n const factors: Typification[] = [];\n for (let index = 1; index <= type.factors.length; ++index) {\n factors.push(mangleRadicals(funcName, component(type, index)!));\n }\n return {\n typeID: type.typeID,\n factors: factors\n };\n }\n }\n}\n\n/** Local variable data. */\ninterface LocalData {\n alias: string;\n level: number;\n useCount: number;\n type: Typification;\n}\n\nfunction isLogicBinaryNode(typeID: number): boolean {\n return (\n typeID === TokenID.LOGIC_AND ||\n typeID === TokenID.LOGIC_OR ||\n typeID === TokenID.LOGIC_IMPLICATION ||\n typeID === TokenID.LOGIC_EQUIVALENT\n );\n}\n\nfunction isQuantifierNode(typeID: number): boolean {\n return typeID === TokenID.QUANTOR_UNIVERSAL || typeID === TokenID.QUANTOR_EXISTS;\n}\n\n/** Quantifier on the path from `node` up through `stopAt` (inclusive). */\nfunction pathContainsQuantifier(node: AstNode, stopAt: AstNode): boolean {\n let current: AstNode | null = node;\n while (current !== null) {\n if (isQuantifierNode(current.typeID)) {\n return true;\n }\n if (current === stopAt) {\n return false;\n }\n current = current.parent;\n }\n return false;\n}\n\n/** Right operand subtree of the innermost logic binary containing `node`. */\nfunction findRightLogicOperandRoot(node: AstNode): AstNode | null {\n let current: AstNode | null = node;\n while (current !== null && current.parent !== null) {\n const parent: AstNode = current.parent;\n if (isLogicBinaryNode(parent.typeID)) {\n const childIndex = parent.children.indexOf(current);\n if (childIndex > 0) {\n return current;\n }\n }\n current = parent;\n }\n return null;\n}\n\n/** Local variables context. */\nclass LocalContext {\n private onError: (code: RSErrorCode, node: AstNode, params: string[]) => null;\n\n public data: LocalData[] = [];\n\n constructor(onError: (code: RSErrorCode, node: AstNode, params: string[]) => null) {\n this.onError = onError;\n }\n\n startScope(): void {\n for (const local of this.data) {\n if (local.level > 0) {\n local.level = local.level + 1;\n }\n }\n }\n\n endScope(node: AstNode, skipUnused: boolean = false): void {\n for (const local of this.data) {\n local.level--;\n if (!skipUnused && local.level === 0 && local.useCount === 0) {\n this.onError(RSErrorCode.localNotUsed, node, [local.alias]);\n }\n }\n }\n\n clearUnused(): void {\n this.data = this.data.filter(data => data.level > 0);\n }\n\n pushLocal(node: AstNode, type: Typification): boolean {\n const alias = getNodeText(node);\n const existing = this.data.find(data => data.alias === alias);\n if (existing) {\n if (existing.level > 0) {\n this.onError(RSErrorCode.localShadowing, node, [alias]);\n return false;\n } else {\n this.onError(RSErrorCode.localDoubleDeclare, node, [alias]);\n const index = this.data.indexOf(existing);\n if (index !== -1) {\n this.data.splice(index, 1);\n }\n }\n }\n this.data.push({ alias, type, level: 1, useCount: 0 });\n return true;\n }\n\n getLocalType(node: AstNode): Typification | null {\n const alias = getNodeText(node);\n const local = this.data.find(data => data.alias === alias);\n if (local === undefined) {\n this.onError(RSErrorCode.localUndeclared, node, [alias]);\n return null;\n } else if (local.level < 1) {\n const subexprRoot = findRightLogicOperandRoot(node);\n if (subexprRoot !== null) {\n if (pathContainsQuantifier(node, subexprRoot)) {\n return this.onError(RSErrorCode.localUndeclaredInSubexpr, node, [alias, labelType(local.type)]);\n }\n return this.onError(RSErrorCode.localOutOfScopeParentheses, node, [alias]);\n }\n this.onError(RSErrorCode.localOutOfScope, node, [alias]);\n return null;\n } else {\n local.useCount++;\n return local.type;\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"type-auditor.js","names":[],"sources":["../../../src/rslang/semantic/type-auditor.ts"],"sourcesContent":["/**\n * Module: Type auditor for AST type checking.\n */\n\nimport { type AstNode, getNodeIndices, getNodeText } from '../../parsing';\nimport { annotateError, annotateType } from '../ast-annotations';\nimport { type ErrorReporter, RSErrorCode } from '../error';\nimport { labelRSLangNode, labelToken, labelType } from '../labels';\nimport { TokenID } from '../parser/token';\n\nimport {\n type Argument,\n bool,\n component,\n debool,\n type EchelonTuple,\n EmptySetT,\n type ExpressionType,\n IntegerT,\n isTemplateRadical,\n isTypification,\n LogicT,\n mangleRadicalId,\n type Parametrized,\n tuple,\n type TypeContext,\n TypeID,\n type Typification\n} from './typification';\nimport {\n checkCompatibility,\n checkEquality,\n cloneTypification,\n compareTemplated,\n hasGenerics,\n mergeTypifications,\n substituteBase\n} from './typification-api';\n\n/** Type auditor for AST type checking. */\nexport class TypeAuditor {\n private static readonly TYPE_DEDUCTION_DEPTH = 5;\n\n private context: TypeContext;\n private reporter?: ErrorReporter;\n private locals: LocalContext;\n private annotateTypes: boolean;\n private annotateErrors: boolean;\n\n constructor(context: TypeContext) {\n this.annotateTypes = false;\n this.annotateErrors = false;\n this.context = context;\n this.locals = new LocalContext(this.onError.bind(this));\n }\n\n public run(\n ast: AstNode,\n annotateTypes: boolean,\n reporter?: ErrorReporter,\n annotateErrors: boolean = false\n ): ExpressionType | null {\n if (ast.hasError) {\n return null;\n }\n this.annotateTypes = annotateTypes;\n this.annotateErrors = annotateErrors;\n this.reporter = reporter;\n this.clear();\n return this.dispatchVisit(ast);\n }\n\n private clear(): void {\n this.locals = new LocalContext(this.onError.bind(this));\n }\n\n private dispatchDeclare(node: AstNode, domain: Typification): boolean {\n const result = this.processDeclare(node, domain);\n if (result === true && this.annotateTypes) {\n annotateType(node, domain);\n }\n return result;\n }\n\n private processDeclare(node: AstNode, domain: Typification): boolean {\n switch (node.typeID) {\n case TokenID.ID_LOCAL:\n return this.declareLocal(node, domain);\n case TokenID.NT_TUPLE_DECL:\n return this.declareTuple(node, domain);\n case TokenID.NT_ENUM_DECL:\n return this.declareEnumeration(node, domain);\n }\n return false;\n }\n\n private declareLocal(node: AstNode, domain: Typification): boolean {\n return this.locals.pushLocal(node, domain);\n }\n\n private declareTuple(node: AstNode, domain: Typification): boolean {\n if (domain.typeID !== TypeID.tuple || domain.factors.length !== node.children.length) {\n this.onError(RSErrorCode.invalidCortegeDeclare, node.children[0]);\n return false;\n }\n for (let child = 0; child < node.children.length; child++) {\n if (!this.visitChildDeclaration(node, child, component(domain, child + 1)!)) {\n return false;\n }\n }\n return true;\n }\n\n private declareEnumeration(node: AstNode, domain: Typification): boolean {\n for (const child of node.children) {\n if (!this.dispatchDeclare(child, domain)) {\n return false;\n }\n }\n return true;\n }\n\n private dispatchVisit(node: AstNode): ExpressionType | null {\n const result = this.processVisit(node);\n if (result !== null && this.annotateTypes) {\n annotateType(node, result);\n }\n return result;\n }\n\n private processVisit(node: AstNode): ExpressionType | null {\n switch (node.typeID) {\n case TokenID.ID_GLOBAL:\n case TokenID.ID_FUNCTION:\n case TokenID.ID_PREDICATE:\n return this.visitGlobal(node);\n\n case TokenID.ID_LOCAL:\n return this.visitLocal(node);\n case TokenID.ID_RADICAL:\n return this.visitRadical(node);\n\n case TokenID.LIT_INTEGER:\n return IntegerT;\n case TokenID.LIT_WHOLE_NUMBERS:\n return bool(IntegerT);\n case TokenID.LIT_EMPTYSET:\n return this.visitEmptySet(node);\n\n case TokenID.NT_ARGUMENTS:\n return this.visitArgumentsEnum(node);\n case TokenID.NT_ARG_DECL:\n return this.visitArgument(node);\n\n case TokenID.PLUS:\n case TokenID.MINUS:\n case TokenID.MULTIPLY:\n return this.visitArithmetic(node);\n\n case TokenID.QUANTOR_UNIVERSAL:\n case TokenID.QUANTOR_EXISTS:\n return this.visitQuantifier(node);\n\n case TokenID.LOGIC_NOT:\n return this.visitNegation(node);\n\n case TokenID.LOGIC_AND:\n case TokenID.LOGIC_OR:\n case TokenID.LOGIC_IMPLICATION:\n case TokenID.LOGIC_EQUIVALENT:\n return this.visitLogicBinary(node);\n\n case TokenID.EQUAL:\n case TokenID.NOTEQUAL:\n return this.visitEquals(node);\n\n case TokenID.GREATER:\n case TokenID.LESSER:\n case TokenID.GREATER_OR_EQ:\n case TokenID.LESSER_OR_EQ:\n return this.visitIntegerPredicate(node);\n\n case TokenID.SET_IN:\n case TokenID.SET_NOT_IN:\n case TokenID.SUBSET:\n case TokenID.SUBSET_OR_EQ:\n case TokenID.NOT_SUBSET:\n return this.visitSetexprPredicate(node);\n\n case TokenID.DECART:\n return this.visitDecart(node);\n case TokenID.BOOLEAN:\n return this.visitBoolean(node);\n\n case TokenID.NT_TUPLE:\n return this.visitTuple(node);\n case TokenID.NT_ENUMERATION:\n return this.visitEnumeration(node);\n\n case TokenID.BIGPR:\n return this.visitProjectSet(node);\n case TokenID.SMALLPR:\n return this.visitProjectTuple(node);\n case TokenID.FILTER:\n return this.visitFilter(node);\n\n case TokenID.CARD:\n return this.visitCard(node);\n case TokenID.REDUCE:\n return this.visitReduce(node);\n case TokenID.BOOL:\n return this.visitBool(node);\n case TokenID.DEBOOL:\n return this.visitDebool(node);\n\n case TokenID.SET_UNION:\n case TokenID.SET_INTERSECTION:\n case TokenID.SET_MINUS:\n case TokenID.SET_SYMMETRIC_MINUS:\n return this.visitSetexprBinary(node);\n\n case TokenID.NT_FUNC_DEFINITION:\n return this.visitFunctionDefinition(node);\n\n case TokenID.NT_FUNC_CALL:\n return this.visitFunctionCall(node);\n\n case TokenID.ITERATE:\n return this.visitIterate(node);\n case TokenID.ASSIGN:\n return this.visitAssign(node);\n\n case TokenID.NT_DECLARATIVE_EXPR:\n return this.visitDeclarative(node);\n case TokenID.NT_IMPERATIVE_EXPR:\n return this.visitImperative(node);\n\n case TokenID.NT_RECURSIVE_FULL:\n case TokenID.NT_RECURSIVE_SHORT:\n return this.visitRecursion(node);\n }\n return null;\n }\n\n private onError(code: RSErrorCode, node: AstNode, params?: string[]): null {\n this.reporter?.({ code, from: node.from, to: node.to, params });\n if (this.annotateErrors) {\n annotateError(node, code, params);\n }\n return null;\n }\n\n private visitChild(node: AstNode, index: number): ExpressionType | null {\n if (index >= node.children.length) {\n return null;\n }\n return this.dispatchVisit(node.children[index]);\n }\n\n private visitChildDeclaration(node: AstNode, index: number, domain: Typification): boolean {\n if (index >= node.children.length) {\n return false;\n }\n if (!this.dispatchDeclare(node.children[index], domain)) {\n return false;\n }\n return true;\n }\n\n private visitAllAndReturn(node: AstNode, type: ExpressionType | null): ExpressionType | null {\n for (const child of node.children) {\n if (!this.dispatchVisit(child)) {\n return null;\n }\n }\n return type;\n }\n\n private childTypification(node: AstNode, index: number): Typification | null {\n const result = this.visitChild(node, index);\n if (result === null) {\n return null;\n }\n if (!isTypification(result)) {\n this.onError(RSErrorCode.expectedSetexpr, node.children[index], [labelType(result)]);\n return null;\n }\n return result as Typification;\n }\n\n private childLogic(node: AstNode, index: number): boolean {\n const result = this.visitChild(node, index);\n if (result === null) {\n return false;\n }\n if (result.typeID !== TypeID.logic) {\n this.onError(RSErrorCode.expectedLogic, node.children[index], [labelType(result)]);\n return false;\n }\n return true;\n }\n\n private childTypeDebool(\n node: AstNode,\n index: number,\n errorCode: RSErrorCode,\n operation?: string\n ): Typification | null {\n const result = this.childTypification(node, index);\n if (result === null) {\n return null;\n }\n if (result.typeID === TypeID.anyTypification) {\n return result;\n }\n if (result.typeID !== TypeID.collection) {\n const params =\n errorCode === RSErrorCode.invalidTypeOperation && operation !== undefined\n ? [operation, labelType(result)]\n : [labelType(result)];\n this.onError(errorCode, node.children[index], params);\n return null;\n }\n return debool(result);\n }\n\n private childQuantifierDomain(node: AstNode, index: number, operator: string): Typification | null {\n const result = this.visitChild(node, index);\n if (result === null) {\n return null;\n }\n if (!isTypification(result)) {\n this.onError(RSErrorCode.invalidQuantifierDomain, node.children[index], [operator, labelType(result)]);\n return null;\n }\n if (result.typeID === TypeID.anyTypification) {\n return result;\n }\n if (result.typeID !== TypeID.collection) {\n this.onError(RSErrorCode.invalidQuantifierDomain, node.children[index], [operator, labelType(result)]);\n return null;\n }\n return debool(result);\n }\n\n private visitLocal(node: AstNode): ExpressionType | null {\n return this.locals.getLocalType(node);\n }\n\n private visitGlobal(node: AstNode): ExpressionType | null {\n const alias = getNodeText(node);\n const type = this.context.get(alias);\n if (!type) {\n return this.onError(RSErrorCode.globalNotTyped, node, [alias]);\n }\n if (type.typeID === TypeID.function || type.typeID === TypeID.predicate) {\n return this.onError(RSErrorCode.globalFuncWithoutArgs, node, [alias]);\n }\n return type;\n }\n\n private visitFunctionDefinition(node: AstNode): ExpressionType | null {\n this.locals.startScope();\n if (!this.visitChild(node, 0)) {\n return null;\n }\n\n const args: Argument[] = [];\n for (const local of this.locals.data) {\n if (local.level === 1) {\n args.push({ alias: local.alias, type: local.type });\n }\n }\n\n const result = this.visitChild(node, 1);\n if (result === null || result.typeID === TypeID.function || result.typeID === TypeID.predicate) {\n return null;\n }\n this.locals.endScope(node.children[1]);\n if (result.typeID === TypeID.logic) {\n return {\n typeID: TypeID.predicate,\n result: result,\n args: args\n };\n } else {\n return {\n typeID: TypeID.function,\n result: result,\n args: args\n };\n }\n }\n\n private visitFunctionCall(node: AstNode): ExpressionType | null {\n const funcName = getNodeText(node.children[0]);\n const funcType = this.context.get(funcName);\n if (funcType?.typeID !== TypeID.function && funcType?.typeID !== TypeID.predicate) {\n return this.onError(RSErrorCode.globalNotTyped, node.children[0], [funcName]);\n }\n if (this.annotateTypes) {\n annotateType(node.children[0], funcType);\n }\n\n const substitutes = this.checkFuncArguments(node, funcName, funcType);\n if (substitutes === null) {\n return null;\n }\n if (funcType.result.typeID === TypeID.logic) {\n return funcType.result;\n } else {\n const result = mangleRadicals(funcName, funcType.result);\n if (substitutes.size > 0) {\n substituteBase(result, substitutes);\n }\n return result;\n }\n }\n\n private visitRadical(node: AstNode): ExpressionType | null {\n const alias = getNodeText(node);\n if (!this.isInsideFuncArgument(node)) {\n return this.onError(RSErrorCode.radicalUsage, node, [alias]);\n }\n return bool({ typeID: TypeID.basic, baseID: alias });\n }\n\n private visitEmptySet(node: AstNode): ExpressionType | null {\n const invalidParents: TokenID[] = [\n TokenID.CARD,\n TokenID.DEBOOL,\n TokenID.SET_UNION,\n TokenID.SET_INTERSECTION,\n TokenID.SET_MINUS,\n TokenID.SET_SYMMETRIC_MINUS,\n TokenID.REDUCE,\n TokenID.BIGPR,\n TokenID.SMALLPR\n ];\n if (invalidParents.includes(node.parent?.typeID as TokenID)) {\n return this.onError(RSErrorCode.invalidEmptySetUsage, node);\n }\n return EmptySetT;\n }\n\n private visitArgument(node: AstNode): ExpressionType | null {\n const variable = node.children[0];\n if (variable.typeID === TokenID.NT_TUPLE_DECL) {\n return this.onError(RSErrorCode.invalidArgumentCortegeDeclare, variable);\n }\n const domain = this.childTypeDebool(node, 1, RSErrorCode.invalidTypeOperation, labelToken(TokenID.ITERATE));\n if (domain === null) {\n return null;\n }\n if (!this.visitChildDeclaration(node, 0, domain)) {\n return null;\n }\n return domain;\n }\n\n private visitCard(node: AstNode): ExpressionType | null {\n if (!this.childTypeDebool(node, 0, RSErrorCode.invalidCard)) {\n return null;\n }\n return IntegerT;\n }\n\n private visitArithmetic(node: AstNode): ExpressionType | null {\n const operator = labelRSLangNode(node);\n const type1 = this.childTypification(node, 0);\n if (type1 === null) {\n return null;\n }\n if (!('isArithmetic' in type1 && type1.isArithmetic)) {\n return this.onError(RSErrorCode.arithmeticNotSupported, node.children[0], [labelType(type1), operator]);\n }\n\n const type2 = this.childTypification(node, 1);\n if (type2 === null) {\n return null;\n }\n if (!('isArithmetic' in type2 && type2.isArithmetic)) {\n return this.onError(RSErrorCode.arithmeticNotSupported, node.children[1], [labelType(type2), operator]);\n }\n\n const result = mergeTypifications(type1, type2);\n if (result === null) {\n return this.onError(RSErrorCode.typesNotCompatible, node, [labelType(type1), labelType(type2), operator]);\n }\n return result;\n }\n\n private visitIntegerPredicate(node: AstNode): ExpressionType | null {\n const operator = labelRSLangNode(node);\n const type1 = this.childTypification(node, 0);\n if (type1 === null) {\n return null;\n }\n if (!('isOrdered' in type1 && type1.isOrdered)) {\n return this.onError(RSErrorCode.orderingNotSupported, node.children[0], [labelType(type1), operator]);\n }\n\n const type2 = this.childTypification(node, 1);\n if (type2 === null) {\n return null;\n }\n if (!('isOrdered' in type2 && type2.isOrdered)) {\n return this.onError(RSErrorCode.orderingNotSupported, node.children[1], [labelType(type2), operator]);\n }\n\n if (!checkCompatibility(type1, type2)) {\n return this.onError(RSErrorCode.typesNotCompatible, node, [labelType(type1), labelType(type2), operator]);\n }\n return LogicT;\n }\n\n private visitQuantifier(node: AstNode): ExpressionType | null {\n this.locals.startScope();\n\n const operator = labelRSLangNode(node);\n const domain = this.childQuantifierDomain(node, 1, operator);\n if (domain === null) {\n return null;\n } else if (!this.visitChildDeclaration(node, 0, domain)) {\n return null;\n } else if (!this.childLogic(node, 2)) {\n return null;\n }\n\n this.locals.endScope(node.children[2]);\n return LogicT;\n }\n\n private visitNegation(node: AstNode): ExpressionType | null {\n if (!this.childLogic(node, 0)) {\n return null;\n }\n return LogicT;\n }\n\n private visitLogicBinary(node: AstNode): ExpressionType | null {\n if (!this.childLogic(node, 0) || !this.childLogic(node, 1)) {\n return null;\n }\n return LogicT;\n }\n\n private visitEquals(node: AstNode): ExpressionType | null {\n const operator = labelRSLangNode(node);\n const type1 = this.childTypification(node, 0);\n if (type1 === null) {\n return null;\n }\n\n const type2 = this.childTypification(node, 1);\n if (type2 === null) {\n return null;\n }\n if (!checkCompatibility(type1, type2)) {\n return this.onError(RSErrorCode.typesNotCompatible, node, [labelType(type1), labelType(type2), operator]);\n }\n return LogicT;\n }\n\n private visitSetexprPredicate(node: AstNode): ExpressionType | null {\n const operator = labelRSLangNode(node);\n let type2 = this.childTypeDebool(node, 1, RSErrorCode.invalidTypeOperation, operator);\n if (type2 === null) {\n return null;\n }\n const isSubset = this.isSubset(node.typeID as TokenID);\n if (isSubset) {\n type2 = bool(type2);\n }\n const type1 = this.childTypification(node, 0);\n if (type1 === null) {\n return null;\n }\n\n if (!checkCompatibility(type1, type2)) {\n if (isSubset) {\n return this.onError(RSErrorCode.typesNotEqual, node, [labelType(type1), labelType(type2), operator]);\n } else {\n return this.onError(RSErrorCode.invalidElementPredicate, node, [\n labelType(type1),\n operator,\n labelType(bool(type2))\n ]);\n }\n }\n return LogicT;\n }\n\n private visitDecart(node: AstNode): ExpressionType | null {\n const factors: Typification[] = [];\n for (let child = 0; child < node.children.length; child++) {\n const type = this.childTypeDebool(node, child, RSErrorCode.invalidDecart);\n if (type === null) {\n return null;\n } else {\n factors.push(type);\n }\n }\n return bool(tuple(factors));\n }\n\n private visitBoolean(node: AstNode): ExpressionType | null {\n const type = this.childTypeDebool(node, 0, RSErrorCode.invalidBoolean);\n if (type === null) {\n return null;\n }\n return bool(bool(type));\n }\n\n private visitTuple(node: AstNode): ExpressionType | null {\n const components: Typification[] = [];\n for (let child = 0; child < node.children.length; child++) {\n const type = this.childTypification(node, child);\n if (type === null) {\n return null;\n }\n components.push(type);\n }\n return tuple(components);\n }\n\n private visitEnumeration(node: AstNode): ExpressionType | null {\n let type: ExpressionType | null = this.childTypification(node, 0);\n if (type === null) {\n return null;\n }\n for (let child = 1; child < node.children.length; child++) {\n const childType = this.childTypification(node, child);\n if (childType === null) {\n return null;\n }\n\n const merge = mergeTypifications(type, childType);\n if (merge === null) {\n return this.onError(RSErrorCode.invalidEnumeration, node.children[child], [\n labelType(type),\n labelType(childType)\n ]);\n }\n type = merge;\n }\n return bool(type);\n }\n\n private visitBool(node: AstNode): ExpressionType | null {\n return this.visitEnumeration(node);\n }\n\n private visitDebool(node: AstNode): ExpressionType | null {\n return this.childTypeDebool(node, 0, RSErrorCode.invalidDebool);\n }\n\n private visitSetexprBinary(node: AstNode): ExpressionType | null {\n const operator = labelRSLangNode(node);\n const type1 = this.childTypeDebool(node, 0, RSErrorCode.invalidTypeOperation, operator);\n if (type1 === null) {\n return null;\n }\n\n const type2 = this.childTypeDebool(node, 1, RSErrorCode.invalidTypeOperation, operator);\n if (type2 === null) {\n return null;\n }\n\n const result = mergeTypifications(type1, type2);\n if (result === null) {\n return this.onError(RSErrorCode.typesNotEqual, node, [labelType(bool(type1)), labelType(bool(type2)), operator]);\n }\n return bool(result);\n }\n\n private visitProjectSet(node: AstNode): ExpressionType | null {\n const operator = labelRSLangNode(node);\n const argNode = node.children[0];\n const argType = this.childTypification(node, 0);\n if (argType === null) {\n return null;\n }\n if (argType.typeID === TypeID.anyTypification) {\n return EmptySetT;\n }\n if (argType.typeID !== TypeID.collection) {\n return this.onError(RSErrorCode.projectionSetArgumentNotSet, argNode, [operator, labelType(argType)]);\n }\n const argument = debool(argType);\n if (argument.typeID !== TypeID.tuple) {\n return this.onError(RSErrorCode.projectionSetArgumentNotTupleSet, argNode, [operator, labelType(bool(argument))]);\n }\n\n const indices = getNodeIndices(node);\n const components: Typification[] = [];\n for (const index of indices) {\n const newComponent = component(argument, index);\n if (newComponent === null) {\n return this.onError(RSErrorCode.projectionSetIndexOutOfRange, argNode, [\n operator,\n String(index),\n String(argument.factors.length),\n labelType(bool(argument))\n ]);\n } else {\n components.push(newComponent);\n }\n }\n if (components.length === 1) {\n return bool(components[0]);\n } else {\n return bool(tuple(components));\n }\n }\n\n private visitProjectTuple(node: AstNode): ExpressionType | null {\n const operator = labelRSLangNode(node);\n const argNode = node.children[0];\n const argument = this.childTypification(node, 0);\n if (argument === null) {\n return null;\n }\n if (argument.typeID === TypeID.anyTypification) {\n return argument;\n }\n if (argument.typeID !== TypeID.tuple) {\n return this.onError(RSErrorCode.projectionTupleArgumentNotTuple, argNode, [operator, labelType(argument)]);\n }\n\n const indices = getNodeIndices(node);\n const components: Typification[] = [];\n for (const index of indices) {\n const newComponent = component(argument, index);\n if (newComponent === null) {\n return this.onError(RSErrorCode.projectionTupleIndexOutOfRange, argNode, [\n operator,\n String(index),\n String(argument.factors.length),\n labelType(argument)\n ]);\n } else {\n components.push(newComponent);\n }\n }\n if (components.length === 1) {\n return components[0];\n } else {\n return tuple(components);\n }\n }\n\n private visitFilter(node: AstNode): ExpressionType | null {\n const operator = labelRSLangNode(node);\n const indices = getNodeIndices(node);\n const tupleParam = indices.length === node.children.length - 1;\n if (!tupleParam && node.children.length > 2) {\n const extraParam = node.children[indices.length];\n return this.onError(RSErrorCode.invalidFilterArity, extraParam ?? node, [\n String(indices.length),\n String(node.children.length - 1),\n operator\n ]);\n }\n\n const argument = this.childTypification(node, node.children.length - 1);\n if (argument === null) {\n return null;\n }\n if (\n argument.typeID === TypeID.anyTypification ||\n (argument.typeID === TypeID.collection && argument.base.typeID === TypeID.anyTypification)\n ) {\n return EmptySetT;\n }\n const expectedArgument = this.expectedFilterArgumentLabel(indices);\n if (argument.typeID !== TypeID.collection || argument.base.typeID !== TypeID.tuple) {\n return this.onError(RSErrorCode.invalidFilterArgumentType, node.children[node.children.length - 1], [\n operator,\n labelType(argument),\n expectedArgument\n ]);\n }\n\n const argBase = debool(argument) as EchelonTuple;\n const bases: Typification[] = [];\n for (const index of indices) {\n const newBase = component(argBase, index);\n if (newBase === null) {\n return this.onError(RSErrorCode.invalidFilterIndex, node.children[node.children.length - 1], [\n operator,\n labelType(argument),\n String(index),\n String(argBase.factors.length)\n ]);\n }\n bases.push(newBase);\n }\n\n if (tupleParam) {\n for (let child = 0; child + 1 < node.children.length; child++) {\n const param = this.childTypification(node, child);\n if (param === null) {\n return null;\n }\n const expectedParam = bool(bases[child]);\n if (param.typeID !== TypeID.collection || !checkCompatibility(bases[child], debool(param))) {\n return this.reportFilterParameterError(node, child, param, expectedParam, operator);\n }\n }\n } else {\n const param = this.childTypification(node, 0);\n if (param === null) {\n return null;\n }\n const paramType = param;\n const expected = bool(tuple(bases));\n if (paramType.typeID !== TypeID.collection || !checkCompatibility(expected, paramType)) {\n return this.reportFilterParameterError(node, 0, paramType, expected, operator);\n }\n }\n return argument;\n }\n\n private expectedFilterArgumentLabel(indices: number[]): string {\n const maxIndex = Math.max(...indices, 0);\n if (maxIndex <= 1) {\n return labelType(bool({ typeID: TypeID.anyTypification }));\n }\n const factors: Typification[] = [];\n for (let index = 1; index <= maxIndex; index++) {\n factors.push({ typeID: TypeID.anyTypification });\n }\n return labelType(bool(tuple(factors)));\n }\n\n private reportFilterParameterError(\n node: AstNode,\n childIndex: number,\n param: Typification,\n expected: Typification,\n operator: string\n ): null {\n const wrapped = bool(param);\n if (checkEquality(wrapped, expected) || checkCompatibility(wrapped, expected)) {\n return this.onError(RSErrorCode.invalidFilterBooleanEchelon, node.children[childIndex], [\n operator,\n labelType(param)\n ]);\n }\n return this.onError(RSErrorCode.invalidFilterParameterType, node.children[childIndex], [\n labelType(param),\n labelType(expected),\n operator\n ]);\n }\n\n private visitReduce(node: AstNode): ExpressionType | null {\n const argument = this.childTypification(node, 0);\n if (argument === null) {\n return null;\n }\n if (\n argument.typeID === TypeID.anyTypification ||\n (argument.typeID === TypeID.collection && argument.base.typeID === TypeID.anyTypification)\n ) {\n return EmptySetT;\n }\n if (argument.typeID !== TypeID.collection || argument.base.typeID !== TypeID.collection) {\n return this.onError(RSErrorCode.invalidReduce, node.children[0], [labelType(argument)]);\n }\n return debool(argument);\n }\n\n private visitArgumentsEnum(node: AstNode): ExpressionType | null {\n return this.visitAllAndReturn(node, LogicT);\n }\n\n private visitDeclarative(node: AstNode): ExpressionType | null {\n this.locals.startScope();\n\n const domain = this.childTypeDebool(\n node,\n 1,\n RSErrorCode.invalidTypeOperation,\n labelToken(TokenID.NT_DECLARATIVE_EXPR)\n );\n if (domain === null) {\n return null;\n } else if (!this.visitChildDeclaration(node, 0, domain)) {\n return null;\n } else if (!this.childLogic(node, 2)) {\n return null;\n }\n\n this.locals.endScope(node.children[2]);\n return bool(domain);\n }\n\n private visitImperative(node: AstNode): ExpressionType | null {\n this.locals.startScope();\n\n for (let child = 1; child < node.children.length; child++) {\n if (!this.childLogic(node, child)) {\n return null;\n }\n }\n\n const type = this.childTypification(node, 0);\n if (type === null) {\n return null;\n }\n\n this.locals.endScope(node);\n return bool(type);\n }\n\n private visitIterate(node: AstNode): ExpressionType | null {\n const domain = this.childTypeDebool(node, 1, RSErrorCode.invalidTypeOperation, labelToken(TokenID.ITERATE));\n if (domain === null) {\n return null;\n }\n if (!this.visitChildDeclaration(node, 0, domain)) {\n return null;\n }\n return LogicT;\n }\n\n private visitAssign(node: AstNode): ExpressionType | null {\n const domain = this.childTypification(node, 1);\n if (domain === null) {\n return null;\n }\n if (!this.visitChildDeclaration(node, 0, domain)) {\n return null;\n }\n return LogicT;\n }\n\n private visitRecursion(node: AstNode): ExpressionType | null {\n this.locals.startScope();\n\n const initType = this.childTypification(node, 1);\n if (initType === null) {\n return null;\n }\n if (!this.visitChildDeclaration(node, 0, initType)) {\n return null;\n }\n\n const isFull = node.typeID === TokenID.NT_RECURSIVE_FULL;\n const iterationIndex = isFull ? 3 : 2;\n\n let iterationValue = this.childTypification(node, iterationIndex);\n if (iterationValue === null) {\n return null;\n }\n if (!checkCompatibility(iterationValue, initType)) {\n return this.onError(RSErrorCode.typesNotEqual, node.children[iterationIndex], [\n labelType(iterationValue),\n labelType(initType),\n labelToken(node.typeID as TokenID)\n ]);\n }\n\n if (hasGenerics(initType)) {\n for (let retries = TypeAuditor.TYPE_DEDUCTION_DEPTH; retries > 0; retries--) {\n this.locals.endScope(node);\n this.locals.clearUnused();\n this.locals.startScope();\n if (!this.visitChildDeclaration(node, 0, iterationValue)) {\n return null;\n }\n const newIteration = this.childTypification(node, iterationIndex);\n if (newIteration === null) {\n return null;\n }\n if (checkEquality(newIteration, iterationValue)) {\n break;\n }\n iterationValue = newIteration;\n }\n }\n\n if (isFull) {\n if (!this.childLogic(node, 2)) {\n return null;\n }\n }\n\n this.locals.endScope(node);\n return iterationValue;\n }\n\n private isSubset(token: TokenID): boolean {\n return token === TokenID.SUBSET || token === TokenID.SUBSET_OR_EQ || token === TokenID.NOT_SUBSET;\n }\n\n private isInsideFuncArgument(node: AstNode): boolean {\n while (node.parent && node.parent !== node) {\n if (node.typeID === TokenID.NT_ARGUMENTS) return true;\n node = node.parent;\n }\n return false;\n }\n\n private checkFuncArguments(node: AstNode, alias: string, type: Parametrized): Map<string, Typification> | null {\n if (node.children.length - 1 !== type.args.length) {\n return this.onError(RSErrorCode.invalidArgsArity, node, [\n String(type.args.length),\n String(node.children.length - 1)\n ]);\n }\n\n const substitutes = new Map<string, Typification>();\n for (let child = 1; child < node.children.length; child++) {\n const childType = this.childTypification(node, child);\n if (childType === null) {\n return null;\n }\n const argType = mangleRadicals(alias, type.args[child - 1].type);\n if (!compareTemplated(substitutes, argType, childType)) {\n const expectedType = cloneTypification(argType);\n if (substitutes.size > 0) {\n substituteBase(expectedType, substitutes);\n }\n this.onError(RSErrorCode.invalidArgumentType, node.children[child], [\n `${type.args[child - 1].alias}∈${labelType(expectedType)}`,\n labelType(childType)\n ]);\n return null;\n }\n }\n return substitutes;\n }\n}\n\n// ========= Internals ========\nfunction mangleRadicals(funcName: string, type: Typification): Typification {\n switch (type.typeID) {\n default:\n throw new Error(`Unexpected type for ${funcName}: ${JSON.stringify(type)}`);\n case TypeID.anyTypification:\n case TypeID.integer:\n return type;\n case TypeID.basic: {\n if (isTemplateRadical(type.baseID)) {\n return {\n typeID: type.typeID,\n baseID: mangleRadicalId(type.baseID, funcName)\n };\n }\n return type;\n }\n case TypeID.collection: {\n return {\n typeID: type.typeID,\n base: mangleRadicals(funcName, debool(type))\n };\n }\n case TypeID.tuple: {\n const factors: Typification[] = [];\n for (let index = 1; index <= type.factors.length; ++index) {\n factors.push(mangleRadicals(funcName, component(type, index)!));\n }\n return {\n typeID: type.typeID,\n factors: factors\n };\n }\n }\n}\n\n/** Local variable data. */\ninterface LocalData {\n alias: string;\n level: number;\n useCount: number;\n type: Typification;\n}\n\nfunction isLogicBinaryNode(typeID: number): boolean {\n return (\n typeID === TokenID.LOGIC_AND ||\n typeID === TokenID.LOGIC_OR ||\n typeID === TokenID.LOGIC_IMPLICATION ||\n typeID === TokenID.LOGIC_EQUIVALENT\n );\n}\n\nfunction isQuantifierNode(typeID: number): boolean {\n return typeID === TokenID.QUANTOR_UNIVERSAL || typeID === TokenID.QUANTOR_EXISTS;\n}\n\n/** Quantifier on the path from `node` up through `stopAt` (inclusive). */\nfunction pathContainsQuantifier(node: AstNode, stopAt: AstNode): boolean {\n let current: AstNode | null = node;\n while (current !== null) {\n if (isQuantifierNode(current.typeID)) {\n return true;\n }\n if (current === stopAt) {\n return false;\n }\n current = current.parent;\n }\n return false;\n}\n\n/** Right operand subtree of the innermost logic binary containing `node`. */\nfunction findRightLogicOperandRoot(node: AstNode): AstNode | null {\n let current: AstNode | null = node;\n while (current !== null && current.parent !== null) {\n const parent: AstNode = current.parent;\n if (isLogicBinaryNode(parent.typeID)) {\n const childIndex = parent.children.indexOf(current);\n if (childIndex > 0) {\n return current;\n }\n }\n current = parent;\n }\n return null;\n}\n\n/** Local variables context. */\nclass LocalContext {\n private onError: (code: RSErrorCode, node: AstNode, params: string[]) => null;\n\n public data: LocalData[] = [];\n\n constructor(onError: (code: RSErrorCode, node: AstNode, params: string[]) => null) {\n this.onError = onError;\n }\n\n startScope(): void {\n for (const local of this.data) {\n if (local.level > 0) {\n local.level = local.level + 1;\n }\n }\n }\n\n endScope(node: AstNode, skipUnused: boolean = false): void {\n for (const local of this.data) {\n local.level--;\n if (!skipUnused && local.level === 0 && local.useCount === 0) {\n this.onError(RSErrorCode.localNotUsed, node, [local.alias]);\n }\n }\n }\n\n clearUnused(): void {\n this.data = this.data.filter(data => data.level > 0);\n }\n\n pushLocal(node: AstNode, type: Typification): boolean {\n const alias = getNodeText(node);\n const existing = this.data.find(data => data.alias === alias);\n if (existing) {\n if (existing.level > 0) {\n this.onError(RSErrorCode.localShadowing, node, [alias]);\n return false;\n } else {\n this.onError(RSErrorCode.localDoubleDeclare, node, [alias]);\n return false;\n }\n }\n this.data.push({ alias, type, level: 1, useCount: 0 });\n return true;\n }\n\n getLocalType(node: AstNode): Typification | null {\n const alias = getNodeText(node);\n const local = this.data.find(data => data.alias === alias);\n if (local === undefined) {\n return this.onError(RSErrorCode.localUndeclared, node, [alias]);\n } else if (local.level < 1) {\n const subexprRoot = findRightLogicOperandRoot(node);\n if (subexprRoot !== null) {\n if (pathContainsQuantifier(node, subexprRoot)) {\n return this.onError(RSErrorCode.localUndeclaredInSubexpr, node, [alias, labelType(local.type)]);\n }\n return this.onError(RSErrorCode.localOutOfScopeParentheses, node, [alias]);\n }\n return this.onError(RSErrorCode.localOutOfScope, node, [alias]);\n } else {\n local.useCount++;\n return local.type;\n }\n }\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { t as AstNode } from "../../ast-C8sIpKdL.js";
2
- import { t as ErrorReporter } from "../../error-toW0TUHF.js";
2
+ import { t as ErrorReporter } from "../../error-CzIbnP-N.js";
3
3
  import { n as ValueClassContext, t as ValueClass } from "../../value-class-CNI-lqXJ.js";
4
4
 
5
5
  //#region src/rslang/semantic/value-auditor.d.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rsconcept/domain",
3
- "version": "1.7.5",
3
+ "version": "1.7.6",
4
4
  "description": "Shared TypeScript domain for RS language, RSForm, RSModel, RSEngine, OSS, and concept-text helpers.",
5
5
  "license": "MIT",
6
6
  "author": "IRBorisov",
@@ -49,13 +49,13 @@ export const RSErrorCode = {
49
49
  expectedLocal: 0x8415, // 33813
50
50
  expectedType: 0x8416, // 33814
51
51
 
52
- localDoubleDeclare: 0x2801, // 10241
53
52
  localNotUsed: 0x2802, // 10242
54
53
 
55
54
  localUndeclared: 0x8801, // 34817
56
55
  localShadowing: 0x8802, // 34818
56
+ localDoubleDeclare: 0x8803, // 34819
57
57
 
58
- typesNotEqual: 0x8803, // 34819
58
+ typesNotEqual: 0x880a, // 34826
59
59
  globalNotTyped: 0x8804, // 34820
60
60
  invalidDecart: 0x8805, // 34821
61
61
  invalidBoolean: 0x8806, // 34822
@@ -147,5 +147,8 @@ export function getRSErrorPrefix(code: RSErrorCode): string {
147
147
 
148
148
  /** Checks if error is critical. */
149
149
  export function isCritical(code: RSErrorCode): boolean {
150
- return code !== RSErrorCode.localDoubleDeclare && code !== RSErrorCode.localNotUsed;
150
+ if ((code & 0xf000) === 0x2000) {
151
+ return false;
152
+ }
153
+ return true;
151
154
  }
@@ -106,4 +106,12 @@ describe('RSLang analyzer', () => {
106
106
  params: [String(TypeClass.logic), labelType(bool(basic('X1')))]
107
107
  });
108
108
  });
109
+
110
+ it('Rejects duplicate local names across non-overlapping scopes', () => {
111
+ expectError(
112
+ 'D{t ∈ X1 | t=t} ∪ D{t∈X1 | t=t}',
113
+ {},
114
+ { code: RSErrorCode.localDoubleDeclare, from: 20, to: 21, params: ['t'] }
115
+ );
116
+ });
109
117
  });
@@ -1163,10 +1163,7 @@ class LocalContext {
1163
1163
  return false;
1164
1164
  } else {
1165
1165
  this.onError(RSErrorCode.localDoubleDeclare, node, [alias]);
1166
- const index = this.data.indexOf(existing);
1167
- if (index !== -1) {
1168
- this.data.splice(index, 1);
1169
- }
1166
+ return false;
1170
1167
  }
1171
1168
  }
1172
1169
  this.data.push({ alias, type, level: 1, useCount: 0 });
@@ -1177,8 +1174,7 @@ class LocalContext {
1177
1174
  const alias = getNodeText(node);
1178
1175
  const local = this.data.find(data => data.alias === alias);
1179
1176
  if (local === undefined) {
1180
- this.onError(RSErrorCode.localUndeclared, node, [alias]);
1181
- return null;
1177
+ return this.onError(RSErrorCode.localUndeclared, node, [alias]);
1182
1178
  } else if (local.level < 1) {
1183
1179
  const subexprRoot = findRightLogicOperandRoot(node);
1184
1180
  if (subexprRoot !== null) {
@@ -1187,8 +1183,7 @@ class LocalContext {
1187
1183
  }
1188
1184
  return this.onError(RSErrorCode.localOutOfScopeParentheses, node, [alias]);
1189
1185
  }
1190
- this.onError(RSErrorCode.localOutOfScope, node, [alias]);
1191
- return null;
1186
+ return this.onError(RSErrorCode.localOutOfScope, node, [alias]);
1192
1187
  } else {
1193
1188
  local.useCount++;
1194
1189
  return local.type;