@rsconcept/domain 1.1.0 → 1.3.0

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.
@@ -36,7 +36,7 @@ var SubstitutionValidator = class {
36
36
  constructor(schemas, substitutions) {
37
37
  this.schemas = schemas;
38
38
  this.substitutions = substitutions;
39
- if (schemas.length === 0 || substitutions.length === 0) return;
39
+ if (schemas.length === 0) return;
40
40
  for (const schema of schemas) {
41
41
  this.schemaByID.set(schema.id, schema);
42
42
  this.mapping.set(schema.id, {});
@@ -45,6 +45,7 @@ var SubstitutionValidator = class {
45
45
  this.schemaByCst.set(item.id, schema);
46
46
  }
47
47
  }
48
+ if (substitutions.length === 0) return;
48
49
  let index = STARTING_SUB_INDEX;
49
50
  for (const item of substitutions) {
50
51
  this.constituents.add(item.original);
@@ -1 +1 @@
1
- {"version":3,"file":"oss-api.js","names":[],"sources":["../../src/library/oss-api.ts"],"sourcesContent":["/**\n * Module: API for OperationSystem.\n */\n\nimport { Graph } from '../graph';\nimport { type AliasMapping, applyAliasMapping, applyTypificationMapping, isSetTypification } from '../rslang/api';\nimport { labelType } from '../rslang/labels';\nimport { extractBases } from '../rslang/semantic/typification-api';\n\nimport { type LibraryItem } from './library';\nimport { NodeType, type OperationSchema, type SubstitutionErrorDescription, SubstitutionErrorType } from './oss';\nimport { type Constituenta, CstClass, CstType, type RSForm, type Substitution } from './rsform';\n\nconst STARTING_SUB_INDEX = 900; // max semantic index for starting substitution\n\nexport function constructNodeID(type: NodeType, itemID: number): string {\n return type === NodeType.OPERATION ? 'o' + String(itemID) : 'b' + String(itemID);\n}\n\n/** Sorts library items relevant for the specified {@link OperationSchema}. */\nexport function sortItemsForOSS(oss: OperationSchema, items: readonly LibraryItem[]): LibraryItem[] {\n const result = items.filter(item => item.location === oss.location);\n for (const item of items) {\n if (item.visible && item.owner === oss.owner && !result.includes(item)) {\n result.push(item);\n }\n }\n for (const item of items) {\n if (item.visible && !result.includes(item)) {\n result.push(item);\n }\n }\n for (const item of items) {\n if (!result.includes(item)) {\n result.push(item);\n }\n }\n return result;\n}\n\ntype CrossMapping = Map<number, AliasMapping>;\n\n/** Validator for Substitution table. */\nexport class SubstitutionValidator {\n public errors: SubstitutionErrorDescription[] = [];\n public suggestions: Substitution[] = [];\n\n private schemas: RSForm[];\n private substitutions: Substitution[];\n private constituents = new Set<number>();\n private originals = new Set<number>();\n private mapping: CrossMapping = new Map();\n\n private cstByID = new Map<number, Constituenta>();\n private schemaByID = new Map<number, RSForm>();\n private schemaByCst = new Map<number, RSForm>();\n\n constructor(schemas: RSForm[], substitutions: Substitution[]) {\n this.schemas = schemas;\n this.substitutions = substitutions;\n if (schemas.length === 0 || substitutions.length === 0) {\n return;\n }\n\n for (const schema of schemas) {\n this.schemaByID.set(schema.id, schema);\n this.mapping.set(schema.id, {});\n for (const item of schema.items) {\n this.cstByID.set(item.id, item);\n this.schemaByCst.set(item.id, schema);\n }\n }\n let index = STARTING_SUB_INDEX;\n for (const item of substitutions) {\n this.constituents.add(item.original);\n this.constituents.add(item.substitution);\n this.originals.add(item.original);\n const original = this.cstByID.get(item.original);\n const substitution = this.cstByID.get(item.substitution);\n if (!original || !substitution) {\n return;\n }\n index++;\n const newAlias = `${substitution.alias[0]}${index}`;\n this.mapping.get(original.schema)![original.alias] = newAlias;\n this.mapping.get(substitution.schema)![substitution.alias] = newAlias;\n }\n }\n\n public validate(): boolean {\n this.errors = [];\n this.suggestions = [];\n this.calculateSuggestions();\n if (this.substitutions.length === 0) {\n return true;\n }\n if (!this.checkTypes()) {\n return false;\n }\n if (!this.checkCycles()) {\n return false;\n }\n if (!this.checkSubstitutions()) {\n return false;\n }\n return true;\n }\n\n private calculateSuggestions(): void {\n const candidates = new Map<number, string>();\n const minors = new Set<number>();\n const schemaByCst = new Map<number, RSForm>();\n for (const schema of this.schemas) {\n for (const cst of schema.items) {\n if (this.originals.has(cst.id)) {\n continue;\n }\n if (cst.cst_class === CstClass.BASIC || cst.definition_formal.length === 0) {\n continue;\n }\n const inputs = schema.graph.at(cst.id)!.inputs;\n if (inputs.some(id => !this.constituents.has(id))) {\n continue;\n }\n if (inputs.some(id => this.originals.has(id))) {\n minors.add(cst.id);\n }\n candidates.set(cst.id, applyAliasMapping(cst.definition_formal, this.mapping.get(schema.id)!).replace(' ', ''));\n schemaByCst.set(cst.id, schema);\n }\n }\n for (const [key1, value1] of candidates) {\n for (const [key2, value2] of candidates) {\n if (key1 >= key2) {\n continue;\n }\n if (schemaByCst.get(key1) === schemaByCst.get(key2)) {\n continue;\n }\n if (value1 != value2) {\n continue;\n }\n if (minors.has(key2)) {\n this.suggestions.push({\n original: key2,\n substitution: key1\n });\n } else {\n this.suggestions.push({\n original: key1,\n substitution: key2\n });\n }\n }\n }\n }\n\n private checkTypes(): boolean {\n for (const item of this.substitutions) {\n const original = this.cstByID.get(item.original);\n const substitution = this.cstByID.get(item.substitution);\n if (!original || !substitution) {\n return this.reportError(SubstitutionErrorType.invalidIDs, []);\n }\n if (\n substitution.analysis &&\n original.analysis &&\n (!original.analysis.success || !substitution.analysis.success)\n ) {\n return this.reportError(SubstitutionErrorType.incorrectCst, [substitution.alias, original.alias]);\n }\n switch (substitution.cst_type) {\n case CstType.NOMINAL: {\n if (original.cst_type !== CstType.NOMINAL) {\n return this.reportError(SubstitutionErrorType.invalidNominal, [substitution.alias, original.alias]);\n }\n break;\n }\n case CstType.BASE: {\n if (\n original.cst_type !== CstType.BASE &&\n original.cst_type !== CstType.CONSTANT &&\n original.cst_type !== CstType.NOMINAL\n ) {\n return this.reportError(SubstitutionErrorType.invalidBasic, [substitution.alias, original.alias]);\n }\n break;\n }\n\n case CstType.CONSTANT: {\n if (original.cst_type !== CstType.CONSTANT) {\n return this.reportError(SubstitutionErrorType.invalidConstant, [substitution.alias, original.alias]);\n }\n break;\n }\n\n case CstType.AXIOM:\n case CstType.STATEMENT: {\n if (original.cst_type !== CstType.AXIOM && original.cst_type !== CstType.STATEMENT) {\n return this.reportError(SubstitutionErrorType.invalidClasses, [substitution.alias, original.alias]);\n }\n break;\n }\n\n case CstType.FUNCTION: {\n if (original.cst_type !== CstType.FUNCTION) {\n return this.reportError(SubstitutionErrorType.invalidClasses, [substitution.alias, original.alias]);\n }\n break;\n }\n case CstType.PREDICATE: {\n if (original.cst_type !== CstType.PREDICATE) {\n return this.reportError(SubstitutionErrorType.invalidClasses, [substitution.alias, original.alias]);\n }\n break;\n }\n\n case CstType.TERM:\n case CstType.STRUCTURED: {\n if (\n original.cst_type !== CstType.TERM &&\n original.cst_type !== CstType.STRUCTURED &&\n original.cst_type !== CstType.BASE\n ) {\n return this.reportError(SubstitutionErrorType.invalidClasses, [substitution.alias, original.alias]);\n }\n break;\n }\n }\n }\n return true;\n }\n\n private checkCycles(): boolean {\n const graph = new Graph();\n for (const schema of this.schemas) {\n for (const cst of schema.items) {\n if (cst.cst_type === CstType.BASE || cst.cst_type === CstType.CONSTANT) {\n graph.addNode(cst.id);\n }\n }\n }\n for (const item of this.substitutions) {\n const original = this.cstByID.get(item.original)!;\n const substitution = this.cstByID.get(item.substitution)!;\n for (const cst of [original, substitution]) {\n if (cst.cst_type === CstType.BASE || cst.cst_type === CstType.CONSTANT) {\n continue;\n }\n graph.addNode(cst.id);\n if (cst.effectiveType === null) {\n continue;\n }\n const parents = extractBases(cst.effectiveType);\n if (parents.size === 0) {\n continue;\n }\n const schema = this.schemaByID.get(cst.schema)!;\n for (const alias of parents) {\n const parent = schema.cstByAlias.get(alias);\n if (parent) {\n graph.addEdge(parent.id, cst.id);\n }\n }\n }\n graph.addEdge(substitution.id, original.id);\n }\n const cycle = graph.findCycle();\n if (cycle !== null) {\n const cycleMsg = cycle\n .map(id => {\n const cst = this.cstByID.get(id)!;\n const schema = this.schemaByID.get(cst.schema)!;\n return `[${schema.alias}]-${cst.alias}`;\n })\n .join(', ');\n return this.reportError(SubstitutionErrorType.typificationCycle, [cycleMsg]);\n }\n return true;\n }\n\n private checkSubstitutions(): boolean {\n const baseMappings = this.prepareBaseMappings();\n const typeMappings = this.calculateSubstituteMappings(baseMappings);\n if (typeMappings === null) {\n return false;\n }\n for (const item of this.substitutions) {\n const original = this.cstByID.get(item.original)!;\n if (\n original.cst_type === CstType.BASE ||\n original.cst_type === CstType.CONSTANT ||\n original.cst_type === CstType.NOMINAL\n ) {\n continue;\n }\n const substitution = this.cstByID.get(item.substitution)!;\n if (original.cst_type === substitution.cst_type && original.cst_class !== CstClass.BASIC) {\n if (!this.checkEqual(original, substitution)) {\n this.reportError(SubstitutionErrorType.unequalExpressions, [substitution.alias, original.alias]);\n // Note: do not interrupt the validation process. Only warn about the problem.\n }\n }\n\n if (original.analysis.success !== substitution.analysis.success) {\n return this.reportError(SubstitutionErrorType.unequalTypification, [substitution.alias, original.alias]);\n }\n if (!original.analysis.success || !substitution.analysis.success) {\n continue;\n }\n\n const originalType = applyTypificationMapping(\n applyAliasMapping(labelType(original.effectiveType), baseMappings.get(original.schema)!),\n typeMappings\n );\n const substitutionType = applyTypificationMapping(\n applyAliasMapping(labelType(substitution.effectiveType), baseMappings.get(substitution.schema)!),\n typeMappings\n );\n if (originalType !== substitutionType) {\n return this.reportError(SubstitutionErrorType.unequalTypification, [substitution.alias, original.alias]);\n }\n }\n return true;\n }\n\n private prepareBaseMappings(): CrossMapping {\n const result: CrossMapping = new Map();\n let baseCount = 0;\n let constCount = 0;\n for (const schema of this.schemas) {\n const mapping: AliasMapping = {};\n for (const cst of schema.items) {\n if (cst.cst_type === CstType.BASE) {\n baseCount++;\n mapping[cst.alias] = `X${baseCount}`;\n } else if (cst.cst_type === CstType.CONSTANT) {\n constCount++;\n mapping[cst.alias] = `C${constCount}`;\n }\n result.set(schema.id, mapping);\n }\n }\n return result;\n }\n\n private calculateSubstituteMappings(baseMappings: CrossMapping): AliasMapping | null {\n const result: AliasMapping = {};\n const processed = new Set<string>();\n for (const item of this.substitutions) {\n const original = this.cstByID.get(item.original)!;\n if (original.cst_type !== CstType.BASE && original.cst_type !== CstType.CONSTANT) {\n continue;\n }\n const originalAlias = baseMappings.get(original.schema)![original.alias];\n\n const substitution = this.cstByID.get(item.substitution)!;\n let substitutionText = '';\n if (substitution.cst_type === original.cst_type || !substitution.effectiveType) {\n substitutionText = baseMappings.get(substitution.schema)![substitution.alias];\n } else {\n const typeText = labelType(substitution.effectiveType);\n substitutionText = applyAliasMapping(typeText, baseMappings.get(substitution.schema)!);\n substitutionText = applyTypificationMapping(substitutionText, result);\n if (!isSetTypification(substitutionText)) {\n this.reportError(SubstitutionErrorType.baseSubstitutionNotSet, [substitution.alias, typeText]);\n return null;\n }\n if (substitutionText.includes('×') || substitutionText.startsWith('ℬℬ')) {\n substitutionText = substitutionText.slice(1);\n } else {\n substitutionText = substitutionText.slice(2, -1);\n }\n }\n for (const prevAlias of processed) {\n result[prevAlias] = applyTypificationMapping(result[prevAlias], { [originalAlias]: substitutionText });\n }\n result[originalAlias] = substitutionText;\n processed.add(originalAlias);\n }\n return result;\n }\n\n private checkEqual(left: Constituenta, right: Constituenta): boolean {\n const schema1 = this.schemaByID.get(left.schema)!;\n const inputs1 = schema1.graph.at(left.id)!.inputs;\n if (inputs1.some(id => !this.constituents.has(id))) {\n return false;\n }\n const schema2 = this.schemaByID.get(right.schema)!;\n const inputs2 = schema2.graph.at(right.id)!.inputs;\n if (inputs2.some(id => !this.constituents.has(id))) {\n return false;\n }\n const expression1 = applyAliasMapping(left.definition_formal, this.mapping.get(schema1.id)!);\n const expression2 = applyAliasMapping(right.definition_formal, this.mapping.get(schema2.id)!);\n return expression1.replace(' ', '') === expression2.replace(' ', '');\n }\n\n private reportError(errorType: SubstitutionErrorType, params: string[]): boolean {\n this.errors.push({\n errorType: errorType,\n params: params\n });\n return false;\n }\n}\n\n/** Filter relocate candidates from gives schema. */\nexport function getRelocateCandidates(\n source: number,\n destination: number,\n schema: RSForm,\n oss: OperationSchema\n): Constituenta[] {\n const destinationSchema = oss.operationByID.get(destination)?.result;\n if (!destinationSchema) {\n return [];\n }\n const node = oss.graph.at(source);\n if (!node) {\n return [];\n }\n\n if (node.outputs.includes(destination)) {\n return schema.items;\n }\n\n const addedCst = schema.items.filter(item => !item.is_inherited).map(cst => cst.id);\n\n const unreachableBases: number[] = [];\n for (const cst of schema.items.filter(item => item.is_inherited)) {\n if (cst.parent_schema == destinationSchema) {\n continue;\n }\n const parent = schema.inheritance.find(item => item.child === cst.id && item.child_source === cst.schema)?.parent;\n if (parent) {\n const original = oss.substitutions.find(sub => sub.substitution === parent)?.original;\n if (original) {\n continue;\n }\n }\n unreachableBases.push(cst.id);\n }\n const unreachable = schema.graph.expandAllOutputs(unreachableBases);\n return schema.items.filter(\n cst => cst.parent_schema === destinationSchema || (addedCst.includes(cst.id) && !unreachable.includes(cst.id))\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"oss-api.js","names":[],"sources":["../../src/library/oss-api.ts"],"sourcesContent":["/**\n * Module: API for OperationSystem.\n */\n\nimport { Graph } from '../graph';\nimport { type AliasMapping, applyAliasMapping, applyTypificationMapping, isSetTypification } from '../rslang/api';\nimport { labelType } from '../rslang/labels';\nimport { extractBases } from '../rslang/semantic/typification-api';\n\nimport { type LibraryItem } from './library';\nimport { NodeType, type OperationSchema, type SubstitutionErrorDescription, SubstitutionErrorType } from './oss';\nimport { type Constituenta, CstClass, CstType, type RSForm, type Substitution } from './rsform';\n\nconst STARTING_SUB_INDEX = 900; // max semantic index for starting substitution\n\nexport function constructNodeID(type: NodeType, itemID: number): string {\n return type === NodeType.OPERATION ? 'o' + String(itemID) : 'b' + String(itemID);\n}\n\n/** Sorts library items relevant for the specified {@link OperationSchema}. */\nexport function sortItemsForOSS(oss: OperationSchema, items: readonly LibraryItem[]): LibraryItem[] {\n const result = items.filter(item => item.location === oss.location);\n for (const item of items) {\n if (item.visible && item.owner === oss.owner && !result.includes(item)) {\n result.push(item);\n }\n }\n for (const item of items) {\n if (item.visible && !result.includes(item)) {\n result.push(item);\n }\n }\n for (const item of items) {\n if (!result.includes(item)) {\n result.push(item);\n }\n }\n return result;\n}\n\ntype CrossMapping = Map<number, AliasMapping>;\n\n/** Validator for Substitution table. */\nexport class SubstitutionValidator {\n public errors: SubstitutionErrorDescription[] = [];\n public suggestions: Substitution[] = [];\n\n private schemas: RSForm[];\n private substitutions: Substitution[];\n private constituents = new Set<number>();\n private originals = new Set<number>();\n private mapping: CrossMapping = new Map();\n\n private cstByID = new Map<number, Constituenta>();\n private schemaByID = new Map<number, RSForm>();\n private schemaByCst = new Map<number, RSForm>();\n\n constructor(schemas: RSForm[], substitutions: Substitution[]) {\n this.schemas = schemas;\n this.substitutions = substitutions;\n if (schemas.length === 0) {\n return;\n }\n\n for (const schema of schemas) {\n this.schemaByID.set(schema.id, schema);\n this.mapping.set(schema.id, {});\n for (const item of schema.items) {\n this.cstByID.set(item.id, item);\n this.schemaByCst.set(item.id, schema);\n }\n }\n if (substitutions.length === 0) {\n return;\n }\n let index = STARTING_SUB_INDEX;\n for (const item of substitutions) {\n this.constituents.add(item.original);\n this.constituents.add(item.substitution);\n this.originals.add(item.original);\n const original = this.cstByID.get(item.original);\n const substitution = this.cstByID.get(item.substitution);\n if (!original || !substitution) {\n return;\n }\n index++;\n const newAlias = `${substitution.alias[0]}${index}`;\n this.mapping.get(original.schema)![original.alias] = newAlias;\n this.mapping.get(substitution.schema)![substitution.alias] = newAlias;\n }\n }\n\n public validate(): boolean {\n this.errors = [];\n this.suggestions = [];\n this.calculateSuggestions();\n if (this.substitutions.length === 0) {\n return true;\n }\n if (!this.checkTypes()) {\n return false;\n }\n if (!this.checkCycles()) {\n return false;\n }\n if (!this.checkSubstitutions()) {\n return false;\n }\n return true;\n }\n\n private calculateSuggestions(): void {\n const candidates = new Map<number, string>();\n const minors = new Set<number>();\n const schemaByCst = new Map<number, RSForm>();\n for (const schema of this.schemas) {\n for (const cst of schema.items) {\n if (this.originals.has(cst.id)) {\n continue;\n }\n if (cst.cst_class === CstClass.BASIC || cst.definition_formal.length === 0) {\n continue;\n }\n const inputs = schema.graph.at(cst.id)!.inputs;\n if (inputs.some(id => !this.constituents.has(id))) {\n continue;\n }\n if (inputs.some(id => this.originals.has(id))) {\n minors.add(cst.id);\n }\n candidates.set(cst.id, applyAliasMapping(cst.definition_formal, this.mapping.get(schema.id)!).replace(' ', ''));\n schemaByCst.set(cst.id, schema);\n }\n }\n for (const [key1, value1] of candidates) {\n for (const [key2, value2] of candidates) {\n if (key1 >= key2) {\n continue;\n }\n if (schemaByCst.get(key1) === schemaByCst.get(key2)) {\n continue;\n }\n if (value1 != value2) {\n continue;\n }\n if (minors.has(key2)) {\n this.suggestions.push({\n original: key2,\n substitution: key1\n });\n } else {\n this.suggestions.push({\n original: key1,\n substitution: key2\n });\n }\n }\n }\n }\n\n private checkTypes(): boolean {\n for (const item of this.substitutions) {\n const original = this.cstByID.get(item.original);\n const substitution = this.cstByID.get(item.substitution);\n if (!original || !substitution) {\n return this.reportError(SubstitutionErrorType.invalidIDs, []);\n }\n if (\n substitution.analysis &&\n original.analysis &&\n (!original.analysis.success || !substitution.analysis.success)\n ) {\n return this.reportError(SubstitutionErrorType.incorrectCst, [substitution.alias, original.alias]);\n }\n switch (substitution.cst_type) {\n case CstType.NOMINAL: {\n if (original.cst_type !== CstType.NOMINAL) {\n return this.reportError(SubstitutionErrorType.invalidNominal, [substitution.alias, original.alias]);\n }\n break;\n }\n case CstType.BASE: {\n if (\n original.cst_type !== CstType.BASE &&\n original.cst_type !== CstType.CONSTANT &&\n original.cst_type !== CstType.NOMINAL\n ) {\n return this.reportError(SubstitutionErrorType.invalidBasic, [substitution.alias, original.alias]);\n }\n break;\n }\n\n case CstType.CONSTANT: {\n if (original.cst_type !== CstType.CONSTANT) {\n return this.reportError(SubstitutionErrorType.invalidConstant, [substitution.alias, original.alias]);\n }\n break;\n }\n\n case CstType.AXIOM:\n case CstType.STATEMENT: {\n if (original.cst_type !== CstType.AXIOM && original.cst_type !== CstType.STATEMENT) {\n return this.reportError(SubstitutionErrorType.invalidClasses, [substitution.alias, original.alias]);\n }\n break;\n }\n\n case CstType.FUNCTION: {\n if (original.cst_type !== CstType.FUNCTION) {\n return this.reportError(SubstitutionErrorType.invalidClasses, [substitution.alias, original.alias]);\n }\n break;\n }\n case CstType.PREDICATE: {\n if (original.cst_type !== CstType.PREDICATE) {\n return this.reportError(SubstitutionErrorType.invalidClasses, [substitution.alias, original.alias]);\n }\n break;\n }\n\n case CstType.TERM:\n case CstType.STRUCTURED: {\n if (\n original.cst_type !== CstType.TERM &&\n original.cst_type !== CstType.STRUCTURED &&\n original.cst_type !== CstType.BASE\n ) {\n return this.reportError(SubstitutionErrorType.invalidClasses, [substitution.alias, original.alias]);\n }\n break;\n }\n }\n }\n return true;\n }\n\n private checkCycles(): boolean {\n const graph = new Graph();\n for (const schema of this.schemas) {\n for (const cst of schema.items) {\n if (cst.cst_type === CstType.BASE || cst.cst_type === CstType.CONSTANT) {\n graph.addNode(cst.id);\n }\n }\n }\n for (const item of this.substitutions) {\n const original = this.cstByID.get(item.original)!;\n const substitution = this.cstByID.get(item.substitution)!;\n for (const cst of [original, substitution]) {\n if (cst.cst_type === CstType.BASE || cst.cst_type === CstType.CONSTANT) {\n continue;\n }\n graph.addNode(cst.id);\n if (cst.effectiveType === null) {\n continue;\n }\n const parents = extractBases(cst.effectiveType);\n if (parents.size === 0) {\n continue;\n }\n const schema = this.schemaByID.get(cst.schema)!;\n for (const alias of parents) {\n const parent = schema.cstByAlias.get(alias);\n if (parent) {\n graph.addEdge(parent.id, cst.id);\n }\n }\n }\n graph.addEdge(substitution.id, original.id);\n }\n const cycle = graph.findCycle();\n if (cycle !== null) {\n const cycleMsg = cycle\n .map(id => {\n const cst = this.cstByID.get(id)!;\n const schema = this.schemaByID.get(cst.schema)!;\n return `[${schema.alias}]-${cst.alias}`;\n })\n .join(', ');\n return this.reportError(SubstitutionErrorType.typificationCycle, [cycleMsg]);\n }\n return true;\n }\n\n private checkSubstitutions(): boolean {\n const baseMappings = this.prepareBaseMappings();\n const typeMappings = this.calculateSubstituteMappings(baseMappings);\n if (typeMappings === null) {\n return false;\n }\n for (const item of this.substitutions) {\n const original = this.cstByID.get(item.original)!;\n if (\n original.cst_type === CstType.BASE ||\n original.cst_type === CstType.CONSTANT ||\n original.cst_type === CstType.NOMINAL\n ) {\n continue;\n }\n const substitution = this.cstByID.get(item.substitution)!;\n if (original.cst_type === substitution.cst_type && original.cst_class !== CstClass.BASIC) {\n if (!this.checkEqual(original, substitution)) {\n this.reportError(SubstitutionErrorType.unequalExpressions, [substitution.alias, original.alias]);\n // Note: do not interrupt the validation process. Only warn about the problem.\n }\n }\n\n if (original.analysis.success !== substitution.analysis.success) {\n return this.reportError(SubstitutionErrorType.unequalTypification, [substitution.alias, original.alias]);\n }\n if (!original.analysis.success || !substitution.analysis.success) {\n continue;\n }\n\n const originalType = applyTypificationMapping(\n applyAliasMapping(labelType(original.effectiveType), baseMappings.get(original.schema)!),\n typeMappings\n );\n const substitutionType = applyTypificationMapping(\n applyAliasMapping(labelType(substitution.effectiveType), baseMappings.get(substitution.schema)!),\n typeMappings\n );\n if (originalType !== substitutionType) {\n return this.reportError(SubstitutionErrorType.unequalTypification, [substitution.alias, original.alias]);\n }\n }\n return true;\n }\n\n private prepareBaseMappings(): CrossMapping {\n const result: CrossMapping = new Map();\n let baseCount = 0;\n let constCount = 0;\n for (const schema of this.schemas) {\n const mapping: AliasMapping = {};\n for (const cst of schema.items) {\n if (cst.cst_type === CstType.BASE) {\n baseCount++;\n mapping[cst.alias] = `X${baseCount}`;\n } else if (cst.cst_type === CstType.CONSTANT) {\n constCount++;\n mapping[cst.alias] = `C${constCount}`;\n }\n result.set(schema.id, mapping);\n }\n }\n return result;\n }\n\n private calculateSubstituteMappings(baseMappings: CrossMapping): AliasMapping | null {\n const result: AliasMapping = {};\n const processed = new Set<string>();\n for (const item of this.substitutions) {\n const original = this.cstByID.get(item.original)!;\n if (original.cst_type !== CstType.BASE && original.cst_type !== CstType.CONSTANT) {\n continue;\n }\n const originalAlias = baseMappings.get(original.schema)![original.alias];\n\n const substitution = this.cstByID.get(item.substitution)!;\n let substitutionText = '';\n if (substitution.cst_type === original.cst_type || !substitution.effectiveType) {\n substitutionText = baseMappings.get(substitution.schema)![substitution.alias];\n } else {\n const typeText = labelType(substitution.effectiveType);\n substitutionText = applyAliasMapping(typeText, baseMappings.get(substitution.schema)!);\n substitutionText = applyTypificationMapping(substitutionText, result);\n if (!isSetTypification(substitutionText)) {\n this.reportError(SubstitutionErrorType.baseSubstitutionNotSet, [substitution.alias, typeText]);\n return null;\n }\n if (substitutionText.includes('×') || substitutionText.startsWith('ℬℬ')) {\n substitutionText = substitutionText.slice(1);\n } else {\n substitutionText = substitutionText.slice(2, -1);\n }\n }\n for (const prevAlias of processed) {\n result[prevAlias] = applyTypificationMapping(result[prevAlias], { [originalAlias]: substitutionText });\n }\n result[originalAlias] = substitutionText;\n processed.add(originalAlias);\n }\n return result;\n }\n\n private checkEqual(left: Constituenta, right: Constituenta): boolean {\n const schema1 = this.schemaByID.get(left.schema)!;\n const inputs1 = schema1.graph.at(left.id)!.inputs;\n if (inputs1.some(id => !this.constituents.has(id))) {\n return false;\n }\n const schema2 = this.schemaByID.get(right.schema)!;\n const inputs2 = schema2.graph.at(right.id)!.inputs;\n if (inputs2.some(id => !this.constituents.has(id))) {\n return false;\n }\n const expression1 = applyAliasMapping(left.definition_formal, this.mapping.get(schema1.id)!);\n const expression2 = applyAliasMapping(right.definition_formal, this.mapping.get(schema2.id)!);\n return expression1.replace(' ', '') === expression2.replace(' ', '');\n }\n\n private reportError(errorType: SubstitutionErrorType, params: string[]): boolean {\n this.errors.push({\n errorType: errorType,\n params: params\n });\n return false;\n }\n}\n\n/** Filter relocate candidates from gives schema. */\nexport function getRelocateCandidates(\n source: number,\n destination: number,\n schema: RSForm,\n oss: OperationSchema\n): Constituenta[] {\n const destinationSchema = oss.operationByID.get(destination)?.result;\n if (!destinationSchema) {\n return [];\n }\n const node = oss.graph.at(source);\n if (!node) {\n return [];\n }\n\n if (node.outputs.includes(destination)) {\n return schema.items;\n }\n\n const addedCst = schema.items.filter(item => !item.is_inherited).map(cst => cst.id);\n\n const unreachableBases: number[] = [];\n for (const cst of schema.items.filter(item => item.is_inherited)) {\n if (cst.parent_schema == destinationSchema) {\n continue;\n }\n const parent = schema.inheritance.find(item => item.child === cst.id && item.child_source === cst.schema)?.parent;\n if (parent) {\n const original = oss.substitutions.find(sub => sub.substitution === parent)?.original;\n if (original) {\n continue;\n }\n }\n unreachableBases.push(cst.id);\n }\n const unreachable = schema.graph.expandAllOutputs(unreachableBases);\n return schema.items.filter(\n cst => cst.parent_schema === destinationSchema || (addedCst.includes(cst.id) && !unreachable.includes(cst.id))\n );\n}\n"],"mappings":"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"}
@@ -519,7 +519,8 @@ var TypeAuditor = class TypeAuditor {
519
519
  };
520
520
  function mangleRadicals(funcName, type) {
521
521
  switch (type.typeID) {
522
- default: throw new Error(`Unexpected type: ${type.typeID}`);
522
+ default: throw new Error(`Unexpected type for ${funcName}: ${JSON.stringify(type)}`);
523
+ case TypeID.anyTypification:
523
524
  case TypeID.integer: return type;
524
525
  case TypeID.basic:
525
526
  if (isRadical(type.baseID)) return {
@@ -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 isRadical,\n isTypification,\n LogicT,\n type Parametrized,\n tuple,\n type TypeContext,\n TypeID,\n type Typification\n} from './typification';\nimport {\n checkCompatibility,\n checkEquality,\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(node: AstNode, index: number, errorCode: RSErrorCode): 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 this.onError(errorCode, node.children[index], [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 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);\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 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)]);\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)]);\n }\n\n const result = mergeTypifications(type1, type2);\n if (result === null) {\n return this.onError(RSErrorCode.typesNotCompatible, node, [labelType(type1), labelType(type2)]);\n }\n return result;\n }\n\n private visitIntegerPredicate(node: AstNode): ExpressionType | null {\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)]);\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)]);\n }\n\n if (!checkCompatibility(type1, type2)) {\n return this.onError(RSErrorCode.typesNotCompatible, node, [labelType(type1), labelType(type2)]);\n }\n return LogicT;\n }\n\n private visitQuantifier(node: AstNode): ExpressionType | null {\n this.locals.startScope();\n\n const domain = this.childTypeDebool(node, 1, RSErrorCode.invalidTypeOperation);\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 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)]);\n }\n return LogicT;\n }\n\n private visitSetexprPredicate(node: AstNode): ExpressionType | null {\n let type2 = this.childTypeDebool(node, 1, RSErrorCode.invalidTypeOperation);\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)]);\n } else {\n return this.onError(RSErrorCode.invalidElementPredicate, node, [\n labelType(type1),\n labelToken(node.typeID as TokenID),\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 type1 = this.childTypeDebool(node, 0, RSErrorCode.invalidTypeOperation);\n if (type1 === null) {\n return null;\n }\n\n const type2 = this.childTypeDebool(node, 1, RSErrorCode.invalidTypeOperation);\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))]);\n }\n return bool(result);\n }\n\n private visitProjectSet(node: AstNode): ExpressionType | null {\n const argument = this.childTypeDebool(node, 0, RSErrorCode.invalidProjectionSet);\n if (argument === null) {\n return null;\n }\n if (argument.typeID === TypeID.anyTypification) {\n return EmptySetT;\n }\n if (argument.typeID !== TypeID.tuple) {\n return this.onError(RSErrorCode.invalidProjectionSet, node.children[0], [\n labelRSLangNode(node),\n labelType(bool(argument))\n ]);\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.invalidProjectionSet, node.children[0], [\n labelRSLangNode(node),\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 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.invalidProjectionTuple, node.children[0], [\n labelRSLangNode(node),\n labelType(argument)\n ]);\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.invalidProjectionTuple, node.children[0], [\n labelRSLangNode(node),\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 indices = getNodeIndices(node);\n const tupleParam = indices.length === node.children.length - 1;\n if (!tupleParam && node.children.length > 2) {\n return this.onError(RSErrorCode.invalidFilterArity, node);\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 if (argument.typeID !== TypeID.collection || argument.base.typeID !== TypeID.tuple) {\n return this.onError(RSErrorCode.invalidFilterArgumentType, node.children[node.children.length - 1], [\n labelRSLangNode(node),\n labelType(argument)\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.invalidFilterArgumentType, node.children[node.children.length - 1], [\n labelRSLangNode(node),\n labelType(argument)\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 if (param.typeID !== TypeID.collection || !checkCompatibility(bases[child], debool(param))) {\n return this.onError(RSErrorCode.typesNotEqual, node.children[child], [\n labelType(param),\n labelType(bool(bases[child]))\n ]);\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.onError(RSErrorCode.typesNotEqual, node.children[0], [labelType(paramType), labelType(expected)]);\n }\n }\n return argument;\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(node, 1, RSErrorCode.invalidTypeOperation);\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);\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 ]);\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.children[1], [\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 this.onError(RSErrorCode.invalidArgumentType, node.children[child], [\n `${type.args[child - 1].alias}∈${labelType(argType)}`,\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: ${type.typeID}`);\n case TypeID.integer:\n return type;\n case TypeID.basic: {\n if (isRadical(type.baseID)) {\n return {\n typeID: type.typeID,\n baseID: 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\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 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 isRadical,\n isTypification,\n LogicT,\n type Parametrized,\n tuple,\n type TypeContext,\n TypeID,\n type Typification\n} from './typification';\nimport {\n checkCompatibility,\n checkEquality,\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(node: AstNode, index: number, errorCode: RSErrorCode): 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 this.onError(errorCode, node.children[index], [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 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);\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 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)]);\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)]);\n }\n\n const result = mergeTypifications(type1, type2);\n if (result === null) {\n return this.onError(RSErrorCode.typesNotCompatible, node, [labelType(type1), labelType(type2)]);\n }\n return result;\n }\n\n private visitIntegerPredicate(node: AstNode): ExpressionType | null {\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)]);\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)]);\n }\n\n if (!checkCompatibility(type1, type2)) {\n return this.onError(RSErrorCode.typesNotCompatible, node, [labelType(type1), labelType(type2)]);\n }\n return LogicT;\n }\n\n private visitQuantifier(node: AstNode): ExpressionType | null {\n this.locals.startScope();\n\n const domain = this.childTypeDebool(node, 1, RSErrorCode.invalidTypeOperation);\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 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)]);\n }\n return LogicT;\n }\n\n private visitSetexprPredicate(node: AstNode): ExpressionType | null {\n let type2 = this.childTypeDebool(node, 1, RSErrorCode.invalidTypeOperation);\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)]);\n } else {\n return this.onError(RSErrorCode.invalidElementPredicate, node, [\n labelType(type1),\n labelToken(node.typeID as TokenID),\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 type1 = this.childTypeDebool(node, 0, RSErrorCode.invalidTypeOperation);\n if (type1 === null) {\n return null;\n }\n\n const type2 = this.childTypeDebool(node, 1, RSErrorCode.invalidTypeOperation);\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))]);\n }\n return bool(result);\n }\n\n private visitProjectSet(node: AstNode): ExpressionType | null {\n const argument = this.childTypeDebool(node, 0, RSErrorCode.invalidProjectionSet);\n if (argument === null) {\n return null;\n }\n if (argument.typeID === TypeID.anyTypification) {\n return EmptySetT;\n }\n if (argument.typeID !== TypeID.tuple) {\n return this.onError(RSErrorCode.invalidProjectionSet, node.children[0], [\n labelRSLangNode(node),\n labelType(bool(argument))\n ]);\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.invalidProjectionSet, node.children[0], [\n labelRSLangNode(node),\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 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.invalidProjectionTuple, node.children[0], [\n labelRSLangNode(node),\n labelType(argument)\n ]);\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.invalidProjectionTuple, node.children[0], [\n labelRSLangNode(node),\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 indices = getNodeIndices(node);\n const tupleParam = indices.length === node.children.length - 1;\n if (!tupleParam && node.children.length > 2) {\n return this.onError(RSErrorCode.invalidFilterArity, node);\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 if (argument.typeID !== TypeID.collection || argument.base.typeID !== TypeID.tuple) {\n return this.onError(RSErrorCode.invalidFilterArgumentType, node.children[node.children.length - 1], [\n labelRSLangNode(node),\n labelType(argument)\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.invalidFilterArgumentType, node.children[node.children.length - 1], [\n labelRSLangNode(node),\n labelType(argument)\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 if (param.typeID !== TypeID.collection || !checkCompatibility(bases[child], debool(param))) {\n return this.onError(RSErrorCode.typesNotEqual, node.children[child], [\n labelType(param),\n labelType(bool(bases[child]))\n ]);\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.onError(RSErrorCode.typesNotEqual, node.children[0], [labelType(paramType), labelType(expected)]);\n }\n }\n return argument;\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(node, 1, RSErrorCode.invalidTypeOperation);\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);\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 ]);\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.children[1], [\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 this.onError(RSErrorCode.invalidArgumentType, node.children[child], [\n `${type.args[child - 1].alias}∈${labelType(argType)}`,\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 (isRadical(type.baseID)) {\n return {\n typeID: type.typeID,\n baseID: 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\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 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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"}
@@ -100,7 +100,7 @@ function compareTemplated(substitutes, arg, value) {
100
100
  substitutes.set(arg.baseID, mergeType);
101
101
  return true;
102
102
  }
103
- if (value.typeID === TypeID.anyTypification) return true;
103
+ if (arg.typeID === TypeID.anyTypification || value.typeID === TypeID.anyTypification) return true;
104
104
  if (arg.typeID === TypeID.integer || arg.typeID === TypeID.basic || value.typeID === TypeID.integer || value.typeID === TypeID.basic) return commonType(arg, value) !== null;
105
105
  if (arg.typeID !== value.typeID) return false;
106
106
  switch (arg.typeID) {
@@ -1 +1 @@
1
- {"version":3,"file":"typification-api.js","names":[],"sources":["../../../src/rslang/semantic/typification-api.ts"],"sourcesContent":["/**\n * Module: Typification API for RSLang.\n */\n\nimport {\n bool,\n component,\n type EchelonBase,\n type EchelonCollection,\n type EchelonTuple,\n type ExpressionType,\n IntegerT,\n isRadical,\n isTypification,\n tuple,\n TypeClass,\n TypeID,\n type TypePath,\n type Typification\n} from './typification';\n\n/** Record map from typeID to typeClass. */\nconst TypeIDToClass: Record<TypeID, TypeClass> = {\n [TypeID.anyTypification]: TypeClass.typification,\n [TypeID.integer]: TypeClass.typification,\n [TypeID.basic]: TypeClass.typification,\n [TypeID.tuple]: TypeClass.typification,\n [TypeID.collection]: TypeClass.typification,\n [TypeID.logic]: TypeClass.logic,\n [TypeID.function]: TypeClass.function,\n [TypeID.predicate]: TypeClass.predicate\n};\n\n/** Returns the TypeClass associated with the given TypeID. */\nexport function getTypeClass(typeID: TypeID): TypeClass {\n return TypeIDToClass[typeID];\n}\n\n/** Returns true if the given typification is generic. */\nexport function hasGenerics(type: Typification): boolean {\n switch (type.typeID) {\n case TypeID.anyTypification:\n return true;\n case TypeID.integer:\n return false;\n case TypeID.basic:\n return isRadical(type.baseID);\n case TypeID.collection:\n return hasGenerics(type.base);\n case TypeID.tuple:\n for (const factor of type.factors) {\n if (hasGenerics(factor)) {\n return true;\n }\n }\n return false;\n }\n}\n\n/** Checks if two typifications are equal. */\nexport function checkEquality(type1: Typification, type2: Typification): boolean {\n if (type1 === type2) {\n return true;\n }\n if (type1.typeID !== type2.typeID) {\n return false;\n }\n switch (type1.typeID) {\n case TypeID.integer:\n case TypeID.anyTypification:\n return true;\n case TypeID.basic:\n return type1.baseID === (type2 as EchelonBase).baseID;\n case TypeID.collection:\n return checkEquality(type1.base, (type2 as EchelonCollection).base);\n case TypeID.tuple: {\n if (type1.factors.length !== (type2 as EchelonTuple).factors.length) {\n return false;\n }\n for (let index = 0; index < type1.factors.length; ++index) {\n if (!checkEquality(type1.factors[index], (type2 as EchelonTuple).factors[index])) {\n return false;\n }\n }\n return true;\n }\n }\n}\n\n/** Merge two types to get result of binary operation. */\nexport function mergeTypifications(type1: Typification, type2: Typification): Typification | null {\n if (type1 === type2) {\n return type1;\n }\n if (type1.typeID === TypeID.anyTypification) {\n return isTypification(type2) ? type2 : null;\n }\n if (type2.typeID === TypeID.anyTypification) {\n return isTypification(type1) ? type1 : null;\n }\n\n switch (type1.typeID) {\n case TypeID.integer:\n case TypeID.basic:\n return commonType(type1, type2);\n case TypeID.collection:\n if (type2.typeID !== TypeID.collection) {\n return null;\n }\n const base = mergeTypifications(type1.base, type2.base);\n return base ? bool(base) : null;\n case TypeID.tuple:\n if (type2.typeID !== TypeID.tuple) {\n return null;\n }\n if (type1.factors.length !== type2.factors.length) {\n return null;\n }\n const components: Typification[] = [];\n for (let index = 0; index < type1.factors.length; ++index) {\n const component = mergeTypifications(type1.factors[index], type2.factors[index]);\n if (component === null) {\n return null;\n }\n components.push(component);\n }\n return tuple(components);\n }\n}\n\n/** Check compatibility of typifications. */\nexport function checkCompatibility(type1: ExpressionType, type2: ExpressionType): boolean {\n if (type1 === type2) {\n return true;\n }\n if (type1.typeID === TypeID.anyTypification) {\n return isTypification(type2);\n }\n if (type2.typeID === TypeID.anyTypification) {\n return isTypification(type1);\n }\n if (isTypification(type1) !== isTypification(type2)) {\n return false;\n }\n if (\n type1.typeID === TypeID.integer ||\n type1.typeID === TypeID.basic ||\n type2.typeID === TypeID.integer ||\n type2.typeID === TypeID.basic\n ) {\n return commonType(type1 as Typification, type2 as Typification) !== null;\n }\n\n if (type1.typeID !== type2.typeID) {\n return false;\n }\n switch (type1.typeID) {\n case TypeID.collection:\n return checkCompatibility(type1.base, (type2 as EchelonCollection).base);\n case TypeID.tuple:\n if (type1.factors.length !== (type2 as EchelonTuple).factors.length) {\n return false;\n }\n for (let index = 0; index < type1.factors.length; ++index) {\n if (!checkCompatibility(type1.factors[index], (type2 as EchelonTuple).factors[index])) {\n return false;\n }\n }\n return true;\n case TypeID.logic:\n case TypeID.predicate:\n case TypeID.function:\n return false;\n }\n}\n\n/** Compare typification with substitutions. */\nexport function compareTemplated(\n substitutes: Map<string, Typification>,\n arg: Typification,\n value: Typification\n): boolean {\n if (arg === value) {\n return true;\n }\n if (arg.typeID === TypeID.basic && isRadical(arg.baseID)) {\n if (!substitutes.has(arg.baseID)) {\n substitutes.set(arg.baseID, value);\n return true;\n } else {\n const mergeType = mergeTypifications(substitutes.get(arg.baseID)!, value);\n if (mergeType === null) {\n return false;\n }\n substitutes.set(arg.baseID, mergeType);\n return true;\n }\n }\n if (value.typeID === TypeID.anyTypification) {\n return true;\n }\n if (\n arg.typeID === TypeID.integer ||\n arg.typeID === TypeID.basic ||\n value.typeID === TypeID.integer ||\n value.typeID === TypeID.basic\n ) {\n return commonType(arg, value) !== null;\n }\n if (arg.typeID !== value.typeID) {\n return false;\n }\n switch (arg.typeID) {\n case TypeID.collection:\n return compareTemplated(substitutes, arg.base, (value as EchelonCollection).base);\n case TypeID.tuple: {\n if (arg.factors.length !== (value as EchelonTuple).factors.length) {\n return false;\n }\n for (let index = 0; index < arg.factors.length; ++index) {\n if (!compareTemplated(substitutes, arg.factors[index], (value as EchelonTuple).factors[index])) {\n return false;\n }\n }\n return true;\n }\n }\n}\n\n/** Apply substitutions to typification. */\nexport function substituteBase(target: Typification, substitutes: Map<string, Typification>): void {\n switch (target.typeID) {\n case TypeID.basic: {\n if (substitutes.has(target.baseID)) {\n Object.assign(target, substitutes.get(target.baseID)!);\n }\n return;\n }\n case TypeID.collection: {\n substituteBase(target.base, substitutes);\n return;\n }\n case TypeID.tuple: {\n for (const factor of target.factors) {\n substituteBase(factor, substitutes);\n }\n return;\n }\n }\n}\n\n/** Extract bases from typification. */\nexport function extractBases(target: ExpressionType): Set<string> {\n return new Set(extractBasesImpl(target));\n}\n\n/** Apply type path to typification. */\nexport function applyPath(target: Typification, path: TypePath, index = 0): Typification | null {\n let current: Typification | null = target;\n let i = index;\n while (i < path.length && current) {\n switch (current.typeID) {\n case TypeID.anyTypification:\n case TypeID.integer:\n case TypeID.basic:\n return null;\n case TypeID.collection:\n current = current.base;\n i++;\n break;\n case TypeID.tuple:\n current = component(current, path[i]);\n if (current === null) {\n return null;\n }\n i++;\n break;\n }\n }\n return current;\n}\n\n// ===== Internals =====\nfunction commonType(type1: Typification, type2: Typification): Typification | null {\n if (type1 === type2) {\n return type1;\n }\n const int1 = 'isIntegerCompatible' in type1 && type1.isIntegerCompatible;\n const int2 = 'isIntegerCompatible' in type2 && type2.isIntegerCompatible;\n if (!int1 || !int2) {\n if (type1.typeID === TypeID.basic && type2.typeID === TypeID.basic) {\n return type1.baseID === type2.baseID ? type1 : null;\n }\n return null;\n }\n if (type1.typeID === TypeID.integer) {\n return type2;\n } else if (type2.typeID === TypeID.integer) {\n return type1;\n } else {\n return IntegerT;\n }\n}\n\nfunction extractBasesImpl(target: ExpressionType): string[] {\n switch (target.typeID) {\n case TypeID.basic:\n return [target.baseID];\n case TypeID.collection:\n return extractBasesImpl(target.base);\n case TypeID.tuple:\n return target.factors.reduce((result, factor) => result.concat(extractBasesImpl(factor)), [] as string[]);\n case TypeID.function:\n const result = extractBasesImpl(target.result);\n return target.args.reduce((result, arg) => result.concat(extractBasesImpl(arg.type)), result);\n case TypeID.predicate:\n return target.args.reduce((result, arg) => result.concat(extractBasesImpl(arg.type)), [] as string[]);\n default:\n return [];\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"typification-api.js","names":[],"sources":["../../../src/rslang/semantic/typification-api.ts"],"sourcesContent":["/**\n * Module: Typification API for RSLang.\n */\n\nimport {\n bool,\n component,\n type EchelonBase,\n type EchelonCollection,\n type EchelonTuple,\n type ExpressionType,\n IntegerT,\n isRadical,\n isTypification,\n tuple,\n TypeClass,\n TypeID,\n type TypePath,\n type Typification\n} from './typification';\n\n/** Record map from typeID to typeClass. */\nconst TypeIDToClass: Record<TypeID, TypeClass> = {\n [TypeID.anyTypification]: TypeClass.typification,\n [TypeID.integer]: TypeClass.typification,\n [TypeID.basic]: TypeClass.typification,\n [TypeID.tuple]: TypeClass.typification,\n [TypeID.collection]: TypeClass.typification,\n [TypeID.logic]: TypeClass.logic,\n [TypeID.function]: TypeClass.function,\n [TypeID.predicate]: TypeClass.predicate\n};\n\n/** Returns the TypeClass associated with the given TypeID. */\nexport function getTypeClass(typeID: TypeID): TypeClass {\n return TypeIDToClass[typeID];\n}\n\n/** Returns true if the given typification is generic. */\nexport function hasGenerics(type: Typification): boolean {\n switch (type.typeID) {\n case TypeID.anyTypification:\n return true;\n case TypeID.integer:\n return false;\n case TypeID.basic:\n return isRadical(type.baseID);\n case TypeID.collection:\n return hasGenerics(type.base);\n case TypeID.tuple:\n for (const factor of type.factors) {\n if (hasGenerics(factor)) {\n return true;\n }\n }\n return false;\n }\n}\n\n/** Checks if two typifications are equal. */\nexport function checkEquality(type1: Typification, type2: Typification): boolean {\n if (type1 === type2) {\n return true;\n }\n if (type1.typeID !== type2.typeID) {\n return false;\n }\n switch (type1.typeID) {\n case TypeID.integer:\n case TypeID.anyTypification:\n return true;\n case TypeID.basic:\n return type1.baseID === (type2 as EchelonBase).baseID;\n case TypeID.collection:\n return checkEquality(type1.base, (type2 as EchelonCollection).base);\n case TypeID.tuple: {\n if (type1.factors.length !== (type2 as EchelonTuple).factors.length) {\n return false;\n }\n for (let index = 0; index < type1.factors.length; ++index) {\n if (!checkEquality(type1.factors[index], (type2 as EchelonTuple).factors[index])) {\n return false;\n }\n }\n return true;\n }\n }\n}\n\n/** Merge two types to get result of binary operation. */\nexport function mergeTypifications(type1: Typification, type2: Typification): Typification | null {\n if (type1 === type2) {\n return type1;\n }\n if (type1.typeID === TypeID.anyTypification) {\n return isTypification(type2) ? type2 : null;\n }\n if (type2.typeID === TypeID.anyTypification) {\n return isTypification(type1) ? type1 : null;\n }\n\n switch (type1.typeID) {\n case TypeID.integer:\n case TypeID.basic:\n return commonType(type1, type2);\n case TypeID.collection:\n if (type2.typeID !== TypeID.collection) {\n return null;\n }\n const base = mergeTypifications(type1.base, type2.base);\n return base ? bool(base) : null;\n case TypeID.tuple:\n if (type2.typeID !== TypeID.tuple) {\n return null;\n }\n if (type1.factors.length !== type2.factors.length) {\n return null;\n }\n const components: Typification[] = [];\n for (let index = 0; index < type1.factors.length; ++index) {\n const component = mergeTypifications(type1.factors[index], type2.factors[index]);\n if (component === null) {\n return null;\n }\n components.push(component);\n }\n return tuple(components);\n }\n}\n\n/** Check compatibility of typifications. */\nexport function checkCompatibility(type1: ExpressionType, type2: ExpressionType): boolean {\n if (type1 === type2) {\n return true;\n }\n if (type1.typeID === TypeID.anyTypification) {\n return isTypification(type2);\n }\n if (type2.typeID === TypeID.anyTypification) {\n return isTypification(type1);\n }\n if (isTypification(type1) !== isTypification(type2)) {\n return false;\n }\n if (\n type1.typeID === TypeID.integer ||\n type1.typeID === TypeID.basic ||\n type2.typeID === TypeID.integer ||\n type2.typeID === TypeID.basic\n ) {\n return commonType(type1 as Typification, type2 as Typification) !== null;\n }\n\n if (type1.typeID !== type2.typeID) {\n return false;\n }\n switch (type1.typeID) {\n case TypeID.collection:\n return checkCompatibility(type1.base, (type2 as EchelonCollection).base);\n case TypeID.tuple:\n if (type1.factors.length !== (type2 as EchelonTuple).factors.length) {\n return false;\n }\n for (let index = 0; index < type1.factors.length; ++index) {\n if (!checkCompatibility(type1.factors[index], (type2 as EchelonTuple).factors[index])) {\n return false;\n }\n }\n return true;\n case TypeID.logic:\n case TypeID.predicate:\n case TypeID.function:\n return false;\n }\n}\n\n/** Compare typification with substitutions. */\nexport function compareTemplated(\n substitutes: Map<string, Typification>,\n arg: Typification,\n value: Typification\n): boolean {\n if (arg === value) {\n return true;\n }\n if (arg.typeID === TypeID.basic && isRadical(arg.baseID)) {\n if (!substitutes.has(arg.baseID)) {\n substitutes.set(arg.baseID, value);\n return true;\n } else {\n const mergeType = mergeTypifications(substitutes.get(arg.baseID)!, value);\n if (mergeType === null) {\n return false;\n }\n substitutes.set(arg.baseID, mergeType);\n return true;\n }\n }\n if (arg.typeID === TypeID.anyTypification || value.typeID === TypeID.anyTypification) {\n return true;\n }\n if (\n arg.typeID === TypeID.integer ||\n arg.typeID === TypeID.basic ||\n value.typeID === TypeID.integer ||\n value.typeID === TypeID.basic\n ) {\n return commonType(arg, value) !== null;\n }\n if (arg.typeID !== value.typeID) {\n return false;\n }\n switch (arg.typeID) {\n case TypeID.collection:\n return compareTemplated(substitutes, arg.base, (value as EchelonCollection).base);\n case TypeID.tuple: {\n if (arg.factors.length !== (value as EchelonTuple).factors.length) {\n return false;\n }\n for (let index = 0; index < arg.factors.length; ++index) {\n if (!compareTemplated(substitutes, arg.factors[index], (value as EchelonTuple).factors[index])) {\n return false;\n }\n }\n return true;\n }\n }\n}\n\n/** Apply substitutions to typification. */\nexport function substituteBase(target: Typification, substitutes: Map<string, Typification>): void {\n switch (target.typeID) {\n case TypeID.basic: {\n if (substitutes.has(target.baseID)) {\n Object.assign(target, substitutes.get(target.baseID)!);\n }\n return;\n }\n case TypeID.collection: {\n substituteBase(target.base, substitutes);\n return;\n }\n case TypeID.tuple: {\n for (const factor of target.factors) {\n substituteBase(factor, substitutes);\n }\n return;\n }\n }\n}\n\n/** Extract bases from typification. */\nexport function extractBases(target: ExpressionType): Set<string> {\n return new Set(extractBasesImpl(target));\n}\n\n/** Apply type path to typification. */\nexport function applyPath(target: Typification, path: TypePath, index = 0): Typification | null {\n let current: Typification | null = target;\n let i = index;\n while (i < path.length && current) {\n switch (current.typeID) {\n case TypeID.anyTypification:\n case TypeID.integer:\n case TypeID.basic:\n return null;\n case TypeID.collection:\n current = current.base;\n i++;\n break;\n case TypeID.tuple:\n current = component(current, path[i]);\n if (current === null) {\n return null;\n }\n i++;\n break;\n }\n }\n return current;\n}\n\n// ===== Internals =====\nfunction commonType(type1: Typification, type2: Typification): Typification | null {\n if (type1 === type2) {\n return type1;\n }\n const int1 = 'isIntegerCompatible' in type1 && type1.isIntegerCompatible;\n const int2 = 'isIntegerCompatible' in type2 && type2.isIntegerCompatible;\n if (!int1 || !int2) {\n if (type1.typeID === TypeID.basic && type2.typeID === TypeID.basic) {\n return type1.baseID === type2.baseID ? type1 : null;\n }\n return null;\n }\n if (type1.typeID === TypeID.integer) {\n return type2;\n } else if (type2.typeID === TypeID.integer) {\n return type1;\n } else {\n return IntegerT;\n }\n}\n\nfunction extractBasesImpl(target: ExpressionType): string[] {\n switch (target.typeID) {\n case TypeID.basic:\n return [target.baseID];\n case TypeID.collection:\n return extractBasesImpl(target.base);\n case TypeID.tuple:\n return target.factors.reduce((result, factor) => result.concat(extractBasesImpl(factor)), [] as string[]);\n case TypeID.function:\n const result = extractBasesImpl(target.result);\n return target.args.reduce((result, arg) => result.concat(extractBasesImpl(arg.type)), result);\n case TypeID.predicate:\n return target.args.reduce((result, arg) => result.concat(extractBasesImpl(arg.type)), [] as string[]);\n default:\n return [];\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rsconcept/domain",
3
- "version": "1.1.0",
3
+ "version": "1.3.0",
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",
@@ -176,7 +176,7 @@
176
176
  "tsdown": "^0.22.2",
177
177
  "typescript": "^6.0.3",
178
178
  "typescript-eslint": "^8.61.0",
179
- "vitest": "^4.1.8"
179
+ "vitest": "^4.1.9"
180
180
  },
181
181
  "publishConfig": {
182
182
  "access": "public"
@@ -0,0 +1,76 @@
1
+ import { describe, expect, it } from 'vitest';
2
+
3
+ import { Graph } from '../graph';
4
+
5
+ import { SubstitutionValidator } from './oss-api';
6
+ import { type Constituenta, CstClass, CstType, type RSForm } from './rsform';
7
+
8
+ function mockConstituenta(
9
+ partial: Pick<Constituenta, 'id' | 'alias' | 'definition_formal' | 'cst_class' | 'cst_type'>
10
+ ): Constituenta {
11
+ return {
12
+ schema: 790,
13
+ crucial: false,
14
+ convention: '',
15
+ definition_raw: '',
16
+ definition_resolved: '',
17
+ term_raw: '',
18
+ term_resolved: '',
19
+ term_forms: [],
20
+ typification_manual: '',
21
+ value_is_property: false,
22
+ homonyms: [],
23
+ formalDuplicates: [],
24
+ analysis: { success: true } as Constituenta['analysis'],
25
+ effectiveType: null,
26
+ is_type_mismatch: false,
27
+ status: 'verified',
28
+ is_template: false,
29
+ is_simple_expression: true,
30
+ parent_schema_index: 0,
31
+ parent_schema: null,
32
+ is_inherited: false,
33
+ has_inherited_children: false,
34
+ attributes: [],
35
+ spawn: [],
36
+ spawn_alias: [],
37
+ ...partial
38
+ };
39
+ }
40
+
41
+ function mockSchema(items: Constituenta[]): RSForm {
42
+ const graph = new Graph(items.map(item => [item.id]));
43
+ return {
44
+ id: 790,
45
+ alias: 'S1',
46
+ items,
47
+ graph,
48
+ cstByAlias: new Map(items.map(item => [item.alias, item]))
49
+ } as RSForm;
50
+ }
51
+
52
+ describe('SubstitutionValidator', () => {
53
+ it('validate does not throw when substitutions table is empty', () => {
54
+ const schema = mockSchema([
55
+ mockConstituenta({
56
+ id: 1,
57
+ alias: 'X1',
58
+ cst_class: CstClass.BASIC,
59
+ cst_type: CstType.BASE,
60
+ definition_formal: ''
61
+ }),
62
+ mockConstituenta({
63
+ id: 2,
64
+ alias: 'D4',
65
+ cst_class: CstClass.DERIVED,
66
+ cst_type: CstType.TERM,
67
+ definition_formal: 'D4'
68
+ })
69
+ ]);
70
+
71
+ const validator = new SubstitutionValidator([schema], []);
72
+
73
+ expect(() => validator.validate()).not.toThrow();
74
+ expect(validator.validate()).toBe(true);
75
+ });
76
+ });
@@ -58,7 +58,7 @@ export class SubstitutionValidator {
58
58
  constructor(schemas: RSForm[], substitutions: Substitution[]) {
59
59
  this.schemas = schemas;
60
60
  this.substitutions = substitutions;
61
- if (schemas.length === 0 || substitutions.length === 0) {
61
+ if (schemas.length === 0) {
62
62
  return;
63
63
  }
64
64
 
@@ -70,6 +70,9 @@ export class SubstitutionValidator {
70
70
  this.schemaByCst.set(item.id, schema);
71
71
  }
72
72
  }
73
+ if (substitutions.length === 0) {
74
+ return;
75
+ }
73
76
  let index = STARTING_SUB_INDEX;
74
77
  for (const item of substitutions) {
75
78
  this.constituents.add(item.original);
@@ -7,7 +7,7 @@ import { normalizeAST } from '../parser/normalize';
7
7
  import { parser as rslangParser } from '../parser/parser';
8
8
 
9
9
  import { TypeAuditor } from './type-auditor';
10
- import { basic, bool, constant, LogicT, tuple, type TypeContext, TypeID } from './typification';
10
+ import { AnyTypificationT, basic, bool, constant, LogicT, tuple, type TypeContext, TypeID } from './typification';
11
11
 
12
12
  // Helper to build AST
13
13
  function buildAST(expression: string) {
@@ -299,6 +299,26 @@ describe('TypeAuditor', () => {
299
299
  });
300
300
  });
301
301
 
302
+ it('Templated function with R0 typification', () => {
303
+ typeContext.set('F3', {
304
+ typeID: TypeID.function,
305
+ result: bool(AnyTypificationT),
306
+ args: [{ alias: 'a', type: bool(AnyTypificationT) }]
307
+ });
308
+ expectType('F3[∅]', 'ℬ(R0)');
309
+ expectType('F3[X1]', 'ℬ(R0)');
310
+ });
311
+
312
+ it('Templated function with bare R0 argument', () => {
313
+ typeContext.set('F4', {
314
+ typeID: TypeID.function,
315
+ result: bool(basic('X1')),
316
+ args: [{ alias: 'a', type: AnyTypificationT }]
317
+ });
318
+ expectType('F4[X1]', 'ℬ(X1)');
319
+ expectType('F4[Z]', 'ℬ(X1)');
320
+ });
321
+
302
322
  it('Templated nesting', () => {
303
323
  typeContext.set('F2', {
304
324
  typeID: TypeID.function,
@@ -943,7 +943,8 @@ export class TypeAuditor {
943
943
  function mangleRadicals(funcName: string, type: Typification): Typification {
944
944
  switch (type.typeID) {
945
945
  default:
946
- throw new Error(`Unexpected type: ${type.typeID}`);
946
+ throw new Error(`Unexpected type for ${funcName}: ${JSON.stringify(type)}`);
947
+ case TypeID.anyTypification:
947
948
  case TypeID.integer:
948
949
  return type;
949
950
  case TypeID.basic: {
@@ -1,8 +1,8 @@
1
1
  import { describe, expect, it } from 'vitest';
2
2
 
3
3
  import type { TypePath } from './typification';
4
- import { AnyTypificationT, basic, bool, IntegerT, tuple } from './typification';
5
- import { applyPath } from './typification-api';
4
+ import { AnyTypificationT, basic, bool, IntegerT, tuple, type Typification } from './typification';
5
+ import { applyPath, compareTemplated } from './typification-api';
6
6
 
7
7
  describe('applyPath', () => {
8
8
  function typePath(path: number[]): TypePath {
@@ -44,3 +44,12 @@ describe('applyPath', () => {
44
44
  expect(applyPath(nested, typePath([2, 1]))).toBeNull();
45
45
  });
46
46
  });
47
+
48
+ describe('compareTemplated', () => {
49
+ it('accepts R0 on either side', () => {
50
+ const substitutes = new Map<string, Typification>();
51
+ expect(compareTemplated(substitutes, AnyTypificationT, basic('X1'))).toBe(true);
52
+ expect(compareTemplated(substitutes, bool(basic('X1')), AnyTypificationT)).toBe(true);
53
+ expect(compareTemplated(substitutes, AnyTypificationT, AnyTypificationT)).toBe(true);
54
+ });
55
+ });
@@ -196,7 +196,7 @@ export function compareTemplated(
196
196
  return true;
197
197
  }
198
198
  }
199
- if (value.typeID === TypeID.anyTypification) {
199
+ if (arg.typeID === TypeID.anyTypification || value.typeID === TypeID.anyTypification) {
200
200
  return true;
201
201
  }
202
202
  if (