From b706a2f30ad6cfd55e12cdc76428247525168e8c Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 21 Apr 2020 22:01:58 +0100 Subject: [PATCH] tp exn messages (#9009) --- src/fsharp/ExtensionTyping.fs | 25 ++++++++++++++++--- src/fsharp/FSComp.txt | 5 +++- src/utils/CompilerLocationUtils.fs | 4 +-- .../ProviderAttributeErrorConsume.bslpp | 2 +- 4 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/fsharp/ExtensionTyping.fs b/src/fsharp/ExtensionTyping.fs index 141e2cd35..60f1b32a4 100644 --- a/src/fsharp/ExtensionTyping.fs +++ b/src/fsharp/ExtensionTyping.fs @@ -38,8 +38,17 @@ module internal ExtensionTyping = let GetTypeProviderImplementationTypes (runTimeAssemblyFileName, designTimeAssemblyNameString, m:range, compilerToolPaths:string list) = // Report an error, blaming the particular type provider component - let raiseError (e: exn) = - raise (TypeProviderError(FSComp.SR.etProviderHasWrongDesignerAssembly(typeof.Name, designTimeAssemblyNameString, e.Message), runTimeAssemblyFileName, m)) + let raiseError designTimeAssemblyPathOpt (e: exn) = + let attrName = typeof.Name + let exnTypeName = e.GetType().FullName + let exnMsg = e.Message + match designTimeAssemblyPathOpt with + | None -> + let msg = FSComp.SR.etProviderHasWrongDesignerAssemblyNoPath(attrName, designTimeAssemblyNameString, exnTypeName, exnMsg) + raise (TypeProviderError(msg, runTimeAssemblyFileName, m)) + | Some designTimeAssemblyPath -> + let msg = FSComp.SR.etProviderHasWrongDesignerAssembly(attrName, designTimeAssemblyNameString, designTimeAssemblyPath, exnTypeName, exnMsg) + raise (TypeProviderError(msg, runTimeAssemblyFileName, m)) let designTimeAssemblyOpt = getTypeProviderAssembly (runTimeAssemblyFileName, designTimeAssemblyNameString, compilerToolPaths, raiseError) @@ -54,7 +63,17 @@ module internal ExtensionTyping = yield t ] filtered with e -> - raiseError e + let folder = System.IO.Path.GetDirectoryName loadedDesignTimeAssembly.Location + let exnTypeName = e.GetType().FullName + let exnMsg = e.Message + match e with + | :? System.IO.FileLoadException -> + let msg = FSComp.SR.etProviderHasDesignerAssemblyDependency(designTimeAssemblyNameString, folder, exnTypeName, exnMsg) + raise (TypeProviderError(msg, runTimeAssemblyFileName, m)) + + | _ -> + let msg = FSComp.SR.etProviderHasDesignerAssemblyException(designTimeAssemblyNameString, folder, exnTypeName, exnMsg) + raise (TypeProviderError(msg, runTimeAssemblyFileName, m)) | None -> [] let StripException (e: exn) = diff --git a/src/fsharp/FSComp.txt b/src/fsharp/FSComp.txt index bbcd42bf9..162484371 100644 --- a/src/fsharp/FSComp.txt +++ b/src/fsharp/FSComp.txt @@ -1178,7 +1178,8 @@ fscTooManyErrors,"Exiting - too many errors" 3028,etProvidedTypeHasUnexpectedName,"Expected provided type named '%s' but provided type has 'Name' with value '%s'" 3029,etEventNoAdd,"Event '%s' on provided type '%s' has no value from GetAddMethod()" 3030,etEventNoRemove,"Event '%s' on provided type '%s' has no value from GetRemoveMethod()" -3031,etProviderHasWrongDesignerAssembly,"Assembly attribute '%s' refers to a designer assembly '%s' which cannot be loaded or doesn't exist. %s" +3031,etProviderHasWrongDesignerAssemblyNoPath,"Assembly attribute '%s' refers to a designer assembly '%s' which cannot be loaded or doesn't exist. The exception reported was: %s - %s" +3031,etProviderHasWrongDesignerAssembly,"Assembly attribute '%s' refers to a designer assembly '%s' which cannot be loaded from path '%s'. The exception reported was: %s - %s" 3032,etProviderDoesNotHaveValidConstructor,"The type provider does not have a valid constructor. A constructor taking either no arguments or one argument of type 'TypeProviderConfig' was expected." 3033,etProviderError,"The type provider '%s' reported an error: %s" 3034,etIncorrectParameterExpression,"The type provider '%s' used an invalid parameter in the ParameterExpression: %s" @@ -1192,6 +1193,8 @@ fscTooManyErrors,"Exiting - too many errors" 3045,etInvalidStaticArgument,"Invalid static argument to provided type. Expected an argument of kind '%s'." 3046,etErrorApplyingStaticArgumentsToType,"An error occured applying the static arguments to a provided type" 3047,etUnknownStaticArgumentKind,"Unknown static argument kind '%s' when resolving a reference to a provided type or method '%s'" +3048,etProviderHasDesignerAssemblyDependency,"The type provider designer assembly '%s' could not be loaded from folder '%s' because a dependency was missing or could not loaded. All dependencies of the type provider designer assembly must be located in the same folder as that assembly. The exception reported was: %s - %s" +3049,etProviderHasDesignerAssemblyException,"The type provider designer assembly '%s' could not be loaded from folder '%s'. The exception reported was: %s - %s" invalidNamespaceForProvidedType,"invalid namespace for provided type" invalidFullNameForProvidedType,"invalid full name for provided type" #3050,etGenerateAttributeRequiresInternal,"The 'Generate' attribute must be used with a type definition with 'internal' visibility" diff --git a/src/utils/CompilerLocationUtils.fs b/src/utils/CompilerLocationUtils.fs index 694fb3793..0e8934c72 100644 --- a/src/utils/CompilerLocationUtils.fs +++ b/src/utils/CompilerLocationUtils.fs @@ -298,7 +298,7 @@ module internal FSharpEnvironment = try Some (Assembly.UnsafeLoadFrom designTimeAssemblyPath) with e -> - raiseError e + raiseError (Some designTimeAssemblyPath) e let rec searchParentDirChain path assemblyName = seq { @@ -345,7 +345,7 @@ module internal FSharpEnvironment = let name = AssemblyName designTimeAssemblyName Some (Assembly.Load (name)) with e -> - raiseError e + raiseError None e let getCompilerToolsDesignTimeAssemblyPaths compilerToolPaths = searchToolPaths None compilerToolPaths diff --git a/tests/fsharp/typeProviders/negTests/ProviderAttributeErrorConsume.bslpp b/tests/fsharp/typeProviders/negTests/ProviderAttributeErrorConsume.bslpp index 59ee16d38..383f4a608 100644 --- a/tests/fsharp/typeProviders/negTests/ProviderAttributeErrorConsume.bslpp +++ b/tests/fsharp/typeProviders/negTests/ProviderAttributeErrorConsume.bslpp @@ -1,4 +1,4 @@ -providerAttributeErrorConsume.fsx(1,1,1,48): parse error FS3031: The type provider '' reported an error: Assembly attribute 'TypeProviderAssemblyAttribute' refers to a designer assembly 'Invalid.Assembly.Name' which cannot be loaded or doesn't exist. Could not load file or assembly 'Invalid.Assembly.Name.dll' or one of its dependencies. The system cannot find the file specified. +providerAttributeErrorConsume.fsx(1,1,1,48): parse error FS3031: The type provider '' reported an error: Assembly attribute 'TypeProviderAssemblyAttribute' refers to a designer assembly 'Invalid.Assembly.Name' which cannot be loaded or doesn't exist. The exception reported was: Could not load file or assembly 'Invalid.Assembly.Name.dll' or one of its dependencies. The system cannot find the file specified. providerAttributeErrorConsume.fsx(1,1,1,48): parse error FS3005: Referenced assembly '' has assembly level attribute 'Microsoft.FSharp.Core.CompilerServices.TypeProviderAssemblyAttribute' but no public type provider classes were found -- GitLab