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);
        }
示例#2
0
        protected override Entity RestoreImplementation <TNode>(
            GraphStructuredProgram <TNode> program,
            ResolvedMethod <TNode> method,
            Entity entity)
        {
            var objectMethodReference = (ResolvedObjectMethodReference <TNode>)entity;

            var restoredOwner = (SecondaryEntity)Restore(program, method, objectMethodReference.OwningObject);
            var restored      = new ResolvedObjectMethodReference <TNode>(restoredOwner, objectMethodReference.MethodId)
            {
                FindClassMethod = program.FindMethodById
            };

            method.StoreAdditionalVariable(restored);

            return(restored);
        }