public void EmitAssemblyEntryPoint (AssemblyDefinition assembly, MethodDefinition entryMethod, MethodSignature signature) { Formatter.WriteRaw("JSIL.SetEntryPoint"); Formatter.LPar(); Formatter.AssemblyReference(assembly); Formatter.Comma(); var context = new TypeReferenceContext(); Formatter.TypeReference(entryMethod.DeclaringType, context); Formatter.Comma(); Formatter.Value(entryMethod.Name); Formatter.Comma(); Formatter.MethodSignature( entryMethod, signature, context ); Formatter.RPar(); Formatter.Semicolon(true); Formatter.NewLine(); }
/// <summary> /// Writes an interface member reference to the output. /// </summary> public void WriteInterfaceMemberToOutput( JavascriptFormatter output, Compiler.Extensibility.IAstEmitter astEmitter, JSFunctionExpression enclosingFunction, JSMethod jsMethod, JSExpression method, TypeReferenceContext referenceContext ) { int index; CachedInterfaceMemberRecord record; GenericParameter[] rewrittenGenericParameters = null; if (LocalCachingEnabled && PreferLocalCacheForGenericInterfaceMethodSignatures) { record = new CachedInterfaceMemberRecord(jsMethod.Reference.DeclaringType, jsMethod.Identifier); } else { var rewritten = GenericTypesRewriter.Normalized(jsMethod.Reference.DeclaringType); record = new CachedInterfaceMemberRecord(rewritten.CacheRecord, jsMethod.Identifier, rewritten.RewritedGenericParameters.Length); rewrittenGenericParameters = rewritten.RewritedGenericParameters; } 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(); astEmitter.Emit(method); } else { output.WriteRaw("$IM{0:X2}", index); output.LPar(); if (rewrittenGenericParameters != null) { output.CommaSeparatedList(rewrittenGenericParameters, referenceContext); } output.RPar(); } }
/// <summary> /// Writes a method signature to the output. /// </summary> public void WriteSignatureToOutput( JavascriptFormatter output, JSFunctionExpression enclosingFunction, MethodReference methodReference, MethodSignature methodSignature, TypeReferenceContext referenceContext, bool forConstructor ) { int index; CachedSignatureRecord cacheRecord; GenericParameter[] rewrittenGenericParameters = null; if (LocalCachingEnabled && PreferLocalCacheForGenericMethodSignatures) { cacheRecord = new CachedSignatureRecord(methodReference, GenericTypesRewriter.NormalizedConstructorSignature(methodReference, methodSignature, forConstructor), forConstructor); } else { RewritedCacheRecord <MethodSignature> rewritten = GenericTypesRewriter.Normalized(methodReference, methodSignature, forConstructor); cacheRecord = new CachedSignatureRecord(methodReference, rewritten.CacheRecord, forConstructor, rewritten.RewritedGenericParameters.Length); rewrittenGenericParameters = rewritten.RewritedGenericParameters; } if ((enclosingFunction.Method != null) && (enclosingFunction.Method.Method != null)) { var functionIdentifier = enclosingFunction.Method.Method.Identifier; CacheSet localSignatureSet; if (LocalCachedSets.TryGetValue(functionIdentifier, out localSignatureSet)) { if (localSignatureSet.Signatures.TryGetValue(cacheRecord, out index)) { output.WriteRaw("$s{0:X2}", index); return; } } } if (!Global.Signatures.TryGetValue(cacheRecord, out index)) { output.Signature(methodReference, methodSignature, referenceContext, forConstructor, true); } else { output.WriteRaw("$S{0:X2}", index); output.LPar(); if (rewrittenGenericParameters != null) { output.CommaSeparatedList(rewrittenGenericParameters, referenceContext); } output.RPar(); } }
public TypeReference TryConvert(Type propertyType, TypeReferenceContext context) { if (propertyType.IsGenericParameter && context.GenericParameters != null) { var genericParam = context.GenericParameters.FirstOrDefault(gp => gp.Name == propertyType.Name); return(new GenericType { GenericParameter = genericParam }); } return(null); }
public TypeReference TryConvert(Type propertyType, TypeReferenceContext context) { var enumerable = (from @interface in propertyType.GetInterfaces() where @interface.GetTypeInfo().IsGenericType && typeof(IEnumerable <>) == @interface.GetGenericTypeDefinition() select @interface).FirstOrDefault(); if (enumerable == null) { return(null); } var type = _typeReferenceMapper.GetTypeReference(enumerable.GenericTypeArguments[0], context); if (type == null) { return(null); } return(new ArrayType(type)); }
/// <summary> /// Writes an interface member reference to the output. /// </summary> public void WriteInterfaceMemberToOutput( JavascriptFormatter output, Compiler.Extensibility.IAstEmitter astEmitter, 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(); astEmitter.Emit(method); } else { output.WriteRaw("$IM{0:X2}()", index); } }
public void EmitInterfaceDefinition ( DecompilerContext context, IAstEmitter astEmitter, TypeDefinition iface ) { var typeInfo = TypeInfo.GetTypeInformation(iface); Formatter.Identifier("JSIL.MakeInterface", EscapingMode.None); Formatter.LPar(); Formatter.NewLine(); Formatter.Value(Util.DemangleCecilTypeName(typeInfo.FullName)); Formatter.Comma(); Formatter.Value(iface.IsPublic); Formatter.Comma(); Formatter.OpenBracket(); WriteGenericParameterNames(iface.GenericParameters); Formatter.CloseBracket(); Formatter.Comma(); Formatter.OpenFunction(null, (f) => f.Identifier("$") ); var refContext = new TypeReferenceContext { EnclosingType = iface, DefiningType = iface }; bool isFirst = true; foreach (var methodGroup in iface.Methods.GroupBy(md => md.Name)) { foreach (var m in methodGroup) { if (Translator.ShouldSkipMember(m)) continue; var methodInfo = TypeInfo.GetMethod(m); if ((methodInfo == null) || methodInfo.IsIgnored) continue; Formatter.Identifier("$", EscapingMode.None); Formatter.Dot(); Formatter.Identifier("Method", EscapingMode.None); Formatter.LPar(); var renamedName = methodInfo.Name; var offset = renamedName.IndexOf("`"); if (offset > 0) renamedName = renamedName.Substring(0, offset); if (renamedName != m.Name) { Formatter.WriteRaw("{OriginalName: "); Formatter.Value(m.Name); Formatter.WriteRaw("}"); } else { Formatter.WriteRaw("{}"); } Formatter.Comma(); Formatter.Value(Util.EscapeIdentifier(renamedName, EscapingMode.String)); Formatter.Comma(); Formatter.MethodSignature(m, methodInfo.Signature, refContext); Formatter.RPar(); Formatter.Semicolon(true); } } foreach (var p in iface.Properties) { if (Translator.ShouldSkipMember(p)) continue; var propertyInfo = TypeInfo.GetProperty(p); if ((propertyInfo != null) && propertyInfo.IsIgnored) continue; Formatter.Identifier("$", EscapingMode.None); Formatter.Dot(); Formatter.Identifier("Property", EscapingMode.None); Formatter.LPar(); Formatter.WriteRaw("{}"); Formatter.Comma(); Formatter.Value(Util.EscapeIdentifier(p.Name, EscapingMode.String)); Formatter.RPar(); Formatter.Semicolon(true); } Formatter.CloseBrace(false); Formatter.Comma(); refContext = new TypeReferenceContext { EnclosingType = iface.DeclaringType, DefiningType = iface }; Formatter.OpenBracket(); foreach (var i in iface.Interfaces) { if (Translator.ShouldSkipMember(i)) { continue; } if (!isFirst) { Formatter.Comma(); } Formatter.TypeReference(i, refContext); isFirst = false; } Formatter.CloseBracket(); Formatter.RPar(); EmitCustomAttributes(context, iface, iface, astEmitter); Formatter.Semicolon(); Formatter.NewLine(); }
public void EmitInterfaceDefinition( DecompilerContext context, IAstEmitter astEmitter, TypeDefinition iface ) { Formatter.Identifier("JSIL.MakeInterface", EscapingMode.None); Formatter.LPar(); Formatter.NewLine(); Formatter.Value(Util.DemangleCecilTypeName(iface.FullName)); Formatter.Comma(); Formatter.Value(iface.IsPublic); Formatter.Comma(); Formatter.OpenBracket(); WriteGenericParameterNames(iface.GenericParameters); Formatter.CloseBracket(); Formatter.Comma(); Formatter.OpenFunction(null, (f) => f.Identifier("$") ); var refContext = new TypeReferenceContext { EnclosingType = iface, DefiningType = iface }; bool isFirst = true; foreach (var methodGroup in iface.Methods.GroupBy(md => md.Name)) { foreach (var m in methodGroup) { if (Translator.ShouldSkipMember(m)) { continue; } var methodInfo = _TypeInfoProvider.GetMethod(m); if ((methodInfo == null) || methodInfo.IsIgnored) { continue; } Formatter.Identifier("$", EscapingMode.None); Formatter.Dot(); Formatter.Identifier("Method", EscapingMode.None); Formatter.LPar(); Formatter.WriteRaw("{}"); Formatter.Comma(); Formatter.Value(Util.EscapeIdentifier(m.Name, EscapingMode.String)); Formatter.Comma(); Formatter.MethodSignature(m, methodInfo.Signature, refContext); Formatter.RPar(); Formatter.Semicolon(true); } } foreach (var p in iface.Properties) { var propertyInfo = _TypeInfoProvider.GetProperty(p); if ((propertyInfo != null) && propertyInfo.IsIgnored) { continue; } Formatter.Identifier("$", EscapingMode.None); Formatter.Dot(); Formatter.Identifier("Property", EscapingMode.None); Formatter.LPar(); Formatter.WriteRaw("{}"); Formatter.Comma(); Formatter.Value(Util.EscapeIdentifier(p.Name, EscapingMode.String)); Formatter.RPar(); Formatter.Semicolon(true); } Formatter.CloseBrace(false); Formatter.Comma(); refContext = new TypeReferenceContext { EnclosingType = iface.DeclaringType, DefiningType = iface }; Formatter.OpenBracket(); foreach (var i in iface.Interfaces) { if (!isFirst) { Formatter.Comma(); } Formatter.TypeReference(i, refContext); isFirst = false; } Formatter.CloseBracket(); Formatter.RPar(); EmitCustomAttributes(context, iface, iface, astEmitter); Formatter.Semicolon(); Formatter.NewLine(); }