protected override Entity InternalResolve <TNode>( GraphStructuredProgram <TNode> program, ResolvedMethod <TNode> sourceMethod, Reference reference) { var classMethodReference = (ClassMethodReference)reference; var resolvedOwner = Resolve(program, sourceMethod, classMethodReference.Owner); if (resolvedOwner is ResolvedClassId owningClassId) { var owner = program.FindClassById(owningClassId); var method = program.GetOrCreateMethod(owner, classMethodReference.Name); var methodId = program.GetOrCreateMethodId(classMethodReference.Name); var resolvedReference = new ResolvedClassMethodReference <TNode>(owningClassId, methodId); resolvedReference.Method = method; return(resolvedReference); } if (resolvedOwner is SecondaryEntity owningEntity) { var methodId = program.GetOrCreateMethodId(classMethodReference.Name); var resolvedReference = new ResolvedObjectMethodReference <TNode>(owningEntity, methodId); resolvedReference.FindClassMethod = program.FindMethodById; sourceMethod.StoreAdditionalVariable(resolvedReference); return(resolvedReference); } return(null); }
protected override Entity RestoreImplementation <TNode>( GraphStructuredProgram <TNode> program, ResolvedMethod <TNode> method, Entity entity) { var classField = (ResolvedClassField)entity; var clazz = program.FindClassById(classField.ClassId); return(clazz.GetOrCreateField(classField.VariableId)); }
protected IEnumerable <IInvokable <Node> > CollectPossibleTargets(Entity reference, ResolvedMethodId targetId) { if (reference is ResolvedClassId staticClass) { IEnumerable <IInvokable <Node> > Iterator(ResolvedMethod <Node> method) { if (method != null) { yield return(method); } } var resolvedMethod = Program.FindClassById(staticClass).FindMethodInFullHierarchy(targetId); return(Iterator(resolvedMethod)); } if (reference is SecondaryEntity secondary) { return(secondary.CollectedPrimaries.Select( type => { if (type is ResolvedClassId classId) { var target = Program .FindClassById(classId) .FindMethodInFullHierarchy(targetId); return (IInvokable <Node>)target; } if (type is IInvokable <Node> invokable) { return invokable; } return null; }).Where(target => target != null)); } return(Enumerable.Empty <IInvokable <Node> >()); }
private IEnumerable <IInvokable <Node> > CollectInstances(SecondaryEntity reference, ResolvedMethodId targetId) { return(reference.CollectedPrimaries.Select( type => { if (type is ResolvedClassId classId) { var target = myProcessingProgram .FindClassById(classId) .FindMethodInFullHierarchy(targetId); return (IInvokable <Node>)target; } if (type is IInvokable <Node> invocable) { return invocable; } return null; }).Where(target => target != null)); }