diff --git a/build-everything.proj b/build-everything.proj index c6e8af86a08..67feacf6273 100644 --- a/build-everything.proj +++ b/build-everything.proj @@ -35,6 +35,10 @@ + + + + diff --git a/build.cmd b/build.cmd index 9dbba10d39c..288201e2f9c 100644 --- a/build.cmd +++ b/build.cmd @@ -60,6 +60,7 @@ set BUILD_NET40=0 set BUILD_NET40_FSHARP_CORE=0 set BUILD_CORECLR=0 set BUILD_VS=0 +set BUILD_FCS=0 set BUILD_CONFIG=release set BUILD_CONFIG_LOWERCASE=release set BUILD_DIAG= @@ -152,6 +153,11 @@ if /i "%ARG%" == "vs" ( set BUILD_VS=1 ) +if /i "%ARG%" == "fcs" ( + set _autoselect=0 + set BUILD_FCS=1 +) + if /i "%ARG%" == "vstest" ( set TEST_VS_IDEUNIT_SUITE=1 ) @@ -166,6 +172,7 @@ if /i "%ARG%" == "all" ( set BUILD_NET40=1 set BUILD_CORECLR=1 set BUILD_VS=1 + set BUILD_FCS=1 set BUILD_SETUP=%FSC_BUILD_SETUP% set BUILD_NUGET=1 set CI=1 @@ -216,6 +223,7 @@ if /i "%ARG%" == "ci_part1" ( set BUILD_NET40=1 set BUILD_NET40_FSHARP_CORE=1 set BUILD_VS=1 + set BUILD_FCS=1 set TEST_VS_IDEUNIT_SUITE=1 set CI=1 ) @@ -287,6 +295,7 @@ if /i "%ARG%" == "test-all" ( set BUILD_NET40_FSHARP_CORE=1 set BUILD_CORECLR=1 set BUILD_VS=1 + set BUILD_FCS=1 set BUILD_SETUP=%FSC_BUILD_SETUP% set BUILD_NUGET=1 @@ -379,6 +388,7 @@ echo BUILD_NET40=%BUILD_NET40% echo BUILD_NET40_FSHARP_CORE=%BUILD_NET40_FSHARP_CORE% echo BUILD_CORECLR=%BUILD_CORECLR% echo BUILD_VS=%BUILD_VS% +echo BUILD_FCS=%BUILD_FCS% echo BUILD_SETUP=%BUILD_SETUP% echo BUILD_NUGET=%BUILD_NUGET% echo BUILD_CONFIG=%BUILD_CONFIG% diff --git a/packages.config b/packages.config index 43bff474ebf..4eb03bb5f98 100644 --- a/packages.config +++ b/packages.config @@ -47,6 +47,9 @@ + + + diff --git a/src/fsharp/CompileOps.fs b/src/fsharp/CompileOps.fs index e771074f3a1..f817948177f 100644 --- a/src/fsharp/CompileOps.fs +++ b/src/fsharp/CompileOps.fs @@ -5163,12 +5163,15 @@ type TcState = tcsNiceNameGen: NiceNameGenerator tcsTcSigEnv: TcEnv tcsTcImplEnv: TcEnv + tcsCreatesGeneratedProvidedTypes: bool /// The accumulated results of type checking for this assembly tcsRootSigsAndImpls : TypecheckerSigsAndImpls } member x.NiceNameGenerator = x.tcsNiceNameGen member x.TcEnvFromSignatures = x.tcsTcSigEnv member x.TcEnvFromImpls = x.tcsTcImplEnv member x.Ccu = x.tcsCcu + member x.CreatesGeneratedProvidedTypes = x.tcsCreatesGeneratedProvidedTypes + member x.PartialAssemblySignature = let (RootSigsAndImpls(_rootSigs,_rootImpls,_allSigModulTyp,allImplementedSigModulTyp)) = x.tcsRootSigsAndImpls allImplementedSigModulTyp @@ -5217,6 +5220,7 @@ let GetInitialTcState(m,ccuName,tcConfig:TcConfig,tcGlobals,tcImports:TcImports, tcsNiceNameGen=niceNameGen tcsTcSigEnv=tcEnv0 tcsTcImplEnv=tcEnv0 + tcsCreatesGeneratedProvidedTypes=false tcsRootSigsAndImpls = RootSigsAndImpls (rootSigs, rootImpls, allSigModulTyp, allImplementedSigModulTyp) } @@ -5233,7 +5237,7 @@ let TypeCheckOneInputEventually let (RootSigsAndImpls(rootSigs,rootImpls,allSigModulTyp,allImplementedSigModulTyp)) = tcState.tcsRootSigsAndImpls let m = inp.Range let amap = tcImports.GetImportMap() - let! (topAttrs, mimpls,tcEnvAtEnd,tcSigEnv,tcImplEnv,topSigsAndImpls,ccuType) = + let! (topAttrs, implFiles,tcEnvAtEnd,tcSigEnv,tcImplEnv,topSigsAndImpls,ccuType,createsGeneratedProvidedTypes) = eventually { match inp with | ParsedInput.SigFile (ParsedSigFileInput(_, qualNameOfFile, _, _, _) as file) -> @@ -5247,10 +5251,10 @@ let TypeCheckOneInputEventually errorR(Error(FSComp.SR.buildImplementationAlreadyGivenDetail(qualNameOfFile.Text),m)) // Typecheck the signature file - let! (tcEnvAtEnd,tcEnv,smodulTypeRoot) = + let! (tcEnv,sigFileType,createsGeneratedProvidedTypes) = TypeCheckOneSigFile (tcGlobals,tcState.tcsNiceNameGen,amap,tcState.tcsCcu,checkForErrors,tcConfig.conditionalCompilationDefines,tcSink) tcState.tcsTcSigEnv file - let rootSigs = Zmap.add qualNameOfFile smodulTypeRoot rootSigs + let rootSigs = Zmap.add qualNameOfFile sigFileType rootSigs // Open the prefixPath for fsi.exe let tcEnv = @@ -5260,7 +5264,7 @@ let TypeCheckOneInputEventually let m = qualNameOfFile.Range TcOpenDecl tcSink tcGlobals amap m m tcEnv prefixPath - let res = (EmptyTopAttrs, [], tcEnvAtEnd, tcEnv, tcState.tcsTcImplEnv, RootSigsAndImpls(rootSigs, rootImpls, allSigModulTyp, allImplementedSigModulTyp), tcState.tcsCcuType) + let res = (EmptyTopAttrs, [], tcEnv, tcEnv, tcState.tcsTcImplEnv, RootSigsAndImpls(rootSigs, rootImpls, allSigModulTyp, allImplementedSigModulTyp), tcState.tcsCcuType, createsGeneratedProvidedTypes) return res | ParsedInput.ImplFile (ParsedImplFileInput(filename,_,qualNameOfFile,_,_,_,_) as file) -> @@ -5277,7 +5281,7 @@ let TypeCheckOneInputEventually let tcImplEnv = tcState.tcsTcImplEnv // Typecheck the implementation file - let! topAttrs,implFile,tcEnvAtEnd = + let! topAttrs, implFile, tcEnvAtEnd, createsGeneratedProvidedTypes = TypeCheckOneImplFile (tcGlobals,tcState.tcsNiceNameGen,amap,tcState.tcsCcu,checkForErrors,tcConfig.conditionalCompilationDefines,tcSink) tcImplEnv rootSigOpt file let hadSig = Option.isSome rootSigOpt @@ -5320,14 +5324,15 @@ let TypeCheckOneInputEventually if verbose then dprintf "done TypeCheckOneInputEventually...\n" let topSigsAndImpls = RootSigsAndImpls(rootSigs,rootImpls,allSigModulTyp,allImplementedSigModulTyp) - let res = (topAttrs,[implFile], tcEnvAtEnd, tcSigEnv, tcImplEnv, topSigsAndImpls, ccuType) + let res = (topAttrs,[implFile], tcEnvAtEnd, tcSigEnv, tcImplEnv, topSigsAndImpls, ccuType, createsGeneratedProvidedTypes) return res } - return (tcEnvAtEnd,topAttrs,mimpls), + return (tcEnvAtEnd,topAttrs,implFiles), { tcState with tcsCcuType=ccuType tcsTcSigEnv=tcSigEnv tcsTcImplEnv=tcImplEnv + tcsCreatesGeneratedProvidedTypes=tcState.tcsCreatesGeneratedProvidedTypes || createsGeneratedProvidedTypes tcsRootSigsAndImpls = topSigsAndImpls } with e -> errorRecovery e range0 @@ -5344,14 +5349,14 @@ let TypeCheckOneInput (ctok, checkForErrors, tcConfig, tcImports, tcGlobals, pre /// Finish checking multiple files (or one interactive entry into F# Interactive) let TypeCheckMultipleInputsFinish(results,tcState: TcState) = - let tcEnvsAtEndFile,topAttrs,mimpls = List.unzip3 results + let tcEnvsAtEndFile,topAttrs,implFiles = List.unzip3 results let topAttrs = List.foldBack CombineTopAttrs topAttrs EmptyTopAttrs - let mimpls = List.concat mimpls + let implFiles = List.concat implFiles // This is the environment required by fsi.exe when incrementally adding definitions let tcEnvAtEndOfLastFile = (match tcEnvsAtEndFile with h :: _ -> h | _ -> tcState.TcEnvFromSignatures) - (tcEnvAtEndOfLastFile,topAttrs,mimpls),tcState + (tcEnvAtEndOfLastFile,topAttrs,implFiles),tcState /// Check multiple files (or one interactive entry into F# Interactive) let TypeCheckMultipleInputs (ctok, checkForErrors, tcConfig: TcConfig, tcImports, tcGlobals, prefixPathOpt, tcState, inputs) = @@ -5378,7 +5383,7 @@ let TypeCheckClosedInputSetFinish (declaredImpls: TypedImplFile list, tcState) = let TypeCheckClosedInputSet (ctok, checkForErrors, tcConfig, tcImports, tcGlobals, prefixPathOpt, tcState, inputs) = // tcEnvAtEndOfLastFile is the environment required by fsi.exe when incrementally adding definitions - let (tcEnvAtEndOfLastFile, topAttrs, mimpls),tcState = TypeCheckMultipleInputs (ctok, checkForErrors, tcConfig, tcImports, tcGlobals, prefixPathOpt, tcState, inputs) - let tcState, declaredImpls = TypeCheckClosedInputSetFinish (mimpls, tcState) + let (tcEnvAtEndOfLastFile, topAttrs, implFiles),tcState = TypeCheckMultipleInputs (ctok, checkForErrors, tcConfig, tcImports, tcGlobals, prefixPathOpt, tcState, inputs) + let tcState, declaredImpls = TypeCheckClosedInputSetFinish (implFiles, tcState) tcState, topAttrs, declaredImpls, tcEnvAtEndOfLastFile diff --git a/src/fsharp/CompileOps.fsi b/src/fsharp/CompileOps.fsi index 7dd1bb7ad0d..9b8634b66d7 100755 --- a/src/fsharp/CompileOps.fsi +++ b/src/fsharp/CompileOps.fsi @@ -724,6 +724,8 @@ type TcState = member NextStateAfterIncrementalFragment : TcEnv -> TcState + member CreatesGeneratedProvidedTypes : bool + /// Get the initial type checking state for a set of inputs val GetInitialTcState : range * string * TcConfig * TcGlobals * TcImports * Ast.NiceNameGenerator * TcEnv -> TcState diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 13acb738208..7161b7901e3 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -516,7 +516,7 @@ let AddDeclaredTypars check typars env = let env = ModifyNameResEnv (fun nenv -> AddDeclaredTyparsToNameEnv check nenv typars) env RegisterDeclaredTypars typars env -/// Compilation environment for typechecking a compilation unit. Contains the +/// Compilation environment for typechecking a single file in an assembly. Contains the /// F# and .NET modules loaded from disk, the search path, a table indicating /// how to List.map F# modules to assembly names, and some nasty globals /// related to type inference. These are: @@ -534,6 +534,9 @@ type cenv = /// Checks to run after all inference is complete. mutable postInferenceChecks: ResizeArray unit> + /// Set to true if this file causes the creation of generated provided types. + mutable createsGeneratedProvidedTypes: bool + /// Are we in a script? if so relax the reporting of discarded-expression warnings at the top level isScript: bool @@ -573,6 +576,7 @@ type cenv = amap = amap recUses = ValMultiMap<_>.Empty postInferenceChecks = ResizeArray() + createsGeneratedProvidedTypes = false topCcu = topCcu isScript = isScript css = ConstraintSolverState.New(g,amap,infoReader,tcVal) @@ -14686,6 +14690,8 @@ module EstablishTypeDefinitionCores = let nm = theRootTypeWithRemapping.PUntaint((fun st -> st.FullName),m) error(Error(FSComp.SR.etErasedTypeUsedInGeneration(desig,nm),m)) + cenv.createsGeneratedProvidedTypes <- true + // In compiled code, all types in the set of generated types end up being both generated and relocated, unless relocation is suppressed let isForcedSuppressRelocate = theRootTypeWithRemapping.PUntaint((fun st -> st.IsSuppressRelocate),m) if isForcedSuppressRelocate && canAccessFromEverywhere tycon.Accessibility && not cenv.isScript then @@ -17014,14 +17020,14 @@ let TypeCheckOneImplFile conditionallySuppressErrorReporting (checkForErrors()) (fun () -> try let reportErrors = not (checkForErrors()) - Microsoft.FSharp.Compiler.PostTypeCheckSemanticChecks.CheckTopImpl (g,cenv.amap,reportErrors,cenv.infoReader,env.eInternalsVisibleCompPaths,cenv.topCcu,envAtEnd.DisplayEnv, implFileExprAfterSig,extraAttribs,isLastCompiland) + PostTypeCheckSemanticChecks.CheckTopImpl (g,cenv.amap,reportErrors,cenv.infoReader,env.eInternalsVisibleCompPaths,cenv.topCcu,envAtEnd.DisplayEnv, implFileExprAfterSig,extraAttribs,isLastCompiland) with e -> errorRecovery e m false) - let implFile = TImplFile(qualNameOfFile,scopedPragmas, implFileExprAfterSig, hasExplicitEntryPoint,isScript) + let implFile = TImplFile(qualNameOfFile, scopedPragmas, implFileExprAfterSig, hasExplicitEntryPoint, isScript) - return (topAttrs,implFile,envAtEnd) + return (topAttrs,implFile,envAtEnd,cenv.createsGeneratedProvidedTypes) } @@ -17041,5 +17047,5 @@ let TypeCheckOneSigFile (g,niceNameGen,amap,topCcu,checkForErrors,conditionalDe try sigFileType |> IterTyconsOfModuleOrNamespaceType (FinalTypeDefinitionChecksAtEndOfInferenceScope(cenv.infoReader, tcEnv.NameEnv, cenv.tcSink, false, tcEnv.DisplayEnv)) with e -> errorRecovery e qualNameOfFile.Range - return (tcEnv,tcEnv,sigFileType) + return (tcEnv,sigFileType,cenv.createsGeneratedProvidedTypes) } diff --git a/src/fsharp/TypeChecker.fsi b/src/fsharp/TypeChecker.fsi index 8a5ec162280..c9e803b8fb3 100644 --- a/src/fsharp/TypeChecker.fsi +++ b/src/fsharp/TypeChecker.fsi @@ -48,13 +48,13 @@ val TypeCheckOneImplFile : -> TcEnv -> Tast.ModuleOrNamespaceType option -> ParsedImplFileInput - -> Eventually + -> Eventually val TypeCheckOneSigFile : TcGlobals * NiceNameGenerator * ImportMap * CcuThunk * (unit -> bool) * ConditionalDefines * NameResolution.TcResultsSink -> TcEnv -> ParsedSigFileInput - -> Eventually + -> Eventually //------------------------------------------------------------------------- // Some of the exceptions arising from type checking. These should be moved to diff --git a/src/fsharp/vs/IncrementalBuild.fs b/src/fsharp/vs/IncrementalBuild.fs index dec4634ad99..b3e7e012dad 100755 --- a/src/fsharp/vs/IncrementalBuild.fs +++ b/src/fsharp/vs/IncrementalBuild.fs @@ -1442,7 +1442,7 @@ type IncrementalBuilder(tcGlobals,frameworkTcImports, nonFrameworkAssemblyInputs // We return 'None' for the assembly portion of the cross-assembly reference let hasTypeProviderAssemblyAttrib = topAttrs.assemblyAttrs |> List.exists (fun (Attrib(tcref,_,_,_,_,_,_)) -> tcref.CompiledRepresentationForNamedType.BasicQualifiedName = typeof.FullName) - if hasTypeProviderAssemblyAttrib then + if tcState.CreatesGeneratedProvidedTypes || hasTypeProviderAssemblyAttrib then None else Some (RawFSharpAssemblyDataBackedByLanguageService (tcConfig,tcGlobals,tcState,outfile,topAttrs,assemblyName,ilAssemRef) :> IRawFSharpAssemblyData) diff --git a/tests/service/CSharpProjectAnalysis.fs b/tests/service/CSharpProjectAnalysis.fs index e6df8a73b0c..597cedfbfbb 100644 --- a/tests/service/CSharpProjectAnalysis.fs +++ b/tests/service/CSharpProjectAnalysis.fs @@ -1,6 +1,6 @@  #if INTERACTIVE -#r "../../Debug/net40/bin/FSharp.Compiler.Service.dll" +#r "../../Debug/net40/bin/FSharp.Compiler.Service.dll" // note, run 'build fcs' to generate this, this DLL has a public API so can be used from F# Interactive #r "../../bin/v4.5/CSharp_Analysis.dll" #r "../../packages/NUnit.3.5.0/lib/net45/nunit.framework.dll" #load "FsUnit.fs" diff --git a/tests/service/Common.fs b/tests/service/Common.fs index 9896f65b585..80f7c34ebb8 100644 --- a/tests/service/Common.fs +++ b/tests/service/Common.fs @@ -99,6 +99,18 @@ let fsCoreDefaultReference() = sysLib "FSharp.Core" *) +let mkStandardProjectReferences () = +#if DOTNETCORE + let file = "Sample_NETCoreSDK_FSharp_Library_netstandard1.6.fsproj" + let projDir = Path.Combine(__SOURCE_DIRECTORY__, "../projects/Sample_NETCoreSDK_FSharp_Library_netstandard1.6") + readRefs projDir file +#else + [ yield sysLib "mscorlib" + yield sysLib "System" + yield sysLib "System.Core" + yield fsCoreDefaultReference() ] +#endif + let mkProjectCommandLineArgs (dllName, fileNames) = let args = [| yield "--simpleresolution" @@ -117,17 +129,7 @@ let mkProjectCommandLineArgs (dllName, fileNames) = yield "--target:library" for x in fileNames do yield x - let references = -#if DOTNETCORE - let file = "Sample_NETCoreSDK_FSharp_Library_netstandard1.6.fsproj" - let projDir = Path.Combine(__SOURCE_DIRECTORY__, "../projects/Sample_NETCoreSDK_FSharp_Library_netstandard1.6") - readRefs projDir file -#else - [ yield sysLib "mscorlib" - yield sysLib "System" - yield sysLib "System.Core" - yield fsCoreDefaultReference() ] -#endif + let references = mkStandardProjectReferences () for r in references do yield "-r:" + r |] @@ -152,11 +154,7 @@ let mkProjectCommandLineArgsForScript (dllName, fileNames) = yield "--target:library" for x in fileNames do yield x - // let implDir = Path.GetDirectoryName(typeof.Assembly.Location) - let references = - let file = "Sample_NETCoreSDK_FSharp_Library_netstandard1.6.fsproj" - let projDir = Path.Combine(__SOURCE_DIRECTORY__, "../projects/Sample_NETCoreSDK_FSharp_Library_netstandard1.6") - readRefs projDir file + let references = mkStandardProjectReferences () for r in references do yield "-r:" + r |] diff --git a/tests/service/EditorTests.fs b/tests/service/EditorTests.fs index 6bd6cf30739..00cf537d0d6 100644 --- a/tests/service/EditorTests.fs +++ b/tests/service/EditorTests.fs @@ -19,7 +19,7 @@ // Use F# Interactive. This only works for FSHarp.Compiler.Service.dll which has a public API #if INTERACTIVE -#r "../../Debug/net40/bin/FSharp.Compiler.Service.dll" +#r "../../Debug/net40/bin/FSharp.Compiler.Service.dll" // note, run 'build fcs' to generate this, this DLL has a public API so can be used from F# Interactive #r "../../packages/NUnit.3.5.0/lib/net45/nunit.framework.dll" #load "FsUnit.fs" #load "Common.fs" diff --git a/tests/service/ExprTests.fs b/tests/service/ExprTests.fs index cc2693b6074..d8276296eaa 100644 --- a/tests/service/ExprTests.fs +++ b/tests/service/ExprTests.fs @@ -1,6 +1,6 @@  #if INTERACTIVE -#r "../../Debug/net40/bin/FSharp.Compiler.Service.dll" +#r "../../Debug/net40/bin/FSharp.Compiler.Service.dll" // note, run 'build fcs' to generate this, this DLL has a public API so can be used from F# Interactive #r "../../Debug/net40/bin/FSharp.Compiler.Service.ProjectCracker.dll" #r "../../packages/NUnit.3.5.0/lib/net45/nunit.framework.dll" #load "FsUnit.fs" @@ -866,7 +866,7 @@ let ``Test expressions of declarations stress big expressions`` () = // This should not stack overflow printDeclarations None (List.ofSeq file1.Declarations) |> Seq.toList |> ignore -#if FX_ATLEAST_45 && !DOTNETCORE +#if !NO_PROJECTCRACKER && !DOTNETCORE [] let ``Check use of type provider that provides calls to F# code`` () = diff --git a/tests/service/FileSystemTests.fs b/tests/service/FileSystemTests.fs index dee67a9969c..ee5f1f36030 100644 --- a/tests/service/FileSystemTests.fs +++ b/tests/service/FileSystemTests.fs @@ -1,5 +1,5 @@ #if INTERACTIVE -#r "../../Debug/net40/bin/FSharp.Compiler.Service.dll" +#r "../../Debug/net40/bin/FSharp.Compiler.Service.dll" // note, run 'build fcs' to generate this, this DLL has a public API so can be used from F# Interactive #r "../../packages/NUnit.3.5.0/lib/net45/nunit.framework.dll" #load "FsUnit.fs" #load "Common.fs" diff --git a/tests/service/FscTests.fs b/tests/service/FscTests.fs index a29db37681c..c2ba5396c29 100644 --- a/tests/service/FscTests.fs +++ b/tests/service/FscTests.fs @@ -1,6 +1,6 @@ #if INTERACTIVE -#r "../../Debug/net40/bin/FSharp.Compiler.Service.dll" +#r "../../Debug/net40/bin/FSharp.Compiler.Service.dll" // note, run 'build fcs' to generate this, this DLL has a public API so can be used from F# Interactive #r "../../packages/NUnit.3.5.0/lib/net45/nunit.framework.dll" #load "FsUnit.fs" #load "Common.fs" diff --git a/tests/service/FsiTests.fs b/tests/service/FsiTests.fs index 2fb90723e33..5449d441148 100644 --- a/tests/service/FsiTests.fs +++ b/tests/service/FsiTests.fs @@ -1,6 +1,6 @@  #if INTERACTIVE -#r "../../Debug/net40/bin/FSharp.Compiler.Service.dll" +#r "../../Debug/net40/bin/FSharp.Compiler.Service.dll" // note, run 'build fcs' to generate this, this DLL has a public API so can be used from F# Interactive #r "../../packages/NUnit.3.5.0/lib/net45/nunit.framework.dll" #load "FsUnit.fs" #load "Common.fs" diff --git a/tests/service/InteractiveCheckerTests.fs b/tests/service/InteractiveCheckerTests.fs index ea4ba10c015..e1ad86c2bfc 100644 --- a/tests/service/InteractiveCheckerTests.fs +++ b/tests/service/InteractiveCheckerTests.fs @@ -1,6 +1,6 @@  #if INTERACTIVE -#r "../../Debug/net40/bin/FSharp.Compiler.Service.dll" +#r "../../Debug/net40/bin/FSharp.Compiler.Service.dll" // note, run 'build fcs' to generate this, this DLL has a public API so can be used from F# Interactive #r "../../packages/NUnit.3.5.0/lib/net45/nunit.framework.dll" #load "FsUnit.fs" #load "Common.fs" diff --git a/tests/service/MultiProjectAnalysisTests.fs b/tests/service/MultiProjectAnalysisTests.fs index c5e6db145fd..583cf530812 100644 --- a/tests/service/MultiProjectAnalysisTests.fs +++ b/tests/service/MultiProjectAnalysisTests.fs @@ -1,6 +1,6 @@  #if INTERACTIVE -#r "../../Debug/net40/bin/FSharp.Compiler.Service.dll" +#r "../../Debug/net40/bin/FSharp.Compiler.Service.dll" // note, run 'build fcs' to generate this, this DLL has a public API so can be used from F# Interactive #r "../../packages/NUnit.3.5.0/lib/net45/nunit.framework.dll" #load "FsUnit.fs" #load "Common.fs" @@ -771,19 +771,180 @@ let ``Test max memory gets triggered`` () = //------------------------------------------------------------------------------------ -#if FX_ATLEAST_45 +#if !DOTNETCORE [] let ``Type provider project references should not throw exceptions`` () = - let projectFile = __SOURCE_DIRECTORY__ + @"/data/TypeProviderConsole/TypeProviderConsole.fsproj" - let options = ProjectCracker.GetProjectOptionsFromProjectFile(projectFile, [("Configuration", "Debug")]) + //let options = ProjectCracker.GetProjectOptionsFromProjectFile(projectFile, [("Configuration", "Debug")]) + let options = + {ProjectFileName = __SOURCE_DIRECTORY__ + @"/data/TypeProviderConsole/TypeProviderConsole.fsproj"; + SourceFiles = [|__SOURCE_DIRECTORY__ + @"/data/TypeProviderConsole/Program.fs"|]; + Stamp = None + OtherOptions = + [|yield "--simpleresolution"; + yield "--noframework"; + yield "--out:" + __SOURCE_DIRECTORY__ + @"/data/TypeProviderConsole/bin/Debug/TypeProviderConsole.exe"; + yield "--doc:" + __SOURCE_DIRECTORY__ + @"/data/TypeProviderConsole/bin/Debug/TypeProviderConsole.xml"; + yield "--subsystemversion:6.00"; + yield "--highentropyva+"; + yield "--fullpaths"; + yield "--flaterrors"; + yield "--target:exe"; + yield "--define:DEBUG"; + yield "--define:TRACE"; + yield "--debug+"; + yield "--optimize-"; + yield "--tailcalls-"; + yield "--debug:full"; + yield "--platform:anycpu"; + for r in mkStandardProjectReferences () do + yield "-r:" + r + yield "-r:" + __SOURCE_DIRECTORY__ + @"/data/TypeProviderLibrary/TypeProviderLibrary.dll"|]; + ReferencedProjects = + [|(__SOURCE_DIRECTORY__ + @"/data/TypeProviderLibrary/TypeProviderLibrary.dll", + {ProjectFileName = __SOURCE_DIRECTORY__ + @"/data/TypeProviderLibrary/TypeProviderLibrary.fsproj"; + SourceFiles = [|__SOURCE_DIRECTORY__ + @"/data/TypeProviderLibrary/Library1.fs"|]; + Stamp = None + OtherOptions = + [|yield "--simpleresolution"; + yield "--noframework"; + yield "--out:" + __SOURCE_DIRECTORY__ + @"/data/TypeProviderLibrary/TypeProviderLibrary.dll"; + yield "--doc:" + __SOURCE_DIRECTORY__ + @"/data/TypeProviderLibrary/bin/Debug/TypeProviderLibrary.xml"; + yield "--subsystemversion:6.00"; + yield "--highentropyva+"; + yield "--fullpaths"; + yield "--flaterrors"; + yield "--target:library"; + yield "--define:DEBUG"; + yield "--define:TRACE"; + yield "--debug+"; + yield "--optimize-"; + yield "--tailcalls-"; + yield "--debug:full"; + yield "--platform:anycpu"; + for r in mkStandardProjectReferences () do + yield "-r:" + r + yield "-r:" + __SOURCE_DIRECTORY__ + @"/data/TypeProviderLibrary/FSharp.Data.TypeProviders.dll"; + |]; + ReferencedProjects = [||]; + IsIncompleteTypeCheckEnvironment = false; + UseScriptResolutionRules = false; + LoadTime = System.DateTime.Now + UnresolvedReferences = None; + OriginalLoadReferences = []; + ExtraProjectInfo = None;})|]; + IsIncompleteTypeCheckEnvironment = false; + UseScriptResolutionRules = false; + LoadTime = System.DateTime.Now + UnresolvedReferences = None; + OriginalLoadReferences = []; + ExtraProjectInfo = None;} + //printfn "options: %A" options let fileName = __SOURCE_DIRECTORY__ + @"/data/TypeProviderConsole/Program.fs" let fileSource = File.ReadAllText(fileName) - let fileCheckResults, _ = checker.ParseAndCheckFileInProject(fileName, 0, fileSource, options) |> Async.RunSynchronously - //printfn "Errors: %A" fileCheckResults.Errors + let fileParseResults, fileCheckAnswer = checker.ParseAndCheckFileInProject(fileName, 0, fileSource, options) |> Async.RunSynchronously + let fileCheckResults = + match fileCheckAnswer with + | FSharpCheckFileAnswer.Succeeded(res) -> res + | res -> failwithf "Parsing did not finish... (%A)" res + + printfn "Parse Errors: %A" fileParseResults.Errors + printfn "Errors: %A" fileCheckResults.Errors fileCheckResults.Errors |> Array.exists (fun error -> error.Severity = FSharpErrorSeverity.Error) |> shouldEqual false + + + +//------------------------------------------------------------------------------------ + +[] +let ``Projects creating generated types should not utilize cross-project-references but should still analyze oK once project is built`` () = + //let options = ProjectCracker.GetProjectOptionsFromProjectFile(projectFile, [("Configuration", "Debug")]) + let options = + {ProjectFileName = + __SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TestConsole/TestConsole.fsproj"; + SourceFiles = + [|__SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TestConsole/AssemblyInfo.fs"; + __SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TestConsole/Program.fs"|]; + OtherOptions = + [|yield "--simpleresolution"; + yield "--noframework"; + yield "--out:" + __SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TestConsole/bin/Debug/TestConsole.exe"; + yield "--doc:" + __SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TestConsole/bin/Debug/TestConsole.XML"; + yield "--subsystemversion:6.00"; + yield "--highentropyva+"; + yield "--fullpaths"; + yield "--flaterrors"; + yield "--target:exe"; + yield "--define:DEBUG"; + yield "--define:TRACE"; + yield "--debug+"; + yield "--optimize-"; + yield "--tailcalls-"; + yield "--debug:full"; + yield "--platform:anycpu"; + yield "-r:" + __SOURCE_DIRECTORY__ + @"/../../packages/FSharp.Configuration.1.3.0/lib/net45/FSharp.Configuration.dll"; + for r in mkStandardProjectReferences () do + yield "-r:" + r + yield "-r:" + __SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TypeProvidersBug/bin/Debug/TypeProvidersBug.dll"|]; + ReferencedProjects = + [|(__SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TypeProvidersBug/bin/Debug/TypeProvidersBug.dll", + {ProjectFileName = + __SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TypeProvidersBug/TypeProvidersBug.fsproj"; + SourceFiles = + [|__SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TypeProvidersBug/AssemblyInfo.fs"; + __SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TypeProvidersBug/Library1.fs"|]; + OtherOptions = + [|yield "--simpleresolution"; + yield "--noframework"; + yield "--out:" + __SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TypeProvidersBug/bin/Debug/TypeProvidersBug.dll"; + yield "--doc:" + __SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TypeProvidersBug/bin/Debug/TypeProvidersBug.XML"; + yield "--subsystemversion:6.00"; + yield "--highentropyva+"; + yield "--fullpaths"; + yield "--flaterrors"; + yield "--target:library"; + yield "--define:DEBUG"; + yield "--define:TRACE"; + yield "--debug+"; + yield "--optimize-"; + yield "--tailcalls-"; + yield "--debug:full"; + yield "--platform:anycpu"; + yield "-r:" + __SOURCE_DIRECTORY__ + @"/../../packages/FSharp.Configuration.1.3.0/lib/net45/FSharp.Configuration.dll"; + for r in mkStandardProjectReferences () do + yield "-r:" + r |]; + ReferencedProjects = [||]; + IsIncompleteTypeCheckEnvironment = false; + UseScriptResolutionRules = false; + LoadTime = System.DateTime.Now + UnresolvedReferences = None; + OriginalLoadReferences = []; + Stamp = None; + ExtraProjectInfo = None;})|]; + IsIncompleteTypeCheckEnvironment = false; + UseScriptResolutionRules = false; + LoadTime = System.DateTime.Now + UnresolvedReferences = None; + Stamp = None; + OriginalLoadReferences = []; + ExtraProjectInfo = None;} + //printfn "options: %A" options + let fileName = __SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TestConsole/Program.fs" + let fileSource = File.ReadAllText(fileName) + let fileParseResults, fileCheckAnswer = checker.ParseAndCheckFileInProject(fileName, 0, fileSource, options) |> Async.RunSynchronously + let fileCheckResults = + match fileCheckAnswer with + | FSharpCheckFileAnswer.Succeeded(res) -> res + | res -> failwithf "Parsing did not finish... (%A)" res + + printfn "Parse Errors: %A" fileParseResults.Errors + printfn "Errors: %A" fileCheckResults.Errors + fileCheckResults.Errors |> Array.exists (fun error -> error.Severity = FSharpErrorSeverity.Error) |> shouldEqual false + + + #endif //------------------------------------------------------------------------------------ diff --git a/tests/service/PerfTests.fs b/tests/service/PerfTests.fs index f579897b69f..f7510bb224e 100644 --- a/tests/service/PerfTests.fs +++ b/tests/service/PerfTests.fs @@ -1,5 +1,5 @@ #if INTERACTIVE -#r "../../Debug/net40/bin/FSharp.Compiler.Service.dll" +#r "../../Debug/net40/bin/FSharp.Compiler.Service.dll" // note, run 'build fcs' to generate this, this DLL has a public API so can be used from F# Interactive #r "../../packages/NUnit.3.5.0/lib/net45/nunit.framework.dll" #load "FsUnit.fs" #load "Common.fs" diff --git a/tests/service/ProjectAnalysisTests.fs b/tests/service/ProjectAnalysisTests.fs index d2802ba4bf9..eef58edb04b 100644 --- a/tests/service/ProjectAnalysisTests.fs +++ b/tests/service/ProjectAnalysisTests.fs @@ -1,5 +1,5 @@ #if INTERACTIVE -#r "../../Debug/net40/bin/FSharp.Compiler.Service.dll" +#r "../../Debug/net40/bin/FSharp.Compiler.Service.dll" // note, run 'build fcs' to generate this, this DLL has a public API so can be used from F# Interactive #r "../../packages/NUnit.3.5.0/lib/net45/nunit.framework.dll" #load "FsUnit.fs" #load "Common.fs" diff --git a/tests/service/ProjectOptionsTests.fs b/tests/service/ProjectOptionsTests.fs index 1069789fef7..0c27f4caa10 100644 --- a/tests/service/ProjectOptionsTests.fs +++ b/tests/service/ProjectOptionsTests.fs @@ -1,5 +1,5 @@ #if INTERACTIVE -#r "../../Debug/net40/bin/FSharp.Compiler.Service.dll" +#r "../../Debug/net40/bin/FSharp.Compiler.Service.dll" // note, run 'build fcs' to generate this, this DLL has a public API so can be used from F# Interactive #r "../../Debug/net40/bin/FSharp.Compiler.Service.ProjectCracker.dll" #r "../../packages/NUnit.3.5.0/lib/net45/nunit.framework.dll" #load "FsUnit.fs" @@ -18,7 +18,6 @@ open Microsoft.FSharp.Compiler.SourceCodeServices open FSharp.Compiler.Service.Tests.Common -#if FX_ATLEAST_45 #if !NO_PROJECTCRACKER let normalizePath s = (new Uri(s)).LocalPath @@ -477,7 +476,6 @@ let ``Test SourceFiles order for GetProjectOptionsFromScript`` () = // See #594 test "Main4" [|"BaseLib2"; "Lib5"; "BaseLib1"; "Lib1"; "Lib2"; "Main4"|] test "MainBad" [|"MainBad"|] -#endif diff --git a/tests/service/TokenizerTests.fs b/tests/service/TokenizerTests.fs index 03b7b0c4a8d..105f55a2027 100644 --- a/tests/service/TokenizerTests.fs +++ b/tests/service/TokenizerTests.fs @@ -1,6 +1,6 @@  #if INTERACTIVE -#r "../../Debug/net40/bin/FSharp.Compiler.Service.dll" +#r "../../Debug/net40/bin/FSharp.Compiler.Service.dll" // note, run 'build fcs' to generate this, this DLL has a public API so can be used from F# Interactive #r "../../packages/NUnit.3.5.0/lib/net45/nunit.framework.dll" #load "FsUnit.fs" #load "Common.fs" diff --git a/tests/service/data/TypeProviderLibrary/FSharp.Core.dll b/tests/service/data/TypeProviderLibrary/FSharp.Core.dll deleted file mode 100644 index 86b505d20c1..00000000000 Binary files a/tests/service/data/TypeProviderLibrary/FSharp.Core.dll and /dev/null differ diff --git a/tests/service/data/TypeProviderLibrary/FSharp.Data.TypeProviders.dll b/tests/service/data/TypeProviderLibrary/FSharp.Data.TypeProviders.dll deleted file mode 100644 index bcec4d84167..00000000000 Binary files a/tests/service/data/TypeProviderLibrary/FSharp.Data.TypeProviders.dll and /dev/null differ diff --git a/tests/service/data/TypeProviderLibrary/Library1.fs b/tests/service/data/TypeProviderLibrary/Library1.fs index e6fb2da6a6e..ae9e9a1d784 100644 --- a/tests/service/data/TypeProviderLibrary/Library1.fs +++ b/tests/service/data/TypeProviderLibrary/Library1.fs @@ -4,7 +4,22 @@ open Microsoft.FSharp.Core.CompilerServices open System [] -type FakeTypeProvider() = class end +type FakeTypeProvider() = + interface ITypeProvider with + member this.GetStaticParameters _ = [||] + member this.ApplyStaticArguments(_,_,_) = raise <| System.InvalidOperationException() + member this.GetNamespaces() = [| |] + member this.GetInvokerExpression(_,_) = failwith "GetInvokerExpression" + [] + member this.Invalidate = (new Event<_,_>()).Publish + member this.GetGeneratedAssemblyContents(assembly) = failwith "GetGeneratedAssemblyContents" + + interface ITypeProvider2 with + member this.GetStaticParametersForMethod _ = [||] + member this.ApplyStaticArgumentsForMethod(_,_,_) = raise <| System.InvalidOperationException() + + interface IDisposable with + member __.Dispose() = () [] do() diff --git a/tests/service/data/TypeProviderLibrary/TypeProviderLibrary.dll b/tests/service/data/TypeProviderLibrary/TypeProviderLibrary.dll new file mode 100644 index 00000000000..7dd893d01f4 Binary files /dev/null and b/tests/service/data/TypeProviderLibrary/TypeProviderLibrary.dll differ diff --git a/tests/service/data/TypeProviderLibrary/TypeProviderLibrary.fsproj b/tests/service/data/TypeProviderLibrary/TypeProviderLibrary.fsproj index 1176ffe801d..ebe466e62db 100644 --- a/tests/service/data/TypeProviderLibrary/TypeProviderLibrary.fsproj +++ b/tests/service/data/TypeProviderLibrary/TypeProviderLibrary.fsproj @@ -32,7 +32,9 @@ bin\Release\TypeProviderLibrary.xml - + + + ..\..\..\..\$(Configuration)\net40\bin\FSharp.Core.dll @@ -41,19 +43,5 @@ - - - - - - - - ..\..\..\..\packages\NUnit\lib\nunit.framework.dll - True - True - - - - \ No newline at end of file diff --git a/tests/service/data/TypeProvidersBug/TestConsole/App.config b/tests/service/data/TypeProvidersBug/TestConsole/App.config new file mode 100644 index 00000000000..8324aa6ff15 --- /dev/null +++ b/tests/service/data/TypeProvidersBug/TestConsole/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/tests/service/data/TypeProvidersBug/TestConsole/AssemblyInfo.fs b/tests/service/data/TypeProvidersBug/TestConsole/AssemblyInfo.fs new file mode 100644 index 00000000000..7f520374db6 --- /dev/null +++ b/tests/service/data/TypeProvidersBug/TestConsole/AssemblyInfo.fs @@ -0,0 +1,41 @@ +namespace TestConsole.AssemblyInfo + +open System.Reflection +open System.Runtime.CompilerServices +open System.Runtime.InteropServices + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[] +[] +[] +[] +[] +[] +[] +[] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [] +[] +[] + +do + () \ No newline at end of file diff --git a/tests/service/data/TypeProvidersBug/TestConsole/Program.fs b/tests/service/data/TypeProvidersBug/TestConsole/Program.fs new file mode 100644 index 00000000000..9b1e9f0ce97 --- /dev/null +++ b/tests/service/data/TypeProvidersBug/TestConsole/Program.fs @@ -0,0 +1,5 @@ + +[] +let main _ = + let foo: string = TypeProvidersBug.Test.config.Foo + 0 \ No newline at end of file diff --git a/tests/service/data/TypeProvidersBug/TestConsole/TestConsole.fsproj b/tests/service/data/TypeProvidersBug/TestConsole/TestConsole.fsproj new file mode 100644 index 00000000000..8c33ca08267 --- /dev/null +++ b/tests/service/data/TypeProvidersBug/TestConsole/TestConsole.fsproj @@ -0,0 +1,63 @@ + + + + + Debug + AnyCPU + 2.0 + 247653e8-fba7-419b-8b7a-8b17ebfe2969 + Exe + TestConsole + TestConsole + v4.6 + true + TestConsole + + + true + full + false + false + bin\Debug\ + DEBUG;TRACE + 3 + AnyCPU + bin\Debug\TestConsole.XML + true + + + pdbonly + true + true + bin\Release\ + TRACE + 3 + AnyCPU + bin\Release\TestConsole.XML + true + + + + + + + + + + + + + ..\..\..\..\..\$(Configuration)\net40\bin\FSharp.Core.dll + + + TypeProvidersBug + {7b36cdd5-14f3-42f0-8118-c279d2315a22} + True + + + ..\..\..\..\..\packages\FSharp.Configuration.1.3.0\lib\net45\FSharp.Configuration.dll + True + + + + \ No newline at end of file diff --git a/tests/service/data/TypeProvidersBug/TypeProvidersBug/AssemblyInfo.fs b/tests/service/data/TypeProvidersBug/TypeProvidersBug/AssemblyInfo.fs new file mode 100644 index 00000000000..5552b38496a --- /dev/null +++ b/tests/service/data/TypeProvidersBug/TypeProvidersBug/AssemblyInfo.fs @@ -0,0 +1,41 @@ +namespace TypeProvidersBug.AssemblyInfo + +open System.Reflection +open System.Runtime.CompilerServices +open System.Runtime.InteropServices + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[] +[] +[] +[] +[] +[] +[] +[] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [] +[] +[] + +do + () \ No newline at end of file diff --git a/tests/service/data/TypeProvidersBug/TypeProvidersBug/Library1.fs b/tests/service/data/TypeProvidersBug/TypeProvidersBug/Library1.fs new file mode 100644 index 00000000000..531e89d8460 --- /dev/null +++ b/tests/service/data/TypeProvidersBug/TypeProvidersBug/Library1.fs @@ -0,0 +1,7 @@ +module TypeProvidersBug.Test + +open FSharp.Configuration + +type Configuration = YamlConfig + +let config = Configuration() diff --git a/tests/service/data/TypeProvidersBug/TypeProvidersBug/TypeProvidersBug.fsproj b/tests/service/data/TypeProvidersBug/TypeProvidersBug/TypeProvidersBug.fsproj new file mode 100644 index 00000000000..f711d9c3f5b --- /dev/null +++ b/tests/service/data/TypeProvidersBug/TypeProvidersBug/TypeProvidersBug.fsproj @@ -0,0 +1,53 @@ + + + + + Debug + AnyCPU + 2.0 + 7b36cdd5-14f3-42f0-8118-c279d2315a22 + Library + TypeProvidersBug + TypeProvidersBug + v4.6 + true + TypeProvidersBug + + + true + full + false + false + bin\Debug\ + DEBUG;TRACE + 3 + bin\Debug\TypeProvidersBug.XML + + + pdbonly + true + true + bin\Release\ + TRACE + 3 + bin\Release\TypeProvidersBug.XML + + + + + + + + + + + + ..\..\..\..\..\$(Configuration)\net40\bin\FSharp.Core.dll + + + ..\..\..\..\..\packages\FSharp.Configuration.1.3.0\lib\net45\FSharp.Configuration.dll + True + + + + \ No newline at end of file diff --git a/tests/service/data/TypeProvidersBug/TypeProvidersBug/bin/Debug/TypeProvidersBug.dll b/tests/service/data/TypeProvidersBug/TypeProvidersBug/bin/Debug/TypeProvidersBug.dll new file mode 100644 index 00000000000..8e73750a869 Binary files /dev/null and b/tests/service/data/TypeProvidersBug/TypeProvidersBug/bin/Debug/TypeProvidersBug.dll differ