From 780b6c4ad1e13b3bc60dd2b1589220bf5fc4f601 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Wed, 27 Sep 2017 11:55:58 -0700 Subject: [PATCH] Enable FS as prefix and ignore invalid values for warnings (#3631) * enable fs as prefix and ignore invalid values for warnings + tests * Allow #pragma to validate warnings * do it right * use ordinal compare * In both places * Add fs prefix to warnaserror * Fixup tests --- src/fsharp/CompileOps.fs | 13 +++++--- src/fsharp/CompileOptions.fs | 32 ++++++++++++------- .../fsc/dumpAllCommandLineOptions/dummy.fs | 2 +- .../fsc/dumpAllCommandLineOptions/dummy.fsx | 2 +- .../Source/CompilerOptions/fsc/warn/env.lst | 11 ++++++- .../Source/CompilerOptions/fsc/warn/warn40.fs | 5 +++ .../CompilerOptions/fsc/warnaserror/env.lst | 2 ++ .../Source/CompilerOptions/fsc/warnon/env.lst | 2 ++ 8 files changed, 51 insertions(+), 18 deletions(-) create mode 100644 tests/fsharpqa/Source/CompilerOptions/fsc/warn/warn40.fs diff --git a/src/fsharp/CompileOps.fs b/src/fsharp/CompileOps.fs index 45d6e3e78..293ae17cb 100644 --- a/src/fsharp/CompileOps.fs +++ b/src/fsharp/CompileOps.fs @@ -2001,9 +2001,15 @@ let ResolveFileUsingPaths(paths, m, name) = raise (FileNameNotResolved(name, searchMessage, m)) let GetWarningNumber(m, s:string) = - try - Some (int32 s) - with err -> + try + // Okay so ... + // #pragma strips FS of the #pragma "FS0004" and validates the warning number + // therefore if we have warning id that starts with a numeric digit we convert it to Some (int32) + // anything else is ignored None + if Char.IsDigit(s.[0]) then Some (int32 s) + elif s.StartsWith("FS", StringComparison.Ordinal) = true then raise (new ArgumentException()) + else None + with err -> warning(Error(FSComp.SR.buildInvalidWarningNumber(s), m)) None @@ -5549,4 +5555,3 @@ let TypeCheckClosedInputSet (ctok, checkForErrors, tcConfig, tcImports, tcGlobal 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/CompileOptions.fs b/src/fsharp/CompileOptions.fs index 892914d03..40928c1cb 100644 --- a/src/fsharp/CompileOptions.fs +++ b/src/fsharp/CompileOptions.fs @@ -551,31 +551,41 @@ let inputFileFlagsFsc tcConfigB = inputFileFlagsBoth tcConfigB //--------------------------------- let errorsAndWarningsFlags (tcConfigB : TcConfigBuilder) = + let trimFS (s:string) = if s.StartsWith("FS", StringComparison.Ordinal) = true then s.Substring(2) else s + let trimFStoInt (s:string) = + try + Some (int32 (trimFS s)) + with _ -> + errorR(Error(FSComp.SR.buildArgInvalidInt(s),rangeCmdArgs)) + None [ CompilerOption("warnaserror", tagNone, OptionSwitch(fun switch -> tcConfigB.globalWarnAsError <- switch <> OptionSwitch.Off), None, Some (FSComp.SR.optsWarnaserrorPM())); - CompilerOption("warnaserror", tagWarnList, OptionIntListSwitch (fun n switch -> + CompilerOption("warnaserror", tagWarnList, OptionStringListSwitch (fun n switch -> + match trimFStoInt n with + | Some n -> if switch = OptionSwitch.Off then - tcConfigB.specificWarnAsError <- ListSet.remove (=) n tcConfigB.specificWarnAsError ; + tcConfigB.specificWarnAsError <- ListSet.remove (=) n tcConfigB.specificWarnAsError tcConfigB.specificWarnAsWarn <- ListSet.insert (=) n tcConfigB.specificWarnAsWarn else - tcConfigB.specificWarnAsWarn <- ListSet.remove (=) n tcConfigB.specificWarnAsWarn ; - tcConfigB.specificWarnAsError <- ListSet.insert (=) n tcConfigB.specificWarnAsError), None, + tcConfigB.specificWarnAsWarn <- ListSet.remove (=) n tcConfigB.specificWarnAsWarn + tcConfigB.specificWarnAsError <- ListSet.insert (=) n tcConfigB.specificWarnAsError + | None -> () ), None, Some (FSComp.SR.optsWarnaserror())); - + CompilerOption("warn", tagInt, OptionInt (fun n -> tcConfigB.globalWarnLevel <- if (n >= 0 && n <= 5) then n else error(Error(FSComp.SR.optsInvalidWarningLevel(n),rangeCmdArgs))), None, Some (FSComp.SR.optsWarn())); - - CompilerOption("nowarn", tagWarnList, OptionStringList (fun n -> tcConfigB.TurnWarningOff(rangeCmdArgs, n)), None, - Some (FSComp.SR.optsNowarn())); - CompilerOption("warnon", tagWarnList, OptionStringList (fun n -> tcConfigB.TurnWarningOn(rangeCmdArgs,n)), None, - Some(FSComp.SR.optsWarnOn())); - + CompilerOption("nowarn", tagWarnList, OptionStringList (fun n -> tcConfigB.TurnWarningOff(rangeCmdArgs, trimFS n)), None, + Some (FSComp.SR.optsNowarn())); + + CompilerOption("warnon", tagWarnList, OptionStringList (fun n -> tcConfigB.TurnWarningOn(rangeCmdArgs, trimFS n)), None, + Some(FSComp.SR.optsWarnOn())); + CompilerOption("consolecolors", tagNone, OptionSwitch (fun switch -> enableConsoleColoring <- switch = OptionSwitch.On), None, Some (FSComp.SR.optsConsoleColors())) ] diff --git a/tests/fsharpqa/Source/CompilerOptions/fsc/dumpAllCommandLineOptions/dummy.fs b/tests/fsharpqa/Source/CompilerOptions/fsc/dumpAllCommandLineOptions/dummy.fs index 0adca947b..65d7f3ba8 100644 --- a/tests/fsharpqa/Source/CompilerOptions/fsc/dumpAllCommandLineOptions/dummy.fs +++ b/tests/fsharpqa/Source/CompilerOptions/fsc/dumpAllCommandLineOptions/dummy.fs @@ -24,7 +24,7 @@ //section='- CODE GENERATION - ' ! option=tailcalls kind=OptionSwitch //section='- CODE GENERATION - ' ! option=crossoptimize kind=OptionSwitch //section='- ERRORS AND WARNINGS - ' ! option=warnaserror kind=OptionSwitch -//section='- ERRORS AND WARNINGS - ' ! option=warnaserror kind=OptionIntListSwitch +//section='- ERRORS AND WARNINGS - ' ! option=warnaserror kind=OptionStringListSwitch //section='- ERRORS AND WARNINGS - ' ! option=warn kind=OptionInt //section='- ERRORS AND WARNINGS - ' ! option=nowarn kind=OptionStringList //section='- ERRORS AND WARNINGS - ' ! option=warnon kind=OptionStringList diff --git a/tests/fsharpqa/Source/CompilerOptions/fsc/dumpAllCommandLineOptions/dummy.fsx b/tests/fsharpqa/Source/CompilerOptions/fsc/dumpAllCommandLineOptions/dummy.fsx index c112b83d0..aa84cfe70 100644 --- a/tests/fsharpqa/Source/CompilerOptions/fsc/dumpAllCommandLineOptions/dummy.fsx +++ b/tests/fsharpqa/Source/CompilerOptions/fsc/dumpAllCommandLineOptions/dummy.fsx @@ -17,7 +17,7 @@ //section='- CODE GENERATION - ' ! option=tailcalls kind=OptionSwitch //section='- CODE GENERATION - ' ! option=crossoptimize kind=OptionSwitch //section='- ERRORS AND WARNINGS - ' ! option=warnaserror kind=OptionSwitch -//section='- ERRORS AND WARNINGS - ' ! option=warnaserror kind=OptionIntListSwitch +//section='- ERRORS AND WARNINGS - ' ! option=warnaserror kind=OptionStringListSwitch //section='- ERRORS AND WARNINGS - ' ! option=warn kind=OptionInt //section='- ERRORS AND WARNINGS - ' ! option=nowarn kind=OptionStringList //section='- ERRORS AND WARNINGS - ' ! option=warnon kind=OptionStringList diff --git a/tests/fsharpqa/Source/CompilerOptions/fsc/warn/env.lst b/tests/fsharpqa/Source/CompilerOptions/fsc/warn/env.lst index 38ef7217a..7c71fc185 100644 --- a/tests/fsharpqa/Source/CompilerOptions/fsc/warn/env.lst +++ b/tests/fsharpqa/Source/CompilerOptions/fsc/warn/env.lst @@ -10,8 +10,17 @@ NoMT SOURCE=warn5_level5.fs SCFLAGS="--warn:5 --warnaserror" COMPILE_ONLY=1 # w NoMT SOURCE=warn5_level5w.fs SCFLAGS="--warn:5" COMPILE_ONLY=1 # warn5_level5w.fs SOURCE=invalid_warning_level_6.fs SCFLAGS="--warn:6" # invalid_warning_level_6.fs - SOURCE=nowarn.fs SCFLAGS="--warnaserror" # nowarn.fs + SOURCE=nowarn.fs SCFLAGS="--warnaserror" # nowarn.fs + SOURCE=warn40.fs SCFLAGS="--nowarn:40" # warn40a.fs + SOURCE=warn40.fs SCFLAGS="--nowarn:NU0000;FS40;NU0001" # warn40b.fs + SOURCE=warn40.fs SCFLAGS="--nowarn:FS0040" # warn40c.fs SOURCE=nowarn_with_warnaserror01.fs SCFLAGS="--warnaserror --warn:4" COMPILE_ONLY=1 # nowarn_with_warnaserror01.fs SOURCE=nowarn_with_warnaserror02.fs SCFLAGS="--warnaserror --warn:4" COMPILE_ONLY=1 # nowarn_with_warnaserror02.fs SOURCE=nowarn_with_warnaserror03.fs SCFLAGS="--warnaserror --warn:4" COMPILE_ONLY=1 # nowarn_with_warnaserror03.fs + SOURCE=nowarn_with_warnaserror01.fs SCFLAGS="--warnaserror:FS0040 --warn:4" COMPILE_ONLY=1 # nowarn_with_warnaserror01a.fs + SOURCE=nowarn_with_warnaserror02.fs SCFLAGS="--warnaserror:FS0040 --warn:4" COMPILE_ONLY=1 # nowarn_with_warnaserror02a.fs + SOURCE=nowarn_with_warnaserror03.fs SCFLAGS="--warnaserror:FS0040 --warn:4" COMPILE_ONLY=1 # nowarn_with_warnaserror03a.fs + SOURCE=nowarn_with_warnaserror01.fs SCFLAGS="--warnaserror:FS0040 --warn:4" COMPILE_ONLY=1 # nowarn_with_warnaserror01b.fs + SOURCE=nowarn_with_warnaserror02.fs SCFLAGS="--warnaserror:FS0040 --warn:4" COMPILE_ONLY=1 # nowarn_with_warnaserror02b.fs + diff --git a/tests/fsharpqa/Source/CompilerOptions/fsc/warn/warn40.fs b/tests/fsharpqa/Source/CompilerOptions/fsc/warn/warn40.fs new file mode 100644 index 000000000..c9d56fe20 --- /dev/null +++ b/tests/fsharpqa/Source/CompilerOptions/fsc/warn/warn40.fs @@ -0,0 +1,5 @@ +// This causes a warning 40 +[] +let main argv = + let rec x = lazy(x.Value) + 0 // return an integer exit code diff --git a/tests/fsharpqa/Source/CompilerOptions/fsc/warnaserror/env.lst b/tests/fsharpqa/Source/CompilerOptions/fsc/warnaserror/env.lst index f4f100389..fa1ebe026 100644 --- a/tests/fsharpqa/Source/CompilerOptions/fsc/warnaserror/env.lst +++ b/tests/fsharpqa/Source/CompilerOptions/fsc/warnaserror/env.lst @@ -1,3 +1,5 @@ + SOURCE=t1.fs SCFLAGS="--warnaserror+ --warnaserror-:FS25,FS26,FS988 # t1a.fs enabled, ex with all warnings, list with >1 element + SOURCE=t1.fs SCFLAGS="--warnaserror+ --warnaserror-:25,26,988 # t1.fs enabled, excl list with all warnings, list with >1 element SOURCE=t2.fs SCFLAGS="--warnaserror+ --warnaserror-:25,26 # t2.fs enabled, excl list with some warning, list with >1 element SOURCE=t3.fs SCFLAGS="--warnaserror+ --warnaserror-:25 # t3.fs enabled, excl list with one warning, list with 1 element diff --git a/tests/fsharpqa/Source/CompilerOptions/fsc/warnon/env.lst b/tests/fsharpqa/Source/CompilerOptions/fsc/warnon/env.lst index 79000e59b..b570c0a1a 100644 --- a/tests/fsharpqa/Source/CompilerOptions/fsc/warnon/env.lst +++ b/tests/fsharpqa/Source/CompilerOptions/fsc/warnon/env.lst @@ -1,3 +1,5 @@ SOURCE=warnon01.fs SCFLAGS="--warnon:1182 --test:ErrorRanges" COMPILE_ONLY=1 # warnon01.fs SOURCE=warnon01.fsx SCFLAGS="--warnon:1182" COMPILE_ONLY=1 FSIMODE=PIPE # warnon01.fsx + SOURCE=warnon01.fs SCFLAGS="--warnon:NU0001;FS1182;NU0001 --test:ErrorRanges" COMPILE_ONLY=1 # warnon01a.fs + SOURCE=warnon01.fsx SCFLAGS="--warnon:FS1182" COMPILE_ONLY=1 FSIMODE=PIPE # warnon01a.fsx -- GitLab