public JsExpression TypeIs(JsExpression expression, IType sourceType, IType targetType, IRuntimeContext context) { var importedCheck = CompileImportedTypeCheckCode(targetType, ref expression, context, true); if (importedCheck != null) { return(importedCheck); } var def = targetType.GetDefinition(); if (def != null && (!MetadataUtils.DoesTypeObeyTypeSystem(def) || (MetadataUtils.IsSerializable(def) && string.IsNullOrEmpty(MetadataUtils.GetSerializableTypeCheckCode(def))))) { _errorReporter.Message(Messages._7701, targetType.FullName); return(JsExpression.Null); } var jsTarget = GetCastTarget(sourceType, targetType, context); if (jsTarget == null || IsSystemObjectReference(jsTarget)) { return(ReferenceNotEquals(expression, JsExpression.Null, context)); } return(JsExpression.Invocation(JsExpression.Member(CreateTypeReferenceExpression(_systemScript), "isInstanceOfType"), expression, jsTarget)); }
private JsExpression GetTypeDefinitionScriptType(ITypeDefinition type, TypeContext context) { if (context != TypeContext.GetScriptType && context != TypeContext.TypeOf && !MetadataUtils.DoesTypeObeyTypeSystem(type)) { return(CreateTypeReferenceExpression(KnownTypeReference.Object)); } else if (MetadataUtils.IsSerializable(type) && !MetadataUtils.DoesTypeObeyTypeSystem(type)) { return(CreateTypeReferenceExpression(KnownTypeReference.Object)); } else { return(CreateTypeReferenceExpression(type)); } }
public JsExpression TryDowncast(JsExpression expression, IType sourceType, IType targetType, IRuntimeContext context) { JsExpression jsTarget = CompileImportedTypeCheckCode(targetType, ref expression, context, false); if (jsTarget == null) { var def = targetType.GetDefinition(); if (def != null && (!MetadataUtils.DoesTypeObeyTypeSystem(def) || (MetadataUtils.IsSerializable(def) && string.IsNullOrEmpty(MetadataUtils.GetSerializableTypeCheckCode(def))))) { _errorReporter.Message(Messages._7702, targetType.FullName); return(JsExpression.Null); } jsTarget = GetCastTarget(sourceType, targetType, context); } if (jsTarget == null || IsSystemObjectReference(jsTarget)) { return(expression); } return(JsExpression.Invocation(JsExpression.Member(CreateTypeReferenceExpression(_systemScript), "safeCast"), expression, jsTarget)); }
private JsExpression GetTypeDefinitionScriptType(ITypeDefinition type, TypeContext context) { var sem = _metadataImporter.GetTypeSemantics(type); if (sem.Type == TypeScriptSemantics.ImplType.NotUsableFromScript) { _errorReporter.Message(Saltarelle.Compiler.Messages._7522, type.FullName); return(JsExpression.Null); } if (context != TypeContext.GetScriptType && context != TypeContext.TypeOf && !MetadataUtils.DoesTypeObeyTypeSystem(type, _attributeStore)) { return(CreateTypeReferenceExpression(KnownTypeReference.Object)); } else if (MetadataUtils.IsSerializable(type, _attributeStore) && !MetadataUtils.DoesTypeObeyTypeSystem(type, _attributeStore)) { return(CreateTypeReferenceExpression(KnownTypeReference.Object)); } else { return(CreateTypeReferenceExpression(type)); } }
private JsExpression GetCastTarget(IType type, IRuntimeContext context) { if (type.Kind == TypeKind.Enum) { return(CreateTypeReferenceExpression(type.GetDefinition().EnumUnderlyingType.GetDefinition())); } var def = type.GetDefinition(); if (def != null) { if (MetadataUtils.IsSerializable(def) && string.IsNullOrEmpty(MetadataUtils.GetSerializableTypeCheckCode(def))) { return(null); } if (!MetadataUtils.DoesTypeObeyTypeSystem(def)) { return(null); } } return(GetScriptType(type, TypeContext.GetScriptType, context)); }
private JsExpression GetCastTarget(IType type, IRuntimeContext context) { var def = type.GetDefinition(); if (type.Kind == TypeKind.Enum) { var underlying = MetadataUtils.IsNamedValues(def, _attributeStore) ? _compilation.FindType(KnownTypeCode.String) : def.EnumUnderlyingType; return(CreateTypeReferenceExpression(underlying.GetDefinition())); } if (def != null) { if (MetadataUtils.IsSerializable(def, _attributeStore) && string.IsNullOrEmpty(MetadataUtils.GetSerializableTypeCheckCode(def, _attributeStore))) { return(null); } if (!MetadataUtils.DoesTypeObeyTypeSystem(def, _attributeStore)) { return(null); } } return(GetScriptType(type, TypeContext.GetScriptType, context)); }
private IEnumerable <JsExpression> GetImplementedInterfaces(ITypeDefinition type) { return(type.GetAllBaseTypes().Where(t => t.Kind == TypeKind.Interface && !t.Equals(type) && MetadataUtils.DoesTypeObeyTypeSystem(t.GetDefinition())).Select(t => _runtimeLibrary.InstantiateType(t, new DefaultRuntimeContext(type, _metadataImporter, _errorReporter, _namer)))); }