7 //extern Class thisClass;
8 static Class currentClass;
10 static bool InsideIncl(Location loc, int line, int charPos)
12 //return !loc.start.included && (loc.start.line < line || (loc.start.line == line && loc.start.charPos <= charPos)) &&
13 // (loc.end.line > line || (loc.end.line == line && loc.end.charPos >= charPos));
14 return !loc.start.included && loc.start.line <= line && loc.end.line >= line;
17 static bool Inside(Location loc, int line, int charPos)
19 //return !loc.start.included && (loc.start.line < line || (loc.start.line == line && loc.start.charPos < charPos)) &&
20 // (loc.end.line > line || (loc.end.line == line && loc.end.charPos > charPos));
21 return !loc.start.included && loc.start.line < line && loc.end.line > line;
24 static bool InsideEndIncl(Location loc, int line, int charPos)
26 //return !loc.start.included && (loc.start.line < line || (loc.start.line == line && loc.start.charPos < charPos)) &&
27 // (loc.end.line > line || (loc.end.line == line && loc.end.charPos >= charPos));
28 return !loc.start.included && loc.start.line < line && loc.end.line >= line;
31 static Identifier DebugFindCtxSpecifier(Specifier spec, int line, int charPos)
43 for(def = spec.definitions->first; def; def = def.next)
45 // TODO: Should use DebugFindCtxClassDef here right?
47 //if(def.type == ClassDefDeclaration && def.decl && def.decl.type == DeclarationStruct)
48 // ProcessDeclaration(def.decl);
51 case declarationClassDef:
52 if(InsideIncl(&def.decl.loc, line, charPos))
54 idResult = DebugFindCtxDeclaration(def.decl, line, charPos);
59 case defaultPropertiesClassDef:
62 for(init = def.defProperties->first; init; init = init.next)
64 if(InsideIncl(&init.realLoc, line, charPos))
66 Class oldThisClass = GetThisClass();
67 Context oldTopContext = GetTopContext();
68 SetThisClass(currentClass);
69 idResult = DebugFindCtxMemberInit(init, line, charPos);
72 SetThisClass(oldThisClass);
73 SetTopContext(oldTopContext);
78 case functionClassDef:
79 if(InsideIncl(&def.function.loc, line, charPos))
81 idResult = DebugFindCtxClassFunction(def.function, line, charPos);
87 case propertyClassDef:
90 if(InsideIncl(&def.propertyDef.loc, line, charPos))
92 idResult = DebugFindCtxProperty(def.propertyDef, line, charPos);
98 case propertyWatchClassDef:
99 if(def.propertyWatch && def.propertyWatch.compound && InsideIncl(&def.propertyWatch.compound.loc, line, charPos))
101 Class oldThisClass = GetThisClass();
102 Context oldTopContext = GetTopContext();
103 SetThisClass(currentClass);
104 idResult = DebugFindCtxStatement(def.propertyWatch.compound, line, charPos);
105 if(idResult) return idResult;
106 SetThisClass(oldThisClass);
107 SetTopContext(oldTopContext);
120 Identifier DebugFindCtxIdentifier(Identifier id, int line, int charPos)
122 //if(id.loc.end.line == line && id.loc.end.charPos == charPos)
123 //if(InsideIncl(&id.loc.end.line == line && id.loc.end.charPos == charPos)
125 if(id.badID && InsideIncl(&id.badID.loc, line, charPos))
126 return DebugFindCtxIdentifier(id.badID, line, charPos);
132 Identifier DebugFindCtxExpression(Expression exp, int line, int charPos)
134 Identifier idResult = null;
139 if(InsideIncl(&exp._new.size.loc, line, charPos))
141 idResult = DebugFindCtxExpression(exp._new.size, line, charPos);
142 if(idResult) return idResult;
146 if(InsideIncl(&exp._renew.exp.loc, line, charPos))
148 idResult = DebugFindCtxExpression(exp._renew.exp, line, charPos);
149 if(idResult) return idResult;
151 if(InsideIncl(&exp._renew.size.loc, line, charPos))
153 idResult = DebugFindCtxExpression(exp._renew.size, line, charPos);
154 if(idResult) return idResult;
160 idResult = DebugFindCtxIdentifier(exp.identifier, line, charPos);
161 if(idResult) return idResult;
165 if(InsideIncl(&exp.instance.loc, line, charPos))
167 idResult = DebugFindCtxInstance(exp.instance, line, charPos);
168 if(idResult) return idResult;
177 if(InsideIncl(&exp.op.exp1.loc, line, charPos))
179 idResult = DebugFindCtxExpression(exp.op.exp1, line, charPos);
180 if(idResult) return idResult;
185 // Why was this done?
186 //if(InsideIncl(&exp.op.exp2.loc, line, charPos))
187 if(InsideEndIncl(&exp.op.exp2.loc, line, charPos))
189 idResult = DebugFindCtxExpression(exp.op.exp2, line, charPos);
190 if(idResult) return idResult;
198 Expression expression;
200 for(expression = exp.list->first; expression; expression = expression.next)
202 if(InsideIncl(&expression.loc, line, charPos))
204 idResult = DebugFindCtxExpression(expression, line, charPos);
205 if(idResult) return idResult;
212 Expression expression;
213 if(InsideIncl(&exp.index.exp.loc, line, charPos))
215 idResult = DebugFindCtxExpression(exp.index.exp, line, charPos);
216 if(idResult) return idResult;
219 for(expression = exp.index.index->first; expression; expression = expression.next)
221 if(InsideIncl(&expression.loc, line, charPos))
223 idResult = DebugFindCtxExpression(expression, line, charPos);
224 if(idResult) return idResult;
232 if(InsideIncl(&exp.call.exp.loc, line, charPos))
234 idResult = DebugFindCtxExpression(exp.call.exp, line, charPos);
235 if(idResult) return idResult;
238 if(exp.call.argLoc.start.line > line || (line == exp.call.argLoc.start.line && exp.call.argLoc.start.charPos >= charPos))
243 if(exp.call.arguments)
245 Expression expression;
247 for(expression = exp.call.arguments->first; expression; expression = expression.next)
249 if(InsideIncl(&expression.loc, line, charPos) || (expression.loc.end.line > line || (line == expression.loc.end.line && expression.loc.end.charPos > charPos)))
251 if(InsideIncl(&expression.loc, line, charPos))
252 idResult = DebugFindCtxExpression(expression, line, charPos);
267 if(InsideIncl(&exp.member.exp.loc, line, charPos))
269 idResult = DebugFindCtxExpression(exp.member.exp, line, charPos);
270 if(idResult) return idResult;
273 return exp.member.member; //(void *)-1;
277 if(InsideIncl(&exp.member.exp.loc, line, charPos))
279 idResult = DebugFindCtxExpression(exp.member.exp, line, charPos);
280 if(idResult) return idResult;
286 if(InsideIncl(&exp.cast.exp.loc, line, charPos))
288 idResult = DebugFindCtxExpression(exp.cast.exp, line, charPos);
289 if(idResult) return idResult;
293 if(InsideIncl(&exp.cond.cond.loc, line, charPos))
295 idResult = DebugFindCtxExpression(exp.cond.cond, line, charPos);
296 if(idResult) return idResult;
300 Expression expression;
301 for(expression = exp.cond.exp->first; expression; expression = expression.next)
303 if(InsideIncl(&expression.loc, line, charPos))
305 idResult = DebugFindCtxExpression(expression, line, charPos);
306 if(idResult) return idResult;
310 if(InsideIncl(&exp.cond.elseExp.loc, line, charPos))
312 idResult = DebugFindCtxExpression(exp.cond.elseExp, line, charPos);
313 if(idResult) return idResult;
322 static Identifier DebugFindCtxStatement(Statement stmt, int line, int charPos)
329 if(InsideIncl(&stmt.labeled.stmt.loc, line, charPos))
330 return DebugFindCtxStatement(stmt.labeled.stmt, line, charPos);
333 if(stmt.caseStmt.exp)
335 if(InsideIncl(&stmt.caseStmt.exp.loc, line, charPos))
336 return DebugFindCtxExpression(stmt.caseStmt.exp, line, charPos);
339 if(stmt.caseStmt.stmt)
341 if(InsideIncl(&stmt.caseStmt.stmt.loc, line, charPos))
342 return DebugFindCtxStatement(stmt.caseStmt.stmt, line, charPos);
345 case badDeclarationStmt:
347 Declaration decl = stmt.decl;
348 if(InsideIncl(&decl.loc, line, charPos))
350 idResult = DebugFindCtxDeclaration(decl, line, charPos);
351 if(idResult) return idResult;
357 if(!stmt.compound.isSwitch)
358 SetCurrentContext(stmt.compound.context);
359 if(stmt.compound.declarations)
362 for(decl = stmt.compound.declarations->first; decl; decl = decl.next)
364 if(InsideIncl(&decl.loc, line, charPos))
366 idResult = DebugFindCtxDeclaration(decl, line, charPos);
367 if(idResult) return idResult;
371 if(stmt.compound.statements)
374 for(statement = stmt.compound.statements->first; statement; statement = statement.next)
376 if(InsideIncl(&statement.loc, line, charPos))
378 idResult = DebugFindCtxStatement(statement, line, charPos);
379 if(idResult) return idResult;
391 for(exp = stmt.expressions->first; exp; exp = exp.next)
393 if(InsideIncl(&exp.loc, line, charPos))
395 idResult = DebugFindCtxExpression(exp, line, charPos);
396 if(idResult) return idResult;
405 for(exp = stmt.ifStmt.exp->first; exp; exp = exp.next)
407 if(InsideIncl(&exp.loc, line, charPos))
409 idResult = DebugFindCtxExpression(exp, line, charPos);
410 if(idResult) return idResult;
415 if(InsideIncl(&stmt.ifStmt.stmt.loc, line, charPos))
417 idResult = DebugFindCtxStatement(stmt.ifStmt.stmt, line, charPos);
418 if(idResult) return idResult;
421 if(stmt.ifStmt.elseStmt)
423 if(InsideIncl(&stmt.ifStmt.elseStmt.loc, line, charPos))
424 return DebugFindCtxStatement(stmt.ifStmt.elseStmt, line, charPos);
431 for(exp = stmt.switchStmt.exp->first; exp; exp = exp.next)
433 if(InsideIncl(&exp.loc, line, charPos))
435 idResult = DebugFindCtxExpression(exp, line, charPos);
436 if(idResult) return idResult;
439 if(InsideIncl(&stmt.switchStmt.stmt.loc, line, charPos))
440 return DebugFindCtxStatement(stmt.switchStmt.stmt, line, charPos);
446 if(stmt.whileStmt.exp)
448 for(exp = stmt.whileStmt.exp->first; exp; exp = exp.next)
450 if(InsideIncl(&exp.loc, line, charPos))
452 idResult = DebugFindCtxExpression(exp, line, charPos);
453 if(idResult) return idResult;
457 if(stmt.whileStmt.stmt && InsideIncl(&stmt.whileStmt.stmt.loc, line, charPos))
458 return DebugFindCtxStatement(stmt.whileStmt.stmt, line, charPos);
463 if(InsideIncl(&stmt.doWhile.stmt.loc, line, charPos))
465 idResult = DebugFindCtxStatement(stmt.doWhile.stmt, line, charPos);
466 if(idResult) return idResult;
472 for(exp = stmt.doWhile.exp->first; exp; exp = exp.next)
474 if(InsideIncl(&exp.loc, line, charPos))
476 idResult = DebugFindCtxExpression(exp, line, charPos);
477 if(idResult) return idResult;
487 if(stmt.forStmt.init && InsideIncl(&stmt.forStmt.init.loc, line, charPos))
489 idResult = DebugFindCtxStatement(stmt.forStmt.init, line, charPos);
490 if(idResult) return idResult;
493 if(stmt.forStmt.check && InsideIncl(&stmt.forStmt.check.loc, line, charPos))
495 idResult = DebugFindCtxStatement(stmt.forStmt.check, line, charPos);
496 if(idResult) return idResult;
499 if(stmt.forStmt.increment)
501 for(exp = stmt.forStmt.increment->first; exp; exp = exp.next)
503 if(InsideIncl(&exp.loc, line, charPos))
505 idResult = DebugFindCtxExpression(exp, line, charPos);
506 if(idResult) return idResult;
511 if(stmt.forStmt.stmt)
512 return DebugFindCtxStatement(stmt.forStmt.stmt, line, charPos);
526 for(exp = stmt.expressions->first; exp; exp = exp.next)
528 if(InsideIncl(&exp.loc, line, charPos))
530 idResult = DebugFindCtxExpression(exp, line, charPos);
531 if(idResult) return idResult;
536 case fireWatchersStmt:
537 case stopWatchingStmt:
540 if(stmt._watch.watcher && InsideIncl(&stmt._watch.watcher.loc, line, charPos))
542 idResult = DebugFindCtxExpression(stmt._watch.watcher, line, charPos);
543 if(idResult) return idResult;
545 if(stmt._watch.object && InsideIncl(&stmt._watch.object.loc, line, charPos))
547 idResult = DebugFindCtxExpression(stmt._watch.object, line, charPos);
548 if(idResult) return idResult;
550 if(stmt._watch.watches)
552 for(_watch = stmt._watch.watches->first; _watch; _watch = _watch.next)
554 if(InsideIncl(&_watch.loc, line, charPos))
556 idResult = DebugFindCtxIdentifier(_watch, line, charPos);
557 if(idResult) return idResult;
565 PropertyWatch _watch;
566 if(stmt._watch.watcher && InsideIncl(&stmt._watch.watcher.loc, line, charPos))
568 idResult = DebugFindCtxExpression(stmt._watch.watcher, line, charPos);
569 if(idResult) return idResult;
571 if(stmt._watch.object && InsideIncl(&stmt._watch.object.loc, line, charPos))
573 idResult = DebugFindCtxExpression(stmt._watch.object, line, charPos);
574 if(idResult) return idResult;
576 if(stmt._watch.watches)
578 for(_watch = stmt._watch.watches->first; _watch; _watch = _watch.next)
580 if(_watch.compound && InsideIncl(&_watch.compound.loc, line, charPos))
582 idResult = DebugFindCtxStatement(_watch.compound, line, charPos);
583 if(idResult) return idResult;
593 static Identifier DebugFindCtxInitializer(Initializer initializer, int line, int charPos)
595 switch(initializer.type)
597 case listInitializer:
602 for(init = initializer.list->first; init; init = init.next)
604 if(InsideIncl(&init.loc, line, charPos))
606 idResult = DebugFindCtxInitializer(init, line, charPos);
607 if(idResult) return idResult;
613 if(InsideIncl(&initializer.exp.loc, line, charPos))
614 return DebugFindCtxExpression(initializer.exp, line, charPos);
624 static Identifier DebugFindCtxInitDeclarator(InitDeclarator decl, int line, int charPos)
626 if(decl.initializer && InsideIncl(&decl.initializer.loc, line, charPos))
627 return DebugFindCtxInitializer(decl.initializer, line, charPos);
631 static Identifier DebugFindCtxDeclaration(Declaration decl, int line, int charPos)
637 case structDeclaration:
642 for(spec = decl.specifiers->first; spec; spec = spec.next)
644 if(InsideIncl(&spec.loc, line, charPos))
646 idResult = DebugFindCtxSpecifier(spec, line, charPos);
647 if(idResult) return idResult;
652 if(decl.declarators && decl.declarators.first)
654 for(d = decl.declarators.first; d; d = d.next)
656 if(InsideIncl(&d.loc, line, charPos))
658 if(d.type == DeclaratorStruct && d.declarator && d.declarator.type == DeclaratorIdentifier)
659 return d.declarator.identifier;
666 case initDeclaration:
668 // Need to loop through specifiers to look for :: completion
673 for(s = decl.specifiers->first; s; s = s.next)
675 if(InsideIncl(&s.loc, line, charPos))
677 idResult = DebugFindCtxSpecifier(s, line, charPos);
678 if(idResult) return idResult;
683 if(decl.declarators && decl.declarators->first)
686 for(d = decl.declarators->first; d; d = d.next)
688 if(InsideIncl(&d.loc, line, charPos))
690 idResult = DebugFindCtxInitDeclarator(d, line, charPos);
691 if(idResult) return idResult;
697 case instDeclaration:
698 if(InsideIncl(&decl.inst.loc, line, charPos))
699 return DebugFindCtxInstance(decl.inst, line, charPos);
705 static Identifier DebugFindCtxFunction(FunctionDefinition func, int line, int charPos)
707 if(func.body && InsideIncl(&func.body.loc, line, charPos))
711 Class oldThisClass = GetThisClass();
712 Context oldTopContext = GetTopContext();
714 idResult = DebugFindCtxStatement(func.body, line, charPos);
718 SetThisClass(oldThisClass);
719 SetTopContext(oldTopContext);
724 static Identifier DebugFindCtxMemberInit(MemberInit init, int line, int charPos)
727 if(init.initializer && InsideIncl(&init.initializer.loc, line, charPos))
729 idResult = DebugFindCtxInitializer(init.initializer, line, charPos);
735 if(init.identifiers && init.identifiers->first && InsideIncl(&((Identifier)init.identifiers->first).loc, line, charPos))
737 idResult = DebugFindCtxIdentifier(init.identifiers->first, line, charPos);
739 return (void *)-2; //idResult;
741 if(init.initializer && InsideIncl(&init.initializer.loc, line, charPos))
743 if(init.initializer.type == expInitializer)
751 static Identifier DebugFindCtxInstance(Instantiation inst, int line, int charPos)
753 Identifier idResult = null;
754 Class oldThisClass = GetThisClass();
755 Symbol sym = inst._class ? FindClass(inst._class.name) : null;
756 //bool insideSomething = false;
760 SetThisClass(sym.registered);
762 insideBrackets = !(inst.insideLoc.start.line > line || (line == inst.insideLoc.start.line && inst.insideLoc.start.charPos > charPos));
767 MemberInit memberInit;
768 for(init = inst.members->first; init; init = init.next)
770 if(init.loc.start.line > line || (line == init.loc.start.line && init.loc.start.charPos > charPos))
773 if(init.type == dataMembersInit && init.dataMembers && insideBrackets && sym)
775 for(memberInit = init.dataMembers->first; memberInit; memberInit = memberInit.next)
777 if(!idResult && InsideIncl(&memberInit.realLoc, line, charPos))
778 idResult = DebugFindCtxMemberInit(memberInit, line, charPos);
780 if(InsideIncl(&memberInit.realLoc, line, charPos) || (memberInit.realLoc.end.line > line || (line == memberInit.realLoc.end.line && memberInit.realLoc.end.charPos > charPos)))
782 if(memberInit.identifiers && memberInit.identifiers->first && InsideIncl(&memberInit.loc, line, charPos))
783 insideBrackets = false;
786 /*else if((!memberInit.identifiers || !memberInit.identifiers->first) && (memberInit.next || !InsideIncl(&init.loc, line, charPos)))
792 if(InsideIncl(&init.loc, line, charPos))
794 /*if(InsideIncl(&init.loc, line, charPos))
795 if(init.type == methodMembersInit)
796 insideSomething = true;*/
798 if(init.type == methodMembersInit && InsideIncl(&init.function.loc, line, charPos))
800 idResult = DebugFindCtxClassFunction(init.function, line, charPos);
803 if(InsideIncl(&init.loc, line, charPos))
807 if((init.loc.end.line > line || (line == init.loc.end.line && init.loc.end.charPos > charPos)))
813 SetThisClass(oldThisClass);
815 return (void *)-1; // ?
818 static Identifier DebugFindCtxClassFunction(ClassFunction func, int line, int charPos)
820 if(func.body && InsideIncl(&func.body.loc, line, charPos))
824 Symbol symbol = func.declarator ? func.declarator.symbol : null;
825 Type type = symbol ? symbol.type : null;
826 Class oldThisClass = GetThisClass();
827 Context oldTopContext = GetTopContext();
828 SetThisClass((type && type.thisClass) ? type.thisClass.registered : currentClass);
832 idResult = DebugFindCtxStatement(func.body, line, charPos);
837 SetThisClass(oldThisClass);
838 SetTopContext(oldTopContext);
840 else if(!func.body && GetFuncDecl(func.declarator))
843 SetThisClass(currentClass);
846 else if(!func.body && GetDeclId(func.declarator))
849 SetThisClass(currentClass);
855 static Identifier DebugFindCtxProperty(PropertyDef def, int line, int charPos)
858 if(def.getStmt && InsideIncl(&def.getStmt.loc, line, charPos))
860 Class oldThisClass = GetThisClass();
861 Context oldTopContext = GetTopContext();
862 SetThisClass(currentClass);
863 result = DebugFindCtxStatement(def.getStmt, line, charPos);
864 if(result) return result;
865 SetThisClass(oldThisClass);
866 SetTopContext(oldTopContext);
868 if(def.setStmt && InsideIncl(&def.setStmt.loc, line, charPos))
870 Class oldThisClass = GetThisClass();
871 Context oldTopContext = GetTopContext();
872 SetThisClass(currentClass);
873 result = DebugFindCtxStatement(def.setStmt, line, charPos);
874 if(result) return result;
875 SetThisClass(oldThisClass);
876 SetTopContext(oldTopContext);
881 static Identifier DebugFindCtxClassDef(ClassDef def, int line, int charPos)
886 case declarationClassDef:
887 if(InsideIncl(&def.decl.loc, line, charPos))
889 idResult = DebugFindCtxDeclaration(def.decl, line, charPos);
894 case defaultPropertiesClassDef:
897 for(init = def.defProperties->first; init; init = init.next)
899 if(InsideIncl(&init.realLoc, line, charPos))
901 Class oldThisClass = GetThisClass();
902 Context oldTopContext = GetTopContext();
903 SetThisClass(currentClass);
904 idResult = DebugFindCtxMemberInit(init, line, charPos);
907 SetThisClass(oldThisClass);
908 SetTopContext(oldTopContext);
913 case functionClassDef:
914 if(InsideIncl(&def.function.loc, line, charPos))
916 idResult = DebugFindCtxClassFunction(def.function, line, charPos);
922 case propertyClassDef:
925 // TOCHECK: Missing thisClass here too?
927 if(InsideIncl(&def.propertyDef.loc, line, charPos))
929 idResult = DebugFindCtxProperty(def.propertyDef, line, charPos);
935 case propertyWatchClassDef:
936 if(def.propertyWatch && def.propertyWatch.compound && InsideIncl(&def.propertyWatch.compound.loc, line, charPos))
938 Class oldThisClass = GetThisClass();
939 Context oldTopContext = GetTopContext();
940 SetThisClass(currentClass);
942 idResult = DebugFindCtxStatement(def.propertyWatch.compound, line, charPos);
945 SetThisClass(oldThisClass);
946 SetTopContext(oldTopContext);
953 static Identifier DebugFindCtxClass(ClassDefinition _class, int line, int charPos)
956 bool insideSomething = false;
957 if(_class.definitions)
960 for(def = _class.definitions->first; def; def = def.next)
962 if(def.type == defaultPropertiesClassDef ? InsideIncl(&def.loc, line, charPos) : InsideIncl(&def.loc, line, charPos) )
964 if(def.type != defaultPropertiesClassDef)
965 insideSomething = true;
967 idResult = DebugFindCtxClassDef(def, line, charPos);
980 Identifier DebugFindCtxTree(OldList ast, int line, int charPos)
986 SetTopContext(GetGlobalContext());
989 for(external = ast.first; external; external = external.next)
991 switch(external.type)
993 case functionExternal:
994 if(InsideIncl(&external.loc, line, charPos))
996 idResult = DebugFindCtxFunction(external.function, line, charPos);
998 return (idResult == (void *)-1 || idResult == (void *)-2) ? null : idResult;
1001 case declarationExternal:
1002 if(InsideIncl(&external.loc, line, charPos))
1004 idResult = DebugFindCtxDeclaration(external.declaration, line, charPos);
1006 return (idResult == (void *)-1 || idResult == (void *)-2) ? null : idResult;
1010 if(InsideIncl(&external._class.loc, line, charPos))
1012 currentClass = external._class.symbol.registered;
1013 idResult = DebugFindCtxClass(external._class, line, charPos);
1014 currentClass = null;
1016 return (idResult == (void *)-1 || idResult == (void *)-2) ? null : idResult;