Beispiel #1
0
        private void CacheInterfaceMember(TypeReference declaringType, string memberName)
        {
            var cacheLocally = false;

            if (TypeUtil.IsOpenType(declaringType))
            {
                cacheLocally = true;
            }

            var unexpandedType = declaringType;

            if (!TypeUtil.ExpandPositionalGenericParameters(unexpandedType, out declaringType))
            {
                declaringType = unexpandedType;
            }

            var set    = GetCacheSet(cacheLocally);
            var record = new CachedInterfaceMemberRecord(declaringType, memberName);

            if (!set.InterfaceMembers.ContainsKey(record))
            {
                set.InterfaceMembers.Add(record, set.InterfaceMembers.Count);
            }
        }
Beispiel #2
0
        /// <summary>
        /// Writes an interface member reference to the output.
        /// </summary>
        public void WriteInterfaceMemberToOutput(
            JavascriptFormatter output, JavascriptAstEmitter emitter, JSFunctionExpression enclosingFunction,
            JSMethod jsMethod, JSExpression method,
            TypeReferenceContext referenceContext
            )
        {
            int index;
            var record = new CachedInterfaceMemberRecord(jsMethod.Reference.DeclaringType, jsMethod.Identifier);

            if ((enclosingFunction.Method != null) || (enclosingFunction.Method.Method != null))
            {
                var      functionIdentifier = enclosingFunction.Method.Method.Identifier;
                CacheSet localSignatureSet;

                if (LocalCachedSets.TryGetValue(functionIdentifier, out localSignatureSet))
                {
                    if (localSignatureSet.InterfaceMembers.TryGetValue(record, out index))
                    {
                        output.WriteRaw("$im{0:X2}", index);

                        return;
                    }
                }
            }

            if (!Global.InterfaceMembers.TryGetValue(record, out index))
            {
                output.Identifier(jsMethod.Reference.DeclaringType, referenceContext, false);
                output.Dot();
                emitter.Visit(method);
            }
            else
            {
                output.WriteRaw("$IM{0:X2}()", index);
            }
        }
Beispiel #3
0
        private void CacheInterfaceMember(TypeReference declaringType, string memberName)
        {
            var cacheLocally = false;
            var originalType = declaringType;

            var unexpandedType = declaringType;

            if (!TypeUtil.ExpandPositionalGenericParameters(unexpandedType, out declaringType))
            {
                declaringType = unexpandedType;
            }

            CachedInterfaceMemberRecord record;

            if (LocalCachingEnabled && PreferLocalCacheForGenericInterfaceMethodSignatures)
            {
                if (TypeUtil.IsOpenType(declaringType))
                {
                    cacheLocally = true;
                }
                record = new CachedInterfaceMemberRecord(declaringType, memberName);
            }
            else
            {
                var rewritten = GenericTypesRewriter.Normalized(declaringType);
                record = new CachedInterfaceMemberRecord(rewritten.CacheRecord, memberName,
                                                         rewritten.RewritedGenericParameters.Length);
            }

            var set = GetCacheSet(cacheLocally);

            if (!set.InterfaceMembers.ContainsKey(record))
            {
                set.InterfaceMembers.Add(record, set.InterfaceMembers.Count);
            }
        }