-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest-completion.js
More file actions
123 lines (105 loc) · 4.21 KB
/
test-completion.js
File metadata and controls
123 lines (105 loc) · 4.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
// Test script to verify AST-based member completion
const path = require('path');
const fs = require('fs');
// Load the SomonScript compiler
const Lexer = require('../dist/lexer.js').Lexer;
const Parser = require('../dist/parser.js').Parser;
const TypeChecker = require('../dist/type-checker.js').TypeChecker;
// Read the test file
const testFile = path.join(__dirname, 'test-member-completion.som');
const source = fs.readFileSync(testFile, 'utf-8');
console.log('Testing AST-based member completion...\n');
console.log('Source code:');
console.log(source);
console.log('\n---\n');
try {
// Parse the source
const lexer = new Lexer(source);
const tokens = lexer.tokenize();
const parser = new Parser(tokens);
const ast = parser.parse();
console.log('✅ Parsing successful');
// Run type checker
const checker = new TypeChecker(source);
const result = checker.check(ast);
console.log('✅ Type checking complete');
console.log(`Errors: ${result.errors.length}`);
console.log(`Warnings: ${result.warnings.length}`);
// Get the symbol table
const symbolTable = checker.getSymbolTable();
console.log('\n--- Symbol Table ---');
symbolTable.forEach((type, name) => {
console.log(`${name}: ${type.kind}`);
console.log(` Details: hasProperties=${!!type.properties}, propertiesSize=${type.properties?.size || 0}, hasBaseType=${!!type.baseType}`);
if (type.kind === 'class') {
if (type.properties && type.properties.size > 0) {
console.log(` Properties (${type.properties.size}):`);
type.properties.forEach((propType, propName) => {
const kind = propType.type.kind;
const returnType = propType.type.returnType?.kind || propType.type.returnType?.name;
if (kind === 'function') {
console.log(` - ${propName}(): ${returnType || 'беқимат'} (method)`);
} else {
console.log(` - ${propName}: ${propType.type.name || propType.type.kind} (property)`);
}
});
} else {
console.log(` ⚠️ No properties found for class ${name}`);
}
if (type.baseType) {
console.log(` Extends: ${type.baseType.name || type.baseType.kind}`);
}
}
});
// Test member completion for "саг"
console.log('\n--- Testing Member Completion for "саг" ---');
const varType = symbolTable.get('саг');
if (varType) {
console.log(`Variable type: ${varType.kind} (${varType.name || 'unknown'})`);
console.log('Variable type details:', JSON.stringify({
kind: varType.kind,
name: varType.name,
hasProperties: !!varType.properties,
propertiesSize: varType.properties?.size || 0,
hasBaseType: !!varType.baseType
}, null, 2));
if (varType.kind === 'class' && varType.properties) {
console.log('\nMembers available:');
// Collect all members including inherited
const allMembers = new Map();
// From current class
varType.properties.forEach((propType, propName) => {
allMembers.set(propName, { type: propType, source: varType.name });
});
// From parent class
let currentBase = varType.baseType;
while (currentBase) {
if (currentBase.properties) {
currentBase.properties.forEach((propType, propName) => {
if (!allMembers.has(propName)) {
allMembers.set(propName, { type: propType, source: currentBase.name });
}
});
}
currentBase = currentBase.baseType;
}
allMembers.forEach((info, propName) => {
const propType = info.type;
const source = info.source;
if (propType.type.kind === 'function') {
const returnType = propType.type.returnType?.name || propType.type.returnType?.kind || 'беқимат';
console.log(` ✓ ${propName}() → ${returnType} (from ${source})`);
} else {
const typeName = propType.type.name || propType.type.kind;
console.log(` ✓ ${propName}: ${typeName} (from ${source})`);
}
});
}
} else {
console.log('❌ Variable "саг" not found in symbol table');
}
console.log('\n✅ All tests passed!');
} catch (error) {
console.error('❌ Test failed:', error);
console.error(error.stack);
}