in progress...

This commit is contained in:
Onoshko Dan 2014-07-03 01:08:24 +07:00
parent 14eb63b057
commit e5d3cb56c0

View File

@ -39,90 +39,78 @@
/* /*
MD: MD:
Defs:
- var definition
- function definition
- function argument definition
* AST_VarDef
* AST_Defun
* AST_Function
* AST_SymbolFunarg
Levels of follow: Levels of follow:
1 level: Simple types: String, Number, Boolean, Function. 1 level: Simple types: String, Number, Boolean, Function.
2 level: Arrays and Object ( Array<val_type>, Array<key_type, val_type> ). 2 level: Arrays and Object ( Array<val_type>, Array<key_type, val_type> ).
Deep : interfaces, classes (prototypes), singletones. Deep : interfaces, classes (prototypes), singletones.
Operations to check:
* AST_Return
* AST_Call
* AST_UnaryPrefix
* AST_UnaryPostfix
* AST_Binary
* AST_Conditional
* AST_Assign
Warnings:
* type mismatch
* redefinition of variable
*/ */
// TypedObject // RefsStorage
Cola.TypedObject = function (name, vartype, isfunc) { Cola.RefsStorage = function (parentStorage) {
this.name = name;
this.vartype = vartype;
this.isfunc = isfunc;
};
// TypeStorage
Cola.TypeStorage = function (parentStorage) {
this.parentStorage = parentStorage; this.parentStorage = parentStorage;
this.singletype = false;
this.objs = []; this.objs = [];
}; };
Cola.TypeStorage.prototype.contains = function (name, isfunc) { Cola.RefsStorage.Element = function (name, vartype, callable) {
this.name = name;
this.vartype = vartype;
this.callable = callable;
this.props = new Cola.RefsStorage();
};
Cola.RefsStorage.prototype.setSingleType = function (type) {
if(this.parentStorage) return false;
this.singletype = true;
this.objs = [type];
};
Cola.RefsStorage.prototype.contains = function (name, callable) {
return this.objs.some(function(el){ return this.objs.some(function(el){
return el.name == name && el.isfunc == isfunc; return el.name == name && el.callable == callable;
}); });
}; };
Cola.TypeStorage.prototype.remove = function (name, isfunc) { Cola.RefsStorage.prototype.remove = function (name, callable) {
var pre = this.objs.length; var pre = this.objs.length;
this.objs = this.objs.filter(function(el){ this.objs = this.objs.filter(function(el){
return !(el.name == name && el.isfunc == isfunc); return !(el.name == name && el.callable == callable);
}); });
return pre != this.objs.length; return pre != this.objs.length;
}; };
Cola.TypeStorage.prototype.uniqueAdd = function (name, vartype, isfunc) { Cola.RefsStorage.prototype.uniqueAdd = function (name, vartype, callable) {
if(!this.contains(name, isfunc)){ if(!this.contains(name, callable)){
this.objs.push(new Cola.TypedObject(name, vartype, isfunc)); this.objs.push(new Cola.RefsStorage.Element(name, vartype, callable));
return true; return true;
} }
return false; return false;
}; };
Cola.TypeStorage.prototype.owerwriteAdd = function (name, vartype, isfunc) { Cola.RefsStorage.prototype.owerwriteAdd = function (name, vartype, callable) {
var removed = this.remove(name, isfunc); var removed = this.remove(name, callable);
this.objs.push(new Cola.TypedObject(name, vartype, isfunc)); this.objs.push(new Cola.RefsStorage.Element(name, vartype, callable));
return removed; return removed;
}; };
Cola.TypeStorage.prototype.get = function (name) { Cola.RefsStorage.prototype.get = function (name) {
if(this.singletype) return this.objs[0];
var obj = false; var obj = false;
this.objs.some(function(el){ this.objs.some(function(el){
return el.name == name && (obj = el); return el.name == name && (obj = el);
}); });
if(!obj && this.parentStorage) obj = this.parentStorage.get(name); if(!obj && this.parentStorage) obj = this.parentStorage.get(name);
return obj;
}; };
@ -130,9 +118,21 @@ Cola.TypeStorage.prototype.get = function (name) {
Cola.TypeChecker = function (parentStorage, om) { Cola.TypeChecker = function (parentStorage, om) {
this.outputMode = om == undefined ? Cola.TypeChecker.WARNING : om; this.outputMode = om == undefined ? Cola.TypeChecker.WARNING : om;
this.storage = new Cola.TypeStorage(parentStorage, this.outputMode); this.storage = new Cola.RefsStorage(parentStorage, this.outputMode);
}; };
/*
Defs:
first step ( simple )
- vars definition * AST_VarDef - done
- function definition * AST_Defun - done
- function argument definition * AST_SymbolFunarg - done
second step
- object's property assignment * AST_Assign
- prototypes ( classes methods ) * AST_Assign - after classes
- vars definition in constructor ( vars of class ) * AST_Assign - after classes
*/
Cola.TypeChecker.prototype.reg = function (def) { Cola.TypeChecker.prototype.reg = function (def) {
if(def.forEach) def.forEach(function(d){ if(def.forEach) def.forEach(function(d){
if(d instanceof Cola.AST_VarDef && !this.storage.uniqueAdd(d.name.name, d.type, false)){ if(d instanceof Cola.AST_VarDef && !this.storage.uniqueAdd(d.name.name, d.type, false)){
@ -150,6 +150,55 @@ Cola.TypeChecker.prototype.reg = function (def) {
} }
}; };
/*
Nodes to check:
* AST_Binary
* AST_UnaryPrefix
* AST_UnaryPostfix
* AST_Return
* AST_Conditional
* AST_VarDef
* AST_ForIn - `in` left argument
* AST_Switch
*/
Cola.TypeChecker.prototype.check = function () {
};
/*
Nodes to getting type:
* AST_Binary
* AST_UnaryPrefix
* AST_UnaryPostfix
* AST_Return
* AST_Conditional
* AST_Call
* AST_Seq
* AST_Dot
* AST_Sub
* AST_Symbol
* AST_Atom
* AST_Constant
* AST_Array
* AST_Object
*/
Cola.TypeChecker.prototype.get = function () {
};
/*
Warnings:
- type mismatch
- redefinition of variable
- redefinition of function
*/
Cola.TypeChecker.prototype.printMessage = function (token, msg) { Cola.TypeChecker.prototype.printMessage = function (token, msg) {
switch(this.outputMode){ switch(this.outputMode){
case Cola.TypeChecker.WARNING: case Cola.TypeChecker.WARNING: