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); } }
/// <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); } }
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); } }