@@ -1394,14 +1394,13 @@ type TypeCheckInfo
13941394override __.ToString () = " TypeCheckInfo(" + mainInputFileName+ " )"
13951395
13961396type FSharpParsingOptions =
1397- {
1398- SourceFiles: string []
1397+ { SourceFiles: string []
13991398 ConditionalCompilationDefines: string list
14001399 ErrorSeverityOptions: FSharpErrorSeverityOptions
1400+ IsInteractive: bool
14011401 LightSyntax: bool option
14021402 CompilingFsLib: bool
1403- IsExe: bool
1404- }
1403+ IsExe: bool }
14051404
14061405member x.LastFileName =
14071406 Debug.Assert( not ( Array.isEmpty x.SourceFiles), " Parsing options don't contain any file" )
@@ -1411,26 +1410,26 @@ type FSharpParsingOptions =
14111410{ SourceFiles= Array.empty
14121411 ConditionalCompilationDefines= []
14131412 ErrorSeverityOptions= FSharpErrorSeverityOptions.Default
1413+ IsInteractive= false
14141414 LightSyntax= None
14151415 CompilingFsLib= false
1416- IsExe= false
1417- }
1416+ IsExe= false }
14181417
1419- static member FromTcConfig ( tcConfig : TcConfig , sourceFiles ) =
1420- {
1421- SourceFiles= sourceFiles
1418+ static member FromTcConfig ( tcConfig : TcConfig , sourceFiles , isInteractive : bool ) =
1419+ { SourceFiles= sourceFiles
14221420 ConditionalCompilationDefines= tcConfig.conditionalCompilationDefines
14231421 ErrorSeverityOptions= tcConfig.errorSeverityOptions
1422+ IsInteractive= isInteractive
14241423 LightSyntax= tcConfig.light
14251424 CompilingFsLib= tcConfig.compilingFslib
1426- IsExe= tcConfig.target.IsExe
1427- }
1425+ IsExe= tcConfig.target.IsExe}
14281426
1429- static member FromTcConfigBuidler ( tcConfigB : TcConfigBuilder , sourceFiles ) =
1427+ static member FromTcConfigBuidler ( tcConfigB : TcConfigBuilder , sourceFiles , isInteractive : bool ) =
14301428{
14311429 SourceFiles= sourceFiles
14321430 ConditionalCompilationDefines= tcConfigB.conditionalCompilationDefines
14331431 ErrorSeverityOptions= tcConfigB.errorSeverityOptions
1432+ IsInteractive= isInteractive
14341433 LightSyntax= tcConfigB.light
14351434 CompilingFsLib= tcConfigB.compilingFslib
14361435 IsExe= tcConfigB.target.IsExe
@@ -1502,7 +1501,7 @@ module internal Parser =
15021501
15031502// If we're editing a script then we define INTERACTIVE otherwise COMPILED.
15041503// Since this parsing for intellisense we always define EDITING.
1505- let defines = SourceFileImpl.AdditionalDefinesForUseInEditor( fileName ) @ options.ConditionalCompilationDefines
1504+ let defines = ( SourceFileImpl.AdditionalDefinesForUseInEditor options.IsInteractive ) @ options.ConditionalCompilationDefines
15061505
15071506// Note: we don't really attempt to intern strings across a large scope.
15081507let lexResourceManager = new Lexhelp.LexResourceManager()
@@ -1521,6 +1520,12 @@ module internal Parser =
15211520
15221521let matchBraces ( source , fileName , options : FSharpParsingOptions , userOpName : string ) =
15231522 Trace.TraceInformation( " FCS: {0}.{1} ({2})" , userOpName, " matchBraces" , fileName)
1523+
1524+ // Make sure there is an ErrorLogger installed whenever we do stuff that might record errors, even if we ultimately ignore the errors
1525+ let delayedLogger = CapturingErrorLogger( " matchBraces" )
1526+ use _unwindEL= PushErrorLoggerPhaseUntilUnwind( fun _ -> delayedLogger)
1527+ use _unwindBP= PushThreadBuildPhaseUntilUnwind BuildPhase.Parse
1528+
15241529let matchingBraces = new ResizeArray<_>()
15251530 Lexhelp.usingLexbufForParsing( UnicodeLexing.StringAsLexbuf( addNewLine source), fileName) ( fun lexbuf ->
15261531let errHandler = ErrorHandler( false , fileName, options.ErrorSeverityOptions, source)
@@ -2514,7 +2519,7 @@ type BackgroundCompiler(legacyReferenceResolver, projectCacheSize, keepAssemblyC
25142519let! tcErrors , tcFileResult =
25152520 Parser.CheckOneFile( parseResults, source, fileName, options.ProjectFileName, tcPrior.TcConfig, tcPrior.TcGlobals, tcPrior.TcImports,
25162521 tcPrior.TcState, loadClosure, tcPrior.Errors, reactorOps, ( fun () -> builder.IsAlive), textSnapshotInfo, userOpName)
2517- let parsingOptions = FSharpParsingOptions.FromTcConfig( tcPrior.TcConfig, Array.ofList builder.SourceFiles)
2522+ let parsingOptions = FSharpParsingOptions.FromTcConfig( tcPrior.TcConfig, Array.ofList builder.SourceFiles, options.UseScriptResolutionRules )
25182523let checkAnswer = MakeCheckFileAnswer( fileName, tcFileResult, options, builder, Array.ofList tcPrior.TcDependencyFiles, creationErrors, parseResults.Errors, tcErrors)
25192524 bc.RecordTypeCheckFileInProjectResults( fileName, options, parsingOptions, parseResults, fileVersion, tcPrior.TimeStamp, Some checkAnswer, source)
25202525return checkAnswer
@@ -2628,7 +2633,7 @@ type BackgroundCompiler(legacyReferenceResolver, projectCacheSize, keepAssemblyC
26282633let! tcPrior = execWithReactorAsync<| fun ctok -> builder.GetCheckResultsBeforeFileInProject( ctok, filename)
26292634
26302635// Do the parsing.
2631- let parsingOptions = FSharpParsingOptions.FromTcConfig( builder.TcConfig, Array.ofList( builder.SourceFiles))
2636+ let parsingOptions = FSharpParsingOptions.FromTcConfig( builder.TcConfig, Array.ofList( builder.SourceFiles), options.UseScriptResolutionRules )
26322637let parseErrors , parseTreeOpt , anyErrors = Parser.parseFile( source, filename, parsingOptions, userOpName)
26332638let parseTreeOpt = parseTreeOpt|> Option.map builder.DeduplicateParsedInputModuleNameInProject
26342639let parseResults = FSharpParseFileResults( parseErrors, parseTreeOpt, anyErrors, builder.AllDependenciesDeprecated)
@@ -2908,7 +2913,7 @@ type FSharpChecker(legacyReferenceResolver, projectCacheSize, keepAssemblyConten
29082913member ic.GetParsingOptionsFromProjectOptions ( options ): FSharpParsingOptions * _ =
29092914let sourceFiles = List.ofArray options.SourceFiles
29102915let argv = List.ofArray options.OtherOptions
2911- ic.GetParsingOptionsFromCommandLineArgs( sourceFiles, argv)
2916+ ic.GetParsingOptionsFromCommandLineArgs( sourceFiles, argv, options.UseScriptResolutionRules )
29122917
29132918member ic.MatchBraces ( filename , source , options : FSharpProjectOptions , ? userOpName : string ) =
29142919let userOpName = defaultArg userOpName" Unknown"
@@ -3111,16 +3116,17 @@ type FSharpChecker(legacyReferenceResolver, projectCacheSize, keepAssemblyConten
31113116 ExtraProjectInfo= extraProjectInfo
31123117 Stamp= None}
31133118
3114- member ic.GetParsingOptionsFromCommandLineArgs ( initialSourceFiles , argv ) =
3119+ member ic.GetParsingOptionsFromCommandLineArgs ( initialSourceFiles , argv , ? isInteractive ) =
3120+ let isInteractive = defaultArg isInteractivefalse
31153121use errorScope= new ErrorScope()
31163122let tcConfigBuilder = TcConfigBuilder.Initial
31173123
31183124// Apply command-line arguments and collect more source files if they are in the arguments
31193125let sourceFilesNew = ApplyCommandLineArgs( tcConfigBuilder, initialSourceFiles, argv)
3120- FSharpParsingOptions.FromTcConfigBuidler( tcConfigBuilder, Array.ofList sourceFilesNew), errorScope.Diagnostics
3126+ FSharpParsingOptions.FromTcConfigBuidler( tcConfigBuilder, Array.ofList sourceFilesNew, isInteractive ), errorScope.Diagnostics
31213127
3122- member ic.GetParsingOptionsFromCommandLineArgs ( argv ) =
3123- ic.GetParsingOptionsFromCommandLineArgs([], argv)
3128+ member ic.GetParsingOptionsFromCommandLineArgs ( argv , ? isInteractive : bool ) =
3129+ ic.GetParsingOptionsFromCommandLineArgs([], argv, ?isInteractive = isInteractive )
31243130
31253131/// Begin background parsing the given project.
31263132member ic.StartBackgroundCompile ( options , ? userOpName ) =
@@ -3191,7 +3197,7 @@ type FsiInteractiveChecker(legacyReferenceResolver, reactorOps: IReactorOperatio
31913197let userOpName = defaultArg userOpName" Unknown"
31923198let filename = Path.Combine( tcConfig.implicitIncludeDir, " stdin.fsx" )
31933199// Note: projectSourceFiles is only used to compute isLastCompiland, and is ignored if Build.IsScript(mainInputFileName) is true (which it is in this case).
3194- let parsingOptions = FSharpParsingOptions.FromTcConfig( tcConfig, [| filename|])
3200+ let parsingOptions = FSharpParsingOptions.FromTcConfig( tcConfig, [| filename|], true )
31953201let parseErrors , parseTreeOpt , anyErrors = Parser.parseFile( source, filename, parsingOptions, userOpName)
31963202let dependencyFiles = [| |] // interactions have no dependencies
31973203let parseResults = FSharpParseFileResults( parseErrors, parseTreeOpt, parseHadErrors= anyErrors, dependencyFiles= dependencyFiles)
@@ -3234,8 +3240,8 @@ module CompilerEnvironment =
32343240let DefaultReferencesForOrphanSources ( assumeDotNetFramework ) = DefaultReferencesForScriptsAndOutOfProjectSources( assumeDotNetFramework)
32353241
32363242/// Publish compiler-flags parsing logic. Must be fast because its used by the colorizer.
3237- let GetCompilationDefinesForEditing ( filename : string , parsingOptions : FSharpParsingOptions ) =
3238- SourceFileImpl.AdditionalDefinesForUseInEditor( filename ) @
3243+ let GetCompilationDefinesForEditing ( parsingOptions : FSharpParsingOptions ) =
3244+ SourceFileImpl.AdditionalDefinesForUseInEditor( parsingOptions.IsInteractive ) @
32393245 parsingOptions.ConditionalCompilationDefines
32403246
32413247/// Return true if this is a subcategory of error or warning message that the language service can emit