3 //extern Class thisClass;
4 extern Class insideClass;
5 extern Expression ctxInsideExp;
6 extern ClassFunction insideFunction;
7 extern ClassDef insideDef;
8 extern bool insideInstance;
9 static bool allocedDummyExp;
11 static Class currentClass;
12 static bool isAfterEqual;
14 static bool InsideIncl(Location loc, int line, int charPos)
16 return !loc.start.included && (loc.start.line < line || (loc.start.line == line && loc.start.charPos <= charPos)) &&
17 (loc.end.line > line || (loc.end.line == line && loc.end.charPos >= charPos));
20 static bool Inside(Location loc, int line, int charPos)
22 return !loc.start.included && (loc.start.line < line || (loc.start.line == line && loc.start.charPos < charPos)) &&
23 (loc.end.line > line || (loc.end.line == line && loc.end.charPos > charPos));
26 static bool InsideEndIncl(Location loc, int line, int charPos)
28 return !loc.start.included && (loc.start.line < line || (loc.start.line == line && loc.start.charPos < charPos)) &&
29 (loc.end.line > line || (loc.end.line == line && loc.end.charPos >= charPos));
32 static Identifier FindCtxSpecifier(Specifier spec, int line, int charPos)
44 for(def = spec.definitions->first; def; def = def.next)
46 // TODO: Should use the FindCtxClassDef function here right?
48 //if(def.type == ClassDefDeclaration && def.decl && def.decl.type == DeclarationStruct)
49 // ProcessDeclaration(def.decl);
52 case declarationClassDef:
53 if(InsideIncl(&def.decl.loc, line, charPos))
55 idResult = FindCtxDeclaration(def.decl, line, charPos);
60 case defaultPropertiesClassDef:
63 for(init = def.defProperties->first; init; init = init.next)
65 if(InsideIncl(&init.realLoc, line, charPos))
67 Class oldThisClass = GetThisClass();
68 Context oldTopContext = GetTopContext();
69 SetThisClass(currentClass);
70 idResult = FindCtxMemberInit(init, line, charPos);
73 SetThisClass(oldThisClass);
78 case functionClassDef:
79 if(InsideIncl(&def.function.loc, line, charPos))
81 idResult = FindCtxClassFunction(def.function, line, charPos);
87 case propertyClassDef:
90 if(InsideIncl(&def.propertyDef.loc, line, charPos))
92 idResult = FindCtxProperty(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 = FindCtxStatement(def.propertyWatch.compound, line, charPos);
105 if(idResult) return idResult;
106 SetThisClass(oldThisClass);
118 Identifier FindCtxIdentifier(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 FindCtxIdentifier(id.badID, line, charPos);
130 Identifier FindCtxExpression(Expression exp, int line, int charPos)
132 Identifier idResult = null;
133 Expression oldExp = ctxInsideExp;
139 if(InsideIncl(&exp._new.size.loc, line, charPos))
141 idResult = FindCtxExpression(exp._new.size, line, charPos);
142 if(idResult) return idResult;
146 if(InsideIncl(&exp._renew.exp.loc, line, charPos))
148 idResult = FindCtxExpression(exp._renew.exp, line, charPos);
149 if(idResult) return idResult;
151 if(InsideIncl(&exp._renew.size.loc, line, charPos))
153 idResult = FindCtxExpression(exp._renew.size, line, charPos);
154 if(idResult) return idResult;
160 idResult = FindCtxIdentifier(exp.identifier, line, charPos);
161 if(idResult) return idResult;
165 if(InsideIncl(&exp.instance.loc, line, charPos))
167 idResult = FindCtxInstance(exp.instance, line, charPos);
168 if(idResult) return idResult;
177 if(InsideIncl(&exp.op.exp1.loc, line, charPos))
179 idResult = FindCtxExpression(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 = FindCtxExpression(exp.op.exp2, line, charPos);
190 if(idResult) return idResult;
192 ctxInsideExp = exp.op.exp2;
199 Expression expression;
201 for(expression = exp.list->first; expression; expression = expression.next)
203 if(InsideIncl(&expression.loc, line, charPos))
205 idResult = FindCtxExpression(expression, line, charPos);
206 if(idResult) return idResult;
213 Expression expression;
214 if(InsideIncl(&exp.index.exp.loc, line, charPos))
216 idResult = FindCtxExpression(exp.index.exp, line, charPos);
217 if(idResult) return idResult;
220 for(expression = exp.index.index->first; expression; expression = expression.next)
222 if(InsideIncl(&expression.loc, line, charPos))
224 idResult = FindCtxExpression(expression, line, charPos);
225 if(idResult) return idResult;
233 Type type = exp.call.exp.expType;
235 if(InsideIncl(&exp.call.exp.loc, line, charPos))
237 idResult = FindCtxExpression(exp.call.exp, line, charPos);
238 if(idResult) return idResult;
241 if(exp.call.argLoc.start.line > line || (line == exp.call.argLoc.start.line && exp.call.argLoc.start.charPos >= charPos))
246 if(exp.call.arguments)
248 Expression expression;
252 for(expression = exp.call.arguments->first; expression; expression = expression.next)
254 if(InsideIncl(&expression.loc, line, charPos) || (expression.loc.end.line > line || (line == expression.loc.end.line && expression.loc.end.charPos > charPos)))
256 if(Inside(&expression.loc, line, charPos))
257 idResult = FindCtxExpression(expression, line, charPos);
266 if(!ctxInsideExp && /*ctxInsideExp == exp && */type && type.kind == functionType)
271 for(param = type.params.first, c = 0; c<arg && param; c++, param = param.next);
273 if(param && arg != -1)
275 allocedDummyExp = true;
276 ctxInsideExp = MkExpDummy();
277 ctxInsideExp.destType = param;
278 if(param) param.refCount++;
279 return idResult ? idResult : (void *)-1;
288 if(InsideIncl(&exp.member.exp.loc, line, charPos))
290 idResult = FindCtxExpression(exp.member.exp, line, charPos);
291 if(idResult) return idResult;
294 return exp.member.member; //(void *)-1;
298 if(InsideIncl(&exp.member.exp.loc, line, charPos))
300 idResult = FindCtxExpression(exp.member.exp, line, charPos);
301 if(idResult) return idResult;
307 if(InsideIncl(&exp.cast.exp.loc, line, charPos))
309 idResult = FindCtxExpression(exp.cast.exp, line, charPos);
310 if(idResult) return idResult;
314 if(Inside(&exp.cond.cond.loc, line, charPos))
316 idResult = FindCtxExpression(exp.cond.cond, line, charPos);
317 if(idResult) return idResult;
321 Expression expression;
322 for(expression = exp.cond.exp->first; expression; expression = expression.next)
324 if(InsideIncl(&expression.loc, line, charPos))
326 idResult = FindCtxExpression(expression, line, charPos);
327 if(idResult) return idResult;
331 if(InsideIncl(&exp.cond.elseExp.loc, line, charPos))
333 idResult = FindCtxExpression(exp.cond.elseExp, line, charPos);
334 if(idResult) return idResult;
341 if(exp.destType && !exp.destType.truth) // && !exp.addedThis)
344 ctxInsideExp = oldExp;
348 static Identifier FindCtxStatement(Statement stmt, int line, int charPos)
355 if(InsideIncl(&stmt.labeled.stmt.loc, line, charPos))
356 return FindCtxStatement(stmt.labeled.stmt, line, charPos);
359 if(stmt.caseStmt.exp)
361 if(InsideIncl(&stmt.caseStmt.exp.loc, line, charPos))
362 return FindCtxExpression(stmt.caseStmt.exp, line, charPos);
365 if(stmt.caseStmt.stmt)
367 if(InsideIncl(&stmt.caseStmt.stmt.loc, line, charPos))
368 return FindCtxStatement(stmt.caseStmt.stmt, line, charPos);
371 case badDeclarationStmt:
373 Declaration decl = stmt.decl;
374 if(InsideIncl(&decl.loc, line, charPos))
376 idResult = FindCtxDeclaration(decl, line, charPos);
377 if(idResult) return idResult;
383 if(!stmt.compound.isSwitch)
384 SetCurrentContext(stmt.compound.context);
385 if(stmt.compound.declarations)
388 for(decl = stmt.compound.declarations->first; decl; decl = decl.next)
390 if(InsideIncl(&decl.loc, line, charPos))
392 idResult = FindCtxDeclaration(decl, line, charPos);
393 if(idResult) return idResult;
397 if(stmt.compound.statements)
400 for(statement = stmt.compound.statements->first; statement; statement = statement.next)
402 if(InsideIncl(&statement.loc, line, charPos))
404 idResult = FindCtxStatement(statement, line, charPos);
405 if(idResult) return idResult;
410 //curContext = stmt.compound.context.parent;
418 for(exp = stmt.expressions->first; exp; exp = exp.next)
420 if(InsideIncl(&exp.loc, line, charPos))
422 idResult = FindCtxExpression(exp, line, charPos);
423 if(idResult) return idResult;
432 for(exp = stmt.ifStmt.exp->first; exp; exp = exp.next)
434 if(InsideIncl(&exp.loc, line, charPos))
436 idResult = FindCtxExpression(exp, line, charPos);
437 if(idResult) return idResult;
442 if(InsideIncl(&stmt.ifStmt.stmt.loc, line, charPos))
444 idResult = FindCtxStatement(stmt.ifStmt.stmt, line, charPos);
445 if(idResult) return idResult;
448 if(stmt.ifStmt.elseStmt)
450 if(InsideIncl(&stmt.ifStmt.elseStmt.loc, line, charPos))
451 return FindCtxStatement(stmt.ifStmt.elseStmt, line, charPos);
458 for(exp = stmt.switchStmt.exp->first; exp; exp = exp.next)
460 if(InsideIncl(&exp.loc, line, charPos))
462 idResult = FindCtxExpression(exp, line, charPos);
463 if(idResult) return idResult;
466 if(InsideIncl(&stmt.switchStmt.stmt.loc, line, charPos))
467 return FindCtxStatement(stmt.switchStmt.stmt, line, charPos);
473 if(stmt.whileStmt.exp)
475 for(exp = stmt.whileStmt.exp->first; exp; exp = exp.next)
477 if(InsideIncl(&exp.loc, line, charPos))
479 idResult = FindCtxExpression(exp, line, charPos);
480 if(idResult) return idResult;
484 if(stmt.whileStmt.stmt && InsideIncl(&stmt.whileStmt.stmt.loc, line, charPos))
485 return FindCtxStatement(stmt.whileStmt.stmt, line, charPos);
490 if(InsideIncl(&stmt.doWhile.stmt.loc, line, charPos))
492 idResult = FindCtxStatement(stmt.doWhile.stmt, line, charPos);
493 if(idResult) return idResult;
499 for(exp = stmt.doWhile.exp->first; exp; exp = exp.next)
501 if(InsideIncl(&exp.loc, line, charPos))
503 idResult = FindCtxExpression(exp, line, charPos);
504 if(idResult) return idResult;
514 if(stmt.forStmt.init && InsideIncl(&stmt.forStmt.init.loc, line, charPos))
516 idResult = FindCtxStatement(stmt.forStmt.init, line, charPos);
517 if(idResult) return idResult;
520 if(stmt.forStmt.check && InsideIncl(&stmt.forStmt.check.loc, line, charPos))
522 idResult = FindCtxStatement(stmt.forStmt.check, line, charPos);
523 if(idResult) return idResult;
526 if(stmt.forStmt.increment)
528 for(exp = stmt.forStmt.increment->first; exp; exp = exp.next)
530 if(InsideIncl(&exp.loc, line, charPos))
532 idResult = FindCtxExpression(exp, line, charPos);
533 if(idResult) return idResult;
538 if(stmt.forStmt.stmt)
539 return FindCtxStatement(stmt.forStmt.stmt, line, charPos);
553 for(exp = stmt.expressions->first; exp; exp = exp.next)
555 if(InsideIncl(&exp.loc, line, charPos))
557 idResult = FindCtxExpression(exp, line, charPos);
558 if(idResult) return idResult;
563 case fireWatchersStmt:
564 case stopWatchingStmt:
567 if(stmt._watch.watcher && InsideIncl(&stmt._watch.watcher.loc, line, charPos))
569 idResult = FindCtxExpression(stmt._watch.watcher, line, charPos);
570 if(idResult) return idResult;
572 if(stmt._watch.object && InsideIncl(&stmt._watch.object.loc, line, charPos))
574 idResult = FindCtxExpression(stmt._watch.object, line, charPos);
575 if(idResult) return idResult;
577 if(stmt._watch.watches)
579 for(_watch = stmt._watch.watches->first; _watch; _watch = _watch.next)
581 if(InsideIncl(&_watch.loc, line, charPos))
583 idResult = FindCtxIdentifier(_watch, line, charPos);
584 if(idResult) return idResult;
592 PropertyWatch _watch;
593 if(stmt._watch.watcher && InsideIncl(&stmt._watch.watcher.loc, line, charPos))
595 idResult = FindCtxExpression(stmt._watch.watcher, line, charPos);
596 if(idResult) return idResult;
598 if(stmt._watch.object && InsideIncl(&stmt._watch.object.loc, line, charPos))
600 idResult = FindCtxExpression(stmt._watch.object, line, charPos);
601 if(idResult) return idResult;
603 if(stmt._watch.watches)
605 for(_watch = stmt._watch.watches->first; _watch; _watch = _watch.next)
607 if(_watch.compound && InsideIncl(&_watch.compound.loc, line, charPos))
609 idResult = FindCtxStatement(_watch.compound, line, charPos);
610 if(idResult) return idResult;
620 static Identifier FindCtxInitializer(Initializer initializer, int line, int charPos)
622 switch(initializer.type)
624 case listInitializer:
629 for(init = initializer.list->first; init; init = init.next)
631 if(InsideIncl(&init.loc, line, charPos))
633 idResult = FindCtxInitializer(init, line, charPos);
634 if(idResult) return idResult;
640 if(InsideIncl(&initializer.exp.loc, line, charPos))
641 return FindCtxExpression(initializer.exp, line, charPos);
644 ctxInsideExp = initializer.exp;
652 static Identifier FindCtxInitDeclarator(InitDeclarator decl, int line, int charPos)
654 if(decl.initializer && InsideIncl(&decl.initializer.loc, line, charPos))
655 return FindCtxInitializer(decl.initializer, line, charPos);
659 static Identifier FindCtxDeclaration(Declaration decl, int line, int charPos)
665 case structDeclaration:
670 for(spec = decl.specifiers->first; spec; spec = spec.next)
672 if(InsideIncl(&spec.loc, line, charPos))
674 idResult = FindCtxSpecifier(spec, line, charPos);
675 if(idResult) return idResult;
680 if(decl.declarators && decl.declarators->first)
682 for(d = decl.declarators->first; d; d = d.next)
684 if(InsideIncl(&d.loc, line, charPos))
686 if(d.type == DeclaratorStruct && d.declarator && d.declarator.type == DeclaratorIdentifier)
687 return d.declarator.identifier;
694 case initDeclaration:
696 // Need to loop through specifiers to look for :: completion
701 for(s = decl.specifiers->first; s; s = s.next)
703 if(InsideIncl(&s.loc, line, charPos))
705 idResult = FindCtxSpecifier(s, line, charPos);
706 if(idResult) return idResult;
711 if(decl.declarators && decl.declarators->first)
714 for(d = decl.declarators->first; d; d = d.next)
716 if(InsideIncl(&d.loc, line, charPos))
718 idResult = FindCtxInitDeclarator(d, line, charPos);
719 if(idResult) return idResult;
725 case instDeclaration:
726 if(InsideIncl(&decl.inst.loc, line, charPos))
727 return FindCtxInstance(decl.inst, line, charPos);
733 static Identifier FindCtxFunction(FunctionDefinition func, int line, int charPos)
735 if(func.body && Inside(&func.body.loc, line, charPos))
739 Identifier id = GetDeclId(func.declarator);
740 Symbol symbol = func.declarator.symbol;
741 Type type = symbol.type;
742 Class oldThisClass = GetThisClass();
743 Context oldTopContext = GetTopContext();
745 idResult = FindCtxStatement(func.body, line, charPos);
749 SetThisClass(oldThisClass);
750 SetTopContext(oldTopContext);
755 static Identifier FindCtxMemberInit(MemberInit init, int line, int charPos)
758 if(init.initializer && InsideIncl(&init.initializer.loc, line, charPos))
760 idResult = FindCtxInitializer(init.initializer, line, charPos);
763 if(init.identifiers && init.identifiers->first)
768 if(init.identifiers && init.identifiers->first && InsideIncl(&((Identifier)init.identifiers->first).loc, line, charPos))
770 idResult = FindCtxIdentifier(init.identifiers->first, line, charPos);
772 return (void *)-2; //idResult;
774 if(init.initializer && Inside(&init.initializer.loc, line, charPos))
776 if(init.identifiers && init.identifiers->first)
779 if(init.initializer.type == expInitializer)
781 ctxInsideExp = init.initializer.exp;
788 static Identifier FindCtxInstance(Instantiation inst, int line, int charPos)
790 Identifier idResult = null;
791 Class oldThisClass = GetThisClass();
792 Symbol sym = inst._class ? FindClass(inst._class.name) : null;
793 bool insideSomething = false;
795 Method method = null;
797 Class curClass = null;
798 DataMember curMember = null;
799 DataMember dataMember = null;
800 DataMember subMemberStack[256];
801 int subMemberStackPos = 0;
804 SetThisClass(sym.registered);
806 insideBrackets = !(inst.insideLoc.start.line > line || (line == inst.insideLoc.start.line && inst.insideLoc.start.charPos > charPos));
809 // Start with first member
810 eClass_FindNextMember(GetThisClass(), &curClass, &curMember, subMemberStack, &subMemberStackPos);
811 dataMember = curMember;
817 MemberInit memberInit;
818 for(init = inst.members->first; init; init = init.next)
820 if(init.loc.start.line > line || (line == init.loc.start.line && init.loc.start.charPos > charPos))
823 if(init.type == dataMembersInit && init.dataMembers && insideBrackets && sym)
825 for(memberInit = init.dataMembers->first; memberInit; memberInit = memberInit.next)
827 isAfterEqual = false;
829 if(memberInit.identifiers && memberInit.identifiers->first)
831 DataMember _subMemberStack[256];
832 int _subMemberStackPos = 0;
833 DataMember thisMember = eClass_FindDataMember(GetThisClass(), ((Identifier)memberInit.identifiers->first).string, GetPrivateModule(), _subMemberStack, &_subMemberStackPos);
836 // WARNING: Brackets needed until precomp fix
837 thisMember = (DataMember)eClass_FindProperty(GetThisClass(), ((Identifier)memberInit.identifiers->first).string, GetPrivateModule());
842 dataMember = thisMember;
843 if(thisMember.memberAccess == publicAccess)
845 curMember = thisMember;
846 curClass = thisMember._class;
847 memcpy(subMemberStack, _subMemberStack, sizeof(DataMember) * _subMemberStackPos);
848 subMemberStackPos = _subMemberStackPos;
852 method = eClass_FindMethod(GetThisClass(), ((Identifier)memberInit.identifiers->first).string, GetPrivateModule());
855 if(!idResult && InsideIncl(&memberInit.realLoc, line, charPos))
856 idResult = FindCtxMemberInit(memberInit, line, charPos);
858 if(InsideIncl(&memberInit.realLoc, line, charPos) || (memberInit.realLoc.end.line > line || (line == memberInit.realLoc.end.line && memberInit.realLoc.end.charPos > charPos)))
860 if(memberInit.identifiers && memberInit.identifiers->first && InsideIncl(&memberInit.loc, line, charPos) && !dataMember)
861 insideBrackets = false;
864 else if((!memberInit.identifiers || !memberInit.identifiers->first || dataMember) && (memberInit.next || !Inside(&init.loc, line, charPos)))
867 eClass_FindNextMember(GetThisClass(), &curClass, &curMember, subMemberStack, &subMemberStackPos);
868 dataMember = curMember;
873 if(InsideIncl(&init.loc, line, charPos))
875 if(Inside(&init.loc, line, charPos))
876 if(init.type == methodMembersInit)
877 insideSomething = true;
879 if(init.type == methodMembersInit && Inside(&init.function.loc, line, charPos))
881 idResult = FindCtxClassFunction(init.function, line, charPos);
882 if(init.function == insideFunction)
883 insideDef = (ClassDef)init; // Only using prev member of insideDef
886 if(Inside(&init.loc, line, charPos))
890 if((init.loc.end.line > line || (line == init.loc.end.line && init.loc.end.charPos > charPos)))
894 if((!idResult || idResult != (Identifier)-1) && sym && sym.registered && InsideIncl(&inst.insideLoc, line, charPos) && insideBrackets && !insideSomething)
896 if(dataMember && !method)
898 if(!dataMember.dataType)
899 dataMember.dataType = ProcessTypeString(dataMember.dataTypeString, false);
900 allocedDummyExp = true;
901 ctxInsideExp = MkExpDummy();
902 ctxInsideExp.destType = dataMember.dataType;
903 if(ctxInsideExp.destType) ctxInsideExp.destType.refCount++;
907 if((!idResult || idResult != (Identifier)-1) && sym && sym.registered && InsideIncl(&inst.insideLoc, line, charPos) && !insideSomething && insideBrackets)
911 allocedDummyExp = true;
912 ctxInsideExp = MkExpDummy();
913 ctxInsideExp.destType = method.dataType;
914 if(ctxInsideExp.destType) ctxInsideExp.destType.refCount++;
918 if(sym && !insideSomething && InsideIncl(&inst.insideLoc, line, charPos))
920 if(!isAfterEqual && !insideClass && (!idResult || idResult == (void *)-2))
921 insideClass = sym.registered;
923 if(isAfterEqual && currentClass)
924 SetThisClass(currentClass);
926 return idResult ? idResult : (void *) -1;
931 SetThisClass(oldThisClass);
936 static Identifier FindCtxClassFunction(ClassFunction func, int line, int charPos)
938 if(func.body && Inside(&func.body.loc, line, charPos))
942 Identifier id = GetDeclId(func.declarator);
943 Symbol symbol = func.declarator ? func.declarator.symbol : null;
944 Type type = symbol ? symbol.type : null;
945 Class oldThisClass = GetThisClass();
946 Context oldTopContext = GetTopContext();
947 SetThisClass((type && type.thisClass) ? type.thisClass.registered : currentClass);
951 idResult = FindCtxStatement(func.body, line, charPos);
956 SetThisClass(oldThisClass);
957 SetTopContext(oldTopContext);
959 else if(!func.body && GetFuncDecl(func.declarator))
962 SetThisClass(currentClass);
965 insideInstance = true;
966 // Is this insideClass ever used?
967 insideClass = GetThisClass(); //currentClass;
969 insideFunction = func;
972 else if(!func.body && GetDeclId(func.declarator))
975 SetThisClass(currentClass);
978 insideInstance = true;
980 // Has to be GetThisClass() to work...
981 insideClass = GetThisClass();//currentClass;
987 // TESTING THIS FOR HANDLING: bool ^bool NotifyClicked
988 insideInstance = true;
990 // Has to be GetThisClass() to work...
991 insideClass = GetThisClass();//currentClass;
996 static Identifier FindCtxProperty(PropertyDef def, int line, int charPos)
999 if(def.getStmt && Inside(&def.getStmt.loc, line, charPos))
1001 Class oldThisClass = GetThisClass();
1002 Context oldTopContext = GetTopContext();
1003 SetThisClass(currentClass);
1004 result = FindCtxStatement(def.getStmt, line, charPos);
1005 if(result) return result;
1006 SetThisClass(oldThisClass);
1008 if(def.setStmt && Inside(&def.setStmt.loc, line, charPos))
1010 Class oldThisClass = GetThisClass();
1011 Context oldTopContext = GetTopContext();
1012 SetThisClass(currentClass);
1013 result = FindCtxStatement(def.setStmt, line, charPos);
1014 if(result) return result;
1015 SetThisClass(oldThisClass);
1020 static Identifier FindCtxClassDef(ClassDef def, int line, int charPos)
1022 Identifier idResult;
1025 case declarationClassDef:
1026 if(InsideEndIncl(&def.decl.loc, line, charPos))
1028 idResult = FindCtxDeclaration(def.decl, line, charPos);
1033 case defaultPropertiesClassDef:
1036 for(init = def.defProperties->first; init; init = init.next)
1038 if(InsideIncl(&init.realLoc, line, charPos))
1040 Class oldThisClass = GetThisClass();
1041 Context oldTopContext = GetTopContext();
1042 SetThisClass(currentClass);
1043 idResult = FindCtxMemberInit(init, line, charPos);
1046 SetThisClass(oldThisClass);
1051 case functionClassDef:
1052 if(Inside(&def.function.loc, line, charPos))
1054 idResult = FindCtxClassFunction(def.function, line, charPos);
1055 if(def.function == insideFunction)
1062 case propertyClassDef:
1065 if(Inside(&def.propertyDef.loc, line, charPos))
1067 idResult = FindCtxProperty(def.propertyDef, line, charPos);
1073 case propertyWatchClassDef:
1074 if(def.propertyWatch && def.propertyWatch.compound && Inside(&def.propertyWatch.compound.loc, line, charPos))
1076 Class oldThisClass = GetThisClass();
1077 Context oldTopContext = GetTopContext();
1078 SetThisClass(currentClass);
1079 idResult = FindCtxStatement(def.propertyWatch.compound, line, charPos);
1080 if(idResult) return idResult;
1081 SetThisClass(oldThisClass);
1088 static Identifier FindCtxClass(ClassDefinition _class, int line, int charPos)
1090 Identifier idResult;
1091 bool insideSomething = false;
1092 if(_class.definitions)
1095 for(def = _class.definitions->first; def; def = def.next)
1097 if(def.type == defaultPropertiesClassDef ? InsideIncl(&def.loc, line, charPos) : Inside(&def.loc, line, charPos) )
1099 if(def.type != defaultPropertiesClassDef)
1100 insideSomething = true;
1102 idResult = FindCtxClassDef(def, line, charPos);
1106 insideSomething = false;
1110 if(!insideSomething && line > _class.blockStart.start.line || (line == _class.blockStart.start.line && charPos >= _class.blockStart.start.charPos) )
1112 insideClass = _class.symbol.registered;
1118 Identifier FindCtxTree(OldList ast, int line, int charPos)
1120 Identifier idResult;
1125 FreeExpression(ctxInsideExp);
1126 allocedDummyExp = false;
1130 ctxInsideExp = null;
1132 insideFunction = null;
1133 insideInstance = false;
1134 isAfterEqual = false;
1138 for(external = ast.first; external; external = external.next)
1140 switch(external.type)
1142 case functionExternal:
1143 if(Inside(&external.loc, line, charPos))
1145 idResult = FindCtxFunction(external.function, line, charPos);
1147 return (idResult == (void *)-1 || idResult == (void *)-2) ? null : idResult;
1150 case declarationExternal:
1151 if(InsideIncl(&external.loc, line, charPos))
1153 idResult = FindCtxDeclaration(external.declaration, line, charPos);
1155 return (idResult == (void *)-1 || idResult == (void *)-2) ? null : idResult;
1159 if(Inside(&external._class.loc, line, charPos))
1161 currentClass = external._class.symbol.registered;
1162 idResult = FindCtxClass(external._class, line, charPos);
1164 return (idResult == (void *)-1 || idResult == (void *)-2) ? null : idResult;
1165 currentClass = null;
1174 void FindCtx_Terminate()
1178 FreeExpression(ctxInsideExp);
1179 allocedDummyExp = false;