public JsExpression GetMember(IMember member, IRuntimeContext context) { var owner = member is IMethod && ((IMethod)member).IsAccessor ? ((IMethod)member).AccessorOwner : null; int index = FindIndexInReflectableMembers(owner ?? member); if (index >= 0) { JsExpression result = JsExpression.Index( JsExpression.Member( JsExpression.Member( TypeOf(member.DeclaringType, context), "__metadata"), "members"), JsExpression.Number(index)); if (owner != null) { if (owner is IProperty) { if (ReferenceEquals(member, ((IProperty)owner).Getter)) { result = JsExpression.MemberAccess(result, "getter"); } else if (ReferenceEquals(member, ((IProperty)owner).Setter)) { result = JsExpression.MemberAccess(result, "setter"); } else { throw new ArgumentException("Invalid member " + member); } } else if (owner is IEvent) { if (ReferenceEquals(member, ((IEvent)owner).AddAccessor)) { result = JsExpression.MemberAccess(result, "adder"); } else if (ReferenceEquals(member, ((IEvent)owner).RemoveAccessor)) { result = JsExpression.MemberAccess(result, "remover"); } else { throw new ArgumentException("Invalid member " + member); } } else { throw new ArgumentException("Invalid owner " + owner); } } return(result); } else { return(MetadataUtils.ConstructMemberInfo(member, _compilation, _metadataImporter, _namer, this, _errorReporter, t => TypeOf(t, context), includeDeclaringType: true)); } }
private JsExpression GetMetadataDescriptor(ITypeDefinition type, bool isGenericSpecialization) { var properties = new List <JsObjectLiteralProperty>(); var scriptableAttributes = MetadataUtils.GetScriptableAttributes(type.Attributes, _metadataImporter).ToList(); if (scriptableAttributes.Count != 0) { properties.Add(new JsObjectLiteralProperty("attr", JsExpression.ArrayLiteral(scriptableAttributes.Select(a => MetadataUtils.ConstructAttribute(a, type, _compilation, _metadataImporter, _namer, _runtimeLibrary, _errorReporter))))); } if (type.Kind == TypeKind.Interface && MetadataUtils.IsJsGeneric(type, _metadataImporter) && type.TypeParameters != null && type.TypeParameters.Any(typeParameter => typeParameter.Variance != VarianceModifier.Invariant)) { properties.Add(new JsObjectLiteralProperty("variance", JsExpression.ArrayLiteral(type.TypeParameters.Select(typeParameter => JsExpression.Number(ConvertVarianceToInt(typeParameter.Variance)))))); } if (type.Kind == TypeKind.Class || type.Kind == TypeKind.Struct || type.Kind == TypeKind.Interface) { var members = type.Members.Where(m => MetadataUtils.IsReflectable(m, _attributeStore)) .OrderBy(m => m, MemberOrderer.Instance) .Select(m => { _errorReporter.Region = m.Region; return(MetadataUtils.ConstructMemberInfo(m, _compilation, _metadataImporter, _namer, _runtimeLibrary, _errorReporter, t => _runtimeLibrary.InstantiateType(t, isGenericSpecialization ? _genericSpecializationReflectionRuntimeContext : _defaultReflectionRuntimeContext), includeDeclaringType: false)); }) .ToList(); if (members.Count > 0) { properties.Add(new JsObjectLiteralProperty("members", JsExpression.ArrayLiteral(members))); } var aua = _attributeStore.AttributesFor(type).GetAttribute <AttributeUsageAttribute>(); if (aua != null) { if (!aua.Inherited) { properties.Add(new JsObjectLiteralProperty("attrNoInherit", JsExpression.True)); } if (aua.AllowMultiple) { properties.Add(new JsObjectLiteralProperty("attrAllowMultiple", JsExpression.True)); } } } if (type.Kind == TypeKind.Enum && _attributeStore.AttributesFor(type).HasAttribute <FlagsAttribute>()) { properties.Add(new JsObjectLiteralProperty("enumFlags", JsExpression.True)); } return(properties.Count > 0 ? JsExpression.ObjectLiteral(properties) : null); }
private JsExpression GetMetadataDescriptor(ITypeDefinition type, bool isGenericSpecialization) { var properties = new List <JsObjectLiteralProperty>(); var scriptableAttributes = type.Attributes.Where(a => !a.IsConditionallyRemoved && _metadataImporter.GetTypeSemantics(a.AttributeType.GetDefinition()).Type == TypeScriptSemantics.ImplType.NormalType).ToList(); if (scriptableAttributes.Count != 0) { properties.Add(new JsObjectLiteralProperty("attr", JsExpression.ArrayLiteral(scriptableAttributes.Select(a => MetadataUtils.ConstructAttribute(a, type, _compilation, _metadataImporter, _namer, _runtimeLibrary, _errorReporter))))); } if (type.Kind == TypeKind.Class) { var members = type.Members.Where(m => MetadataUtils.IsReflectable(m, _metadataImporter)) .OrderBy(m => m, MemberOrderer.Instance) .Select(m => { _errorReporter.Region = m.Region; return(MetadataUtils.ConstructMemberInfo(m, _compilation, _metadataImporter, _namer, _runtimeLibrary, _errorReporter, t => _runtimeLibrary.InstantiateType(t, isGenericSpecialization ? _genericSpecializationReflectionRuntimeContext : _defaultReflectionRuntimeContext), includeDeclaringType: false)); }) .ToList(); if (members.Count > 0) { properties.Add(new JsObjectLiteralProperty("members", JsExpression.ArrayLiteral(members))); } var aua = AttributeReader.ReadAttribute <AttributeUsageAttribute>(type); if (aua != null) { if (!aua.Inherited) { properties.Add(new JsObjectLiteralProperty("attrNoInherit", JsExpression.True)); } if (aua.AllowMultiple) { properties.Add(new JsObjectLiteralProperty("attrAllowMultiple", JsExpression.True)); } } } if (type.Kind == TypeKind.Enum && AttributeReader.HasAttribute <FlagsAttribute>(type)) { properties.Add(new JsObjectLiteralProperty("enumFlags", JsExpression.True)); } return(properties.Count > 0 ? JsExpression.ObjectLiteral(properties) : null); }