diff --git a/src/fsharp/ExtensionTyping.fs b/src/fsharp/ExtensionTyping.fs index 141e2cd35f2f6cb13facf818894dd9a7059c52fa..60f1b32a4d79a7495ec5e17463dace8a01f0cbf5 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 bbcd42bf9f728c34f0c3d3f2b3bb37baef70480b..162484371420d9bfd338860adc05558c043ac53a 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 694fb3793c63003f54e473f1809f32e5408a4317..0e8934c72b1977f8976f028d8a40f6ac2e458335 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 59ee16d380b50c657351bbb0aaf6740d34b59280..383f4a6082474cc3e52037e1a243a81ffd7cf045 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