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(InsideIncl(&expression.loc, line, charPos))
257 idResult = FindCtxExpression(expression, line, charPos);
265 if(type && type.kind == methodType && type.method)
266 type = type.method.dataType;
268 if(!ctxInsideExp && /*ctxInsideExp == exp && */type && type.kind == functionType)
273 for(param = type.params.first, c = 0; c<arg && param; c++, param = param.next);
275 if(param && arg != -1)
277 allocedDummyExp = true;
278 ctxInsideExp = MkExpDummy();
279 ctxInsideExp.destType = param;
280 if(param) param.refCount++;
281 return idResult ? idResult : (void *)-1;
290 if(InsideIncl(&exp.member.exp.loc, line, charPos))
292 idResult = FindCtxExpression(exp.member.exp, line, charPos);
293 if(idResult) return idResult;
296 return exp.member.member; //(void *)-1;
300 if(InsideIncl(&exp.member.exp.loc, line, charPos))
302 idResult = FindCtxExpression(exp.member.exp, line, charPos);
303 if(idResult) return idResult;
309 if(InsideIncl(&exp.cast.exp.loc, line, charPos))
311 idResult = FindCtxExpression(exp.cast.exp, line, charPos);
312 if(idResult) return idResult;
316 if(Inside(&exp.cond.cond.loc, line, charPos))
318 idResult = FindCtxExpression(exp.cond.cond, line, charPos);
319 if(idResult) return idResult;
323 Expression expression;
324 for(expression = exp.cond.exp->first; expression; expression = expression.next)
326 if(InsideIncl(&expression.loc, line, charPos))
328 idResult = FindCtxExpression(expression, line, charPos);
329 if(idResult) return idResult;
333 if(InsideIncl(&exp.cond.elseExp.loc, line, charPos))
335 idResult = FindCtxExpression(exp.cond.elseExp, line, charPos);
336 if(idResult) return idResult;
343 if(exp.destType && !exp.destType.truth) // && !exp.addedThis)
346 ctxInsideExp = oldExp;
350 static Identifier FindCtxStatement(Statement stmt, int line, int charPos)
357 if(InsideIncl(&stmt.labeled.stmt.loc, line, charPos))
358 return FindCtxStatement(stmt.labeled.stmt, line, charPos);
361 if(stmt.caseStmt.exp)
363 if(InsideIncl(&stmt.caseStmt.exp.loc, line, charPos))
364 return FindCtxExpression(stmt.caseStmt.exp, line, charPos);
367 if(stmt.caseStmt.stmt)
369 if(InsideIncl(&stmt.caseStmt.stmt.loc, line, charPos))
370 return FindCtxStatement(stmt.caseStmt.stmt, line, charPos);
373 case badDeclarationStmt:
375 Declaration decl = stmt.decl;
376 if(InsideIncl(&decl.loc, line, charPos))
378 idResult = FindCtxDeclaration(decl, line, charPos);
379 if(idResult) return idResult;
385 if(!stmt.compound.isSwitch)
386 SetCurrentContext(stmt.compound.context);
387 if(stmt.compound.declarations)
390 for(decl = stmt.compound.declarations->first; decl; decl = decl.next)
392 if(InsideIncl(&decl.loc, line, charPos))
394 idResult = FindCtxDeclaration(decl, line, charPos);
395 if(idResult) return idResult;
399 if(stmt.compound.statements)
402 for(statement = stmt.compound.statements->first; statement; statement = statement.next)
404 if(InsideIncl(&statement.loc, line, charPos))
406 idResult = FindCtxStatement(statement, line, charPos);
407 if(idResult) return idResult;
412 //curContext = stmt.compound.context.parent;
420 for(exp = stmt.expressions->first; exp; exp = exp.next)
422 if(InsideIncl(&exp.loc, line, charPos))
424 idResult = FindCtxExpression(exp, line, charPos);
425 if(idResult) return idResult;
434 for(exp = stmt.ifStmt.exp->first; exp; exp = exp.next)
436 if(InsideIncl(&exp.loc, line, charPos))
438 idResult = FindCtxExpression(exp, line, charPos);
439 if(idResult) return idResult;
444 if(InsideIncl(&stmt.ifStmt.stmt.loc, line, charPos))
446 idResult = FindCtxStatement(stmt.ifStmt.stmt, line, charPos);
447 if(idResult) return idResult;
450 if(stmt.ifStmt.elseStmt)
452 if(InsideIncl(&stmt.ifStmt.elseStmt.loc, line, charPos))
453 return FindCtxStatement(stmt.ifStmt.elseStmt, line, charPos);
460 for(exp = stmt.switchStmt.exp->first; exp; exp = exp.next)
462 if(InsideIncl(&exp.loc, line, charPos))
464 idResult = FindCtxExpression(exp, line, charPos);
465 if(idResult) return idResult;
468 if(InsideIncl(&stmt.switchStmt.stmt.loc, line, charPos))
469 return FindCtxStatement(stmt.switchStmt.stmt, line, charPos);
475 if(stmt.whileStmt.exp)
477 for(exp = stmt.whileStmt.exp->first; exp; exp = exp.next)
479 if(InsideIncl(&exp.loc, line, charPos))
481 idResult = FindCtxExpression(exp, line, charPos);
482 if(idResult) return idResult;
486 if(stmt.whileStmt.stmt && InsideIncl(&stmt.whileStmt.stmt.loc, line, charPos))
487 return FindCtxStatement(stmt.whileStmt.stmt, line, charPos);
492 if(InsideIncl(&stmt.doWhile.stmt.loc, line, charPos))
494 idResult = FindCtxStatement(stmt.doWhile.stmt, line, charPos);
495 if(idResult) return idResult;
501 for(exp = stmt.doWhile.exp->first; exp; exp = exp.next)
503 if(InsideIncl(&exp.loc, line, charPos))
505 idResult = FindCtxExpression(exp, line, charPos);
506 if(idResult) return idResult;
516 if(stmt.forStmt.init && InsideIncl(&stmt.forStmt.init.loc, line, charPos))
518 idResult = FindCtxStatement(stmt.forStmt.init, line, charPos);
519 if(idResult) return idResult;
522 if(stmt.forStmt.check && InsideIncl(&stmt.forStmt.check.loc, line, charPos))
524 idResult = FindCtxStatement(stmt.forStmt.check, line, charPos);
525 if(idResult) return idResult;
528 if(stmt.forStmt.increment)
530 for(exp = stmt.forStmt.increment->first; exp; exp = exp.next)
532 if(InsideIncl(&exp.loc, line, charPos))
534 idResult = FindCtxExpression(exp, line, charPos);
535 if(idResult) return idResult;
540 if(stmt.forStmt.stmt)
541 return FindCtxStatement(stmt.forStmt.stmt, line, charPos);
555 for(exp = stmt.expressions->first; exp; exp = exp.next)
557 if(InsideIncl(&exp.loc, line, charPos))
559 idResult = FindCtxExpression(exp, line, charPos);
560 if(idResult) return idResult;
565 case fireWatchersStmt:
566 case stopWatchingStmt:
569 if(stmt._watch.watcher && InsideIncl(&stmt._watch.watcher.loc, line, charPos))
571 idResult = FindCtxExpression(stmt._watch.watcher, line, charPos);
572 if(idResult) return idResult;
574 if(stmt._watch.object && InsideIncl(&stmt._watch.object.loc, line, charPos))
576 idResult = FindCtxExpression(stmt._watch.object, line, charPos);
577 if(idResult) return idResult;
579 if(stmt._watch.watches)
581 for(_watch = stmt._watch.watches->first; _watch; _watch = _watch.next)
583 if(InsideIncl(&_watch.loc, line, charPos))
585 idResult = FindCtxIdentifier(_watch, line, charPos);
586 if(idResult) return idResult;
594 PropertyWatch _watch;
595 if(stmt._watch.watcher && InsideIncl(&stmt._watch.watcher.loc, line, charPos))
597 idResult = FindCtxExpression(stmt._watch.watcher, line, charPos);
598 if(idResult) return idResult;
600 if(stmt._watch.object && InsideIncl(&stmt._watch.object.loc, line, charPos))
602 idResult = FindCtxExpression(stmt._watch.object, line, charPos);
603 if(idResult) return idResult;
605 if(stmt._watch.watches)
607 for(_watch = stmt._watch.watches->first; _watch; _watch = _watch.next)
609 if(_watch.compound && InsideIncl(&_watch.compound.loc, line, charPos))
611 idResult = FindCtxStatement(_watch.compound, line, charPos);
612 if(idResult) return idResult;
622 static Identifier FindCtxInitializer(Initializer initializer, int line, int charPos)
624 switch(initializer.type)
626 case listInitializer:
631 for(init = initializer.list->first; init; init = init.next)
633 if(InsideIncl(&init.loc, line, charPos))
635 idResult = FindCtxInitializer(init, line, charPos);
636 if(idResult) return idResult;
642 if(InsideIncl(&initializer.exp.loc, line, charPos))
643 return FindCtxExpression(initializer.exp, line, charPos);
646 ctxInsideExp = initializer.exp;
654 static Identifier FindCtxInitDeclarator(InitDeclarator decl, int line, int charPos)
656 if(decl.initializer && InsideIncl(&decl.initializer.loc, line, charPos))
657 return FindCtxInitializer(decl.initializer, line, charPos);
661 static Identifier FindCtxDeclaration(Declaration decl, int line, int charPos)
667 case structDeclaration:
672 for(spec = decl.specifiers->first; spec; spec = spec.next)
674 if(InsideIncl(&spec.loc, line, charPos))
676 idResult = FindCtxSpecifier(spec, line, charPos);
677 if(idResult) return idResult;
682 if(decl.declarators && decl.declarators->first)
684 for(d = decl.declarators->first; d; d = d.next)
686 if(InsideIncl(&d.loc, line, charPos))
688 if(d.type == DeclaratorStruct && d.declarator && d.declarator.type == DeclaratorIdentifier)
689 return d.declarator.identifier;
696 case initDeclaration:
698 // Need to loop through specifiers to look for :: completion
703 for(s = decl.specifiers->first; s; s = s.next)
705 if(InsideIncl(&s.loc, line, charPos))
707 idResult = FindCtxSpecifier(s, line, charPos);
708 if(idResult) return idResult;
713 if(decl.declarators && decl.declarators->first)
716 for(d = decl.declarators->first; d; d = d.next)
718 if(InsideIncl(&d.loc, line, charPos))
720 idResult = FindCtxInitDeclarator(d, line, charPos);
721 if(idResult) return idResult;
727 case instDeclaration:
728 if(InsideIncl(&decl.inst.loc, line, charPos))
729 return FindCtxInstance(decl.inst, line, charPos);
735 static Identifier FindCtxFunction(FunctionDefinition func, int line, int charPos)
737 if(func.body && Inside(&func.body.loc, line, charPos))
741 Identifier id = GetDeclId(func.declarator);
742 Symbol symbol = func.declarator.symbol;
743 Type type = symbol.type;
744 Class oldThisClass = GetThisClass();
745 Context oldTopContext = GetTopContext();
747 idResult = FindCtxStatement(func.body, line, charPos);
751 SetThisClass(oldThisClass);
752 SetTopContext(oldTopContext);
757 static Identifier FindCtxMemberInit(MemberInit init, int line, int charPos)
760 if(init.initializer && InsideIncl(&init.initializer.loc, line, charPos))
762 idResult = FindCtxInitializer(init.initializer, line, charPos);
765 if(init.identifiers && init.identifiers->first)
770 if(init.identifiers && init.identifiers->first && InsideIncl(&((Identifier)init.identifiers->first).loc, line, charPos))
772 idResult = FindCtxIdentifier(init.identifiers->first, line, charPos);
774 return (void *)-2; //idResult;
776 if(init.initializer && Inside(&init.initializer.loc, line, charPos))
778 if(init.identifiers && init.identifiers->first)
781 if(init.initializer.type == expInitializer)
783 ctxInsideExp = init.initializer.exp;
790 static Identifier FindCtxInstance(Instantiation inst, int line, int charPos)
792 Identifier idResult = null;
793 Class oldThisClass = GetThisClass();
794 Symbol sym = inst._class ? FindClass(inst._class.name) : null;
795 bool insideSomething = false;
797 Method method = null;
799 Class curClass = null;
800 DataMember curMember = null;
801 DataMember dataMember = null;
802 DataMember subMemberStack[256];
803 int subMemberStackPos = 0;
806 SetThisClass(sym.registered);
808 insideBrackets = !(inst.insideLoc.start.line > line || (line == inst.insideLoc.start.line && inst.insideLoc.start.charPos > charPos));
811 // Start with first member
812 eClass_FindNextMember(GetThisClass(), &curClass, &curMember, subMemberStack, &subMemberStackPos);
813 dataMember = curMember;
819 MemberInit memberInit;
820 for(init = inst.members->first; init; init = init.next)
822 if(init.loc.start.line > line || (line == init.loc.start.line && init.loc.start.charPos > charPos))
825 if(init.type == dataMembersInit && init.dataMembers && insideBrackets && sym)
827 for(memberInit = init.dataMembers->first; memberInit; memberInit = memberInit.next)
829 isAfterEqual = false;
831 if(memberInit.identifiers && memberInit.identifiers->first)
833 DataMember _subMemberStack[256];
834 int _subMemberStackPos = 0;
835 DataMember thisMember = eClass_FindDataMember(GetThisClass(), ((Identifier)memberInit.identifiers->first).string, GetPrivateModule(), _subMemberStack, &_subMemberStackPos);
838 // WARNING: Brackets needed until precomp fix
839 thisMember = (DataMember)eClass_FindProperty(GetThisClass(), ((Identifier)memberInit.identifiers->first).string, GetPrivateModule());
844 dataMember = thisMember;
845 if(thisMember.memberAccess == publicAccess)
847 curMember = thisMember;
848 curClass = thisMember._class;
849 memcpy(subMemberStack, _subMemberStack, sizeof(DataMember) * _subMemberStackPos);
850 subMemberStackPos = _subMemberStackPos;
854 method = eClass_FindMethod(GetThisClass(), ((Identifier)memberInit.identifiers->first).string, GetPrivateModule());
857 if(!idResult && InsideIncl(&memberInit.realLoc, line, charPos))
858 idResult = FindCtxMemberInit(memberInit, line, charPos);
860 if(InsideIncl(&memberInit.realLoc, line, charPos) || (memberInit.realLoc.end.line > line || (line == memberInit.realLoc.end.line && memberInit.realLoc.end.charPos > charPos)))
862 if(memberInit.identifiers && memberInit.identifiers->first && InsideIncl(&memberInit.loc, line, charPos) && !dataMember)
863 insideBrackets = false;
866 else if((!memberInit.identifiers || !memberInit.identifiers->first || dataMember) && (memberInit.next || !Inside(&init.loc, line, charPos)))
869 eClass_FindNextMember(GetThisClass(), &curClass, &curMember, subMemberStack, &subMemberStackPos);
870 dataMember = curMember;
875 if(InsideIncl(&init.loc, line, charPos))
877 if(Inside(&init.loc, line, charPos))
878 if(init.type == methodMembersInit)
879 insideSomething = true;
881 if(init.type == methodMembersInit && Inside(&init.function.loc, line, charPos))
883 idResult = FindCtxClassFunction(init.function, line, charPos);
884 if(init.function == insideFunction)
885 insideDef = (ClassDef)init; // Only using prev member of insideDef
888 if(Inside(&init.loc, line, charPos))
892 if((init.loc.end.line > line || (line == init.loc.end.line && init.loc.end.charPos > charPos)))
896 if((!idResult || idResult != (Identifier)-1) && sym && sym.registered && InsideIncl(&inst.insideLoc, line, charPos) && insideBrackets && !insideSomething)
898 if(dataMember && !method)
900 if(!dataMember.dataType)
901 dataMember.dataType = ProcessTypeString(dataMember.dataTypeString, false);
902 allocedDummyExp = true;
903 ctxInsideExp = MkExpDummy();
904 ctxInsideExp.destType = dataMember.dataType;
905 if(ctxInsideExp.destType) ctxInsideExp.destType.refCount++;
909 if((!idResult || idResult != (Identifier)-1) && sym && sym.registered && InsideIncl(&inst.insideLoc, line, charPos) && !insideSomething && insideBrackets)
913 allocedDummyExp = true;
914 ctxInsideExp = MkExpDummy();
915 ctxInsideExp.destType = method.dataType;
916 if(ctxInsideExp.destType) ctxInsideExp.destType.refCount++;
920 if(sym && !insideSomething && InsideIncl(&inst.insideLoc, line, charPos))
922 if(!isAfterEqual && !insideClass && (!idResult || idResult == (void *)-2))
923 insideClass = sym.registered;
925 if(isAfterEqual && currentClass)
926 SetThisClass(currentClass);
928 return idResult ? idResult : (void *) -1;
933 SetThisClass(oldThisClass);
938 static Identifier FindCtxClassFunction(ClassFunction func, int line, int charPos)
940 if(func.body && Inside(&func.body.loc, line, charPos))
944 Identifier id = GetDeclId(func.declarator);
945 Symbol symbol = func.declarator ? func.declarator.symbol : null;
946 Type type = symbol ? symbol.type : null;
947 Class oldThisClass = GetThisClass();
948 Context oldTopContext = GetTopContext();
949 SetThisClass((type && type.thisClass) ? type.thisClass.registered : currentClass);
953 idResult = FindCtxStatement(func.body, line, charPos);
958 SetThisClass(oldThisClass);
959 SetTopContext(oldTopContext);
961 else if(!func.body && GetFuncDecl(func.declarator))
964 SetThisClass(currentClass);
967 insideInstance = true;
968 // Is this insideClass ever used?
969 insideClass = GetThisClass(); //currentClass;
971 insideFunction = func;
974 else if(!func.body && GetDeclId(func.declarator))
977 SetThisClass(currentClass);
980 insideInstance = true;
982 // Has to be GetThisClass() to work...
983 insideClass = GetThisClass();//currentClass;
989 // TESTING THIS FOR HANDLING: bool ^bool NotifyClicked
990 insideInstance = true;
992 // Has to be GetThisClass() to work...
993 insideClass = GetThisClass();//currentClass;
998 static Identifier FindCtxProperty(PropertyDef def, int line, int charPos)
1001 if(def.getStmt && Inside(&def.getStmt.loc, line, charPos))
1003 Class oldThisClass = GetThisClass();
1004 Context oldTopContext = GetTopContext();
1005 SetThisClass(currentClass);
1006 result = FindCtxStatement(def.getStmt, line, charPos);
1007 if(result) return result;
1008 SetThisClass(oldThisClass);
1010 if(def.setStmt && Inside(&def.setStmt.loc, line, charPos))
1012 Class oldThisClass = GetThisClass();
1013 Context oldTopContext = GetTopContext();
1014 SetThisClass(currentClass);
1015 result = FindCtxStatement(def.setStmt, line, charPos);
1016 if(result) return result;
1017 SetThisClass(oldThisClass);
1022 static Identifier FindCtxClassDef(ClassDef def, int line, int charPos)
1024 Identifier idResult;
1027 case declarationClassDef:
1028 if(InsideEndIncl(&def.decl.loc, line, charPos))
1030 idResult = FindCtxDeclaration(def.decl, line, charPos);
1035 case defaultPropertiesClassDef:
1038 for(init = def.defProperties->first; init; init = init.next)
1040 if(InsideIncl(&init.realLoc, line, charPos))
1042 Class oldThisClass = GetThisClass();
1043 Context oldTopContext = GetTopContext();
1044 SetThisClass(currentClass);
1045 idResult = FindCtxMemberInit(init, line, charPos);
1048 SetThisClass(oldThisClass);
1053 case functionClassDef:
1054 if(Inside(&def.function.loc, line, charPos))
1056 idResult = FindCtxClassFunction(def.function, line, charPos);
1057 if(def.function == insideFunction)
1064 case propertyClassDef:
1067 if(Inside(&def.propertyDef.loc, line, charPos))
1069 idResult = FindCtxProperty(def.propertyDef, line, charPos);
1075 case propertyWatchClassDef:
1076 if(def.propertyWatch && def.propertyWatch.compound && Inside(&def.propertyWatch.compound.loc, line, charPos))
1078 Class oldThisClass = GetThisClass();
1079 Context oldTopContext = GetTopContext();
1080 SetThisClass(currentClass);
1081 idResult = FindCtxStatement(def.propertyWatch.compound, line, charPos);
1082 if(idResult) return idResult;
1083 SetThisClass(oldThisClass);
1090 static Identifier FindCtxClass(ClassDefinition _class, int line, int charPos)
1092 Identifier idResult;
1093 bool insideSomething = false;
1094 if(_class.definitions)
1097 for(def = _class.definitions->first; def; def = def.next)
1099 if(def.type == defaultPropertiesClassDef ? InsideIncl(&def.loc, line, charPos) : Inside(&def.loc, line, charPos) )
1101 if(def.type != defaultPropertiesClassDef)
1102 insideSomething = true;
1104 idResult = FindCtxClassDef(def, line, charPos);
1108 insideSomething = false;
1112 if(!insideSomething && line > _class.blockStart.start.line || (line == _class.blockStart.start.line && charPos >= _class.blockStart.start.charPos) )
1114 insideClass = _class.symbol.registered;
1120 Identifier FindCtxTree(OldList ast, int line, int charPos)
1122 Identifier idResult;
1127 FreeExpression(ctxInsideExp);
1128 allocedDummyExp = false;
1132 ctxInsideExp = null;
1134 insideFunction = null;
1135 insideInstance = false;
1136 isAfterEqual = false;
1140 for(external = ast.first; external; external = external.next)
1142 switch(external.type)
1144 case functionExternal:
1145 if(Inside(&external.loc, line, charPos))
1147 idResult = FindCtxFunction(external.function, line, charPos);
1149 return (idResult == (void *)-1 || idResult == (void *)-2) ? null : idResult;
1152 case declarationExternal:
1153 if(InsideIncl(&external.loc, line, charPos))
1155 idResult = FindCtxDeclaration(external.declaration, line, charPos);
1157 return (idResult == (void *)-1 || idResult == (void *)-2) ? null : idResult;
1161 if(Inside(&external._class.loc, line, charPos))
1163 currentClass = external._class.symbol.registered;
1164 idResult = FindCtxClass(external._class, line, charPos);
1165 currentClass = null;
1167 return (idResult == (void *)-1 || idResult == (void *)-2) ? null : idResult;
1176 void FindCtx_Terminate()
1180 FreeExpression(ctxInsideExp);
1181 allocedDummyExp = false;