【问题标题】:Use static analysis to find all assignments to a given field使用静态分析查找给定字段的所有分配
【发布时间】:2016-11-16 19:53:44
【问题描述】:

我正在考虑在 Typescript 中进行数据绑定而不使用脏检查或生成 getter 和 setter 的方法。我试图确定是否有可能(假设充分使用类型注释)使用静态分析找到某个类的某个字段分配给的所有位置。目的是生成对处理幕后数据绑定的函数的调用,这将在检查时从实例中消除混乱,并且在运行时更好,因为 getter/setter(我记得)对于 VM 来说比属性分配更难优化.

例如

export class Vector3 {

    public x : number;
    public y : number;
    public z : number;
}

var v0 = new Vector3();
v0.x = 1;
//generate call to Databindings.set(v0, 'x', v0.x);

function addX(a : Vector3, val : number) : void {
    a.x += val;
    //generate call to Databindings.set(a, 'x', a.x);
}

addX(a, 10); 

我几乎可以肯定,我可以弄清楚如何找到 Vector3 的 x 属性实例的所有赋值,但不确定它如何在函数调用中工作,例如 addX,其中实例变量是别名的。

有哪些方法可以解决这个问题?假设我的程序已经有了 AST。

【问题讨论】:

    标签: typescript compilation cross-compiling abstract-syntax-tree preprocessor


    【解决方案1】:

    您可以将属性装饰器与rtti 一起使用,也可以使用面向方面的编程sample

    function bind(target: Object, propertyKey: string) {
        Object.defineProperty(target, propertyKey, {
            get: function () {
                return value;
            },
            set: function (val) {
                value = val;
                console.log("call Databindings.set(this, " + propertyKey + ", " + val + ")");
            },
            enumerable: true,
            configurable: true
        });
    }
    
    class Vector3 {
        @bind
        public x : number;
        @bind
        public y : number;
        @bind
        public z : number;
    }
    
    var v0 = new Vector3();
    v0.x = 1;
    //generate call to Databindings.set(v0, 'x', v0.x);
    
    function addX(a : Vector3, val : number) : void {
        a.x += val;
        //generate call to Databindings.set(a, 'x', a.x);
    }
    
    addX(v0, 10); 
    

    【讨论】:

    • 感谢您,但我试图避免生成 getter / setter。如果可能的话,我真的很想在构建时解决这个问题
    • 您无法在构建时获取设置值。你有什么样的AST?您可以使用 typescript AST API 编写后处理器。一般来说,你不会有对象类。 let arr: IXProp[] = [{x: 0}, new Vector3()]; for (let key of arr) key.x = 5;
    猜你喜欢
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多