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);
77 case functionClassDef:
78 if(InsideIncl(&def.function.loc, line, charPos))
80 idResult = DebugFindCtxClassFunction(def.function, line, charPos);
86 case propertyClassDef:
89 if(InsideIncl(&def.propertyDef.loc, line, charPos))
91 idResult = DebugFindCtxProperty(def.propertyDef, line, charPos);
97 case propertyWatchClassDef:
98 if(def.propertyWatch && def.propertyWatch.compound && InsideIncl(&def.propertyWatch.compound.loc, line, charPos))
100 Class oldThisClass = GetThisClass();
101 Context oldTopContext = GetTopContext();
102 SetThisClass(currentClass);
103 idResult = DebugFindCtxStatement(def.propertyWatch.compound, line, charPos);
104 if(idResult) return idResult;
105 SetThisClass(oldThisClass);
118 Identifier DebugFindCtxIdentifier(Identifier id, int line, int charPos)
120 //if(id.loc.end.line == line && id.loc.end.charPos == charPos)
121 //if(InsideIncl(&id.loc.end.line == line && id.loc.end.charPos == charPos)
123 if(id.badID && InsideIncl(&id.badID.loc, line, charPos))
124 return DebugFindCtxIdentifier(id.badID, line, charPos);
130 Identifier DebugFindCtxExpression(Expression exp, int line, int charPos)
132 Identifier idResult = null;
137 if(InsideIncl(&exp._new.size.loc, line, charPos))
139 idResult = DebugFindCtxExpression(exp._new.size, line, charPos);
140 if(idResult) return idResult;
144 if(InsideIncl(&exp._renew.exp.loc, line, charPos))
146 idResult = DebugFindCtxExpression(exp._renew.exp, line, charPos);
147 if(idResult) return idResult;
149 if(InsideIncl(&exp._renew.size.loc, line, charPos))
151 idResult = DebugFindCtxExpression(exp._renew.size, line, charPos);
152 if(idResult) return idResult;
158 idResult = DebugFindCtxIdentifier(exp.identifier, line, charPos);
159 if(idResult) return idResult;
163 if(InsideIncl(&exp.instance.loc, line, charPos))
165 idResult = DebugFindCtxInstance(exp.instance, line, charPos);
166 if(idResult) return idResult;
175 if(InsideIncl(&exp.op.exp1.loc, line, charPos))
177 idResult = DebugFindCtxExpression(exp.op.exp1, line, charPos);
178 if(idResult) return idResult;
183 // Why was this done?
184 //if(InsideIncl(&exp.op.exp2.loc, line, charPos))
185 if(InsideEndIncl(&exp.op.exp2.loc, line, charPos))
187 idResult = DebugFindCtxExpression(exp.op.exp2, line, charPos);
188 if(idResult) return idResult;
196 Expression expression;
198 for(expression = exp.list->first; expression; expression = expression.next)
200 if(InsideIncl(&expression.loc, line, charPos))
202 idResult = DebugFindCtxExpression(expression, line, charPos);
203 if(idResult) return idResult;
210 Expression expression;
211 if(InsideIncl(&exp.index.exp.loc, line, charPos))
213 idResult = DebugFindCtxExpression(exp.index.exp, line, charPos);
214 if(idResult) return idResult;
217 for(expression = exp.index.index->first; expression; expression = expression.next)
219 if(InsideIncl(&expression.loc, line, charPos))
221 idResult = DebugFindCtxExpression(expression, line, charPos);
222 if(idResult) return idResult;
230 Type type = exp.call.exp.expType;
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 Identifier id = GetDeclId(func.declarator);
712 Symbol symbol = func.declarator.symbol;
713 Type type = symbol.type;
714 Class oldThisClass = GetThisClass();
715 Context oldTopContext = GetTopContext();
717 idResult = DebugFindCtxStatement(func.body, line, charPos);
721 SetThisClass(oldThisClass);
722 SetTopContext(oldTopContext);
727 static Identifier DebugFindCtxMemberInit(MemberInit init, int line, int charPos)
730 if(init.initializer && InsideIncl(&init.initializer.loc, line, charPos))
732 idResult = DebugFindCtxInitializer(init.initializer, line, charPos);
738 if(init.identifiers && init.identifiers->first && InsideIncl(&((Identifier)init.identifiers->first).loc, line, charPos))
740 idResult = DebugFindCtxIdentifier(init.identifiers->first, line, charPos);
742 return (void *)-2; //idResult;
744 if(init.initializer && InsideIncl(&init.initializer.loc, line, charPos))
746 if(init.initializer.type == expInitializer)
754 static Identifier DebugFindCtxInstance(Instantiation inst, int line, int charPos)
756 Identifier idResult = null;
757 Class oldThisClass = GetThisClass();
758 Symbol sym = inst._class ? FindClass(inst._class.name) : null;
759 bool insideSomething = false;
763 SetThisClass(sym.registered);
765 insideBrackets = !(inst.insideLoc.start.line > line || (line == inst.insideLoc.start.line && inst.insideLoc.start.charPos > charPos));
770 MemberInit memberInit;
771 for(init = inst.members->first; init; init = init.next)
773 if(init.loc.start.line > line || (line == init.loc.start.line && init.loc.start.charPos > charPos))
776 if(init.type == dataMembersInit && init.dataMembers && insideBrackets && sym)
778 for(memberInit = init.dataMembers->first; memberInit; memberInit = memberInit.next)
780 if(!idResult && InsideIncl(&memberInit.realLoc, line, charPos))
781 idResult = DebugFindCtxMemberInit(memberInit, line, charPos);
783 if(InsideIncl(&memberInit.realLoc, line, charPos) || (memberInit.realLoc.end.line > line || (line == memberInit.realLoc.end.line && memberInit.realLoc.end.charPos > charPos)))
785 if(memberInit.identifiers && memberInit.identifiers->first && InsideIncl(&memberInit.loc, line, charPos))
786 insideBrackets = false;
789 /*else if((!memberInit.identifiers || !memberInit.identifiers->first) && (memberInit.next || !InsideIncl(&init.loc, line, charPos)))
795 if(InsideIncl(&init.loc, line, charPos))
797 if(InsideIncl(&init.loc, line, charPos))
798 if(init.type == methodMembersInit)
799 insideSomething = true;
801 if(init.type == methodMembersInit && InsideIncl(&init.function.loc, line, charPos))
803 idResult = DebugFindCtxClassFunction(init.function, line, charPos);
806 if(InsideIncl(&init.loc, line, charPos))
810 if((init.loc.end.line > line || (line == init.loc.end.line && init.loc.end.charPos > charPos)))
816 SetThisClass(oldThisClass);
818 return (void *)-1; // ?
821 static Identifier DebugFindCtxClassFunction(ClassFunction func, int line, int charPos)
823 if(func.body && InsideIncl(&func.body.loc, line, charPos))
827 Identifier id = GetDeclId(func.declarator);
828 Symbol symbol = func.declarator ? func.declarator.symbol : null;
829 Type type = symbol ? symbol.type : null;
830 Class oldThisClass = GetThisClass();
831 Context oldTopContext = GetTopContext();
832 SetThisClass((type && type.thisClass) ? type.thisClass.registered : currentClass);
836 idResult = DebugFindCtxStatement(func.body, line, charPos);
841 SetThisClass(oldThisClass);
842 SetTopContext(oldTopContext);
844 else if(!func.body && GetFuncDecl(func.declarator))
847 SetThisClass(currentClass);
850 else if(!func.body && GetDeclId(func.declarator))
853 SetThisClass(currentClass);
859 static Identifier DebugFindCtxProperty(PropertyDef def, int line, int charPos)
862 if(def.getStmt && InsideIncl(&def.getStmt.loc, line, charPos))
864 Class oldThisClass = GetThisClass();
865 Context oldTopContext = GetTopContext();
866 SetThisClass(currentClass);
867 result = DebugFindCtxStatement(def.getStmt, line, charPos);
868 if(result) return result;
869 SetThisClass(oldThisClass);
871 if(def.setStmt && InsideIncl(&def.setStmt.loc, line, charPos))
873 Class oldThisClass = GetThisClass();
874 Context oldTopContext = GetTopContext();
875 SetThisClass(currentClass);
876 result = DebugFindCtxStatement(def.setStmt, line, charPos);
877 if(result) return result;
878 SetThisClass(oldThisClass);
883 static Identifier DebugFindCtxClassDef(ClassDef def, int line, int charPos)
888 case declarationClassDef:
889 if(InsideIncl(&def.decl.loc, line, charPos))
891 idResult = DebugFindCtxDeclaration(def.decl, line, charPos);
896 case defaultPropertiesClassDef:
899 for(init = def.defProperties->first; init; init = init.next)
901 if(InsideIncl(&init.realLoc, line, charPos))
903 Class oldThisClass = GetThisClass();
904 Context oldTopContext = GetTopContext();
905 SetThisClass(currentClass);
906 idResult = DebugFindCtxMemberInit(init, line, charPos);
909 SetThisClass(oldThisClass);
914 case functionClassDef:
915 if(InsideIncl(&def.function.loc, line, charPos))
917 idResult = DebugFindCtxClassFunction(def.function, line, charPos);
923 case propertyClassDef:
926 // TOCHECK: Missing thisClass here too?
928 if(InsideIncl(&def.propertyDef.loc, line, charPos))
930 idResult = DebugFindCtxProperty(def.propertyDef, line, charPos);
936 case propertyWatchClassDef:
937 if(def.propertyWatch && def.propertyWatch.compound && InsideIncl(&def.propertyWatch.compound.loc, line, charPos))
939 Class oldThisClass = GetThisClass();
940 Context oldTopContext = GetTopContext();
941 SetThisClass(currentClass);
943 idResult = DebugFindCtxStatement(def.propertyWatch.compound, line, charPos);
946 SetThisClass(oldThisClass);
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)
988 for(external = ast.first; external; external = external.next)
990 switch(external.type)
992 case functionExternal:
993 if(InsideIncl(&external.loc, line, charPos))
995 idResult = DebugFindCtxFunction(external.function, line, charPos);
997 return (idResult == (void *)-1 || idResult == (void *)-2) ? null : idResult;
1000 case declarationExternal:
1001 if(InsideIncl(&external.loc, line, charPos))
1003 idResult = DebugFindCtxDeclaration(external.declaration, line, charPos);
1005 return (idResult == (void *)-1 || idResult == (void *)-2) ? null : idResult;
1009 if(InsideIncl(&external._class.loc, line, charPos))
1011 currentClass = external._class.symbol.registered;
1012 idResult = DebugFindCtxClass(external._class, line, charPos);
1013 currentClass = null;
1015 return (idResult == (void *)-1 || idResult == (void *)-2) ? null : idResult;