///
module TDev
{
export class CodeLocation
{
public scrollPos:number;
public score:number;
public stmt:AST.Stmt;
public isSearchResult = false;
public isCurrAction = false;
public isLibrary = false;
public nameOverride:string;
constructor(public decl:AST.Decl) {
}
public similar(other:CodeLocation) { return this.decl == other.decl && Math.abs(this.scrollPos - other.scrollPos) < 500; }
public nodeType() { return this.decl.nodeType(); }
public getName() { return this.decl.getName(); } // for sorting
public mkBox()
{
if (!this.stmt) return DeclRender.mkBox(this.decl);
var res = DeclRender.mkBoxEx(this.decl, this.isLibrary ? "codeLocationLib" :
this.isCurrAction ? "codeLocationCurr" : "codeLocation");
var descDiv = (res).theDesc;
Browser.setInnerHTML(descDiv, TheEditor.auxRenderer.dispatch(this.stmt));
if (this.nameOverride)
((res).theName).setChildren([ this.nameOverride ])
return res;
}
public toJson():any
{
return {
nodeType: this.decl.nodeType(),
name: this.decl.getName(),
scrollPos: this.scrollPos
}
}
public rebind() { return CodeLocation.fromJson(this.toJson()); }
static fromJson(j:any)
{
if (!j) return null;
var nt = j.nodeType;
var name = j.name;
var decl:AST.Decl;
if (nt == "app") decl = Script;
else decl = Script.things.filter((t:AST.Decl) => t.nodeType() == nt && t.getName() == name)[0];
if (!decl) return null;
var r = new CodeLocation(decl);
r.scrollPos = j.scrollPos;
return r;
}
static fromNodeId(id:string, lib:string = null)
{
if (!id) return null;
var app = Script
if (lib == "this") lib = null;
if (lib) {
var l0 = Script.libraries().filter(l => l.getStableName() == lib)[0]
if (l0 && l0.resolved)
app = l0.resolved
else
return null
}
var res = app.findAstNodeById(id, true);
if (!res) return null;
var node = res.stmt
if (node instanceof AST.Decl) {
loc = new CodeLocation(node);
loc.isSearchResult = true;
loc.isLibrary = !!lib
return loc;
}
if (node instanceof AST.Stmt) {
var loc = new CodeLocation(res.decl);
loc.stmt = node
loc.isSearchResult = true;
loc.isLibrary = !!lib
return loc;
}
return null;
}
}
}