Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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));
        }
Ejemplo n.º 3
0
        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> >());
        }
Ejemplo n.º 4
0
            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));
            }