diff --git a/ReSharper.FSharp/Directory.Build.props b/ReSharper.FSharp/Directory.Build.props index 0a015a1a00..4d27e3bb5a 100644 --- a/ReSharper.FSharp/Directory.Build.props +++ b/ReSharper.FSharp/Directory.Build.props @@ -9,7 +9,7 @@ 2020.1.4 - 2020.1.12 + 2020.2.0 4.7.0 4.5.0 diff --git a/ReSharper.FSharp/ReSharper.FSharp.sln.DotSettings b/ReSharper.FSharp/ReSharper.FSharp.sln.DotSettings index a2611e7655..303ea0b910 100644 --- a/ReSharper.FSharp/ReSharper.FSharp.sln.DotSettings +++ b/ReSharper.FSharp/ReSharper.FSharp.sln.DotSettings @@ -8,9 +8,18 @@ True True True + True True True True True True + True + True + True + True + True + True + True + True diff --git a/ReSharper.FSharp/src/Daemon.FSharp/src/FSharpSymbolHighlightingUtil.cs b/ReSharper.FSharp/src/Daemon.FSharp/src/FSharpSymbolHighlightingUtil.cs index 337bf118b2..787d8926e5 100644 --- a/ReSharper.FSharp/src/Daemon.FSharp/src/FSharpSymbolHighlightingUtil.cs +++ b/ReSharper.FSharp/src/Daemon.FSharp/src/FSharpSymbolHighlightingUtil.cs @@ -13,65 +13,65 @@ public static class FSharpSymbolHighlightingUtil public static string GetEntityHighlightingAttributeId([NotNull] this FSharpEntity entity) { if (entity.IsNamespace) - return FSharpHighlightingAttributeIds.Namespace; + return FSharpHighlightingAttributeIdsModule.Namespace; if (entity.IsEnum) - return FSharpHighlightingAttributeIds.Enum; + return FSharpHighlightingAttributeIdsModule.Enum; if (entity.IsValueType) - return FSharpHighlightingAttributeIds.Struct; + return FSharpHighlightingAttributeIdsModule.Struct; if (entity.IsDelegate) - return FSharpHighlightingAttributeIds.Delegate; + return FSharpHighlightingAttributeIdsModule.Delegate; if (entity.IsFSharpModule) - return FSharpHighlightingAttributeIds.Module; + return FSharpHighlightingAttributeIdsModule.Module; if (entity.IsFSharpUnion) - return FSharpHighlightingAttributeIds.Union; + return FSharpHighlightingAttributeIdsModule.Union; if (entity.IsFSharpRecord) - return FSharpHighlightingAttributeIds.Record; + return FSharpHighlightingAttributeIdsModule.Record; return entity.IsInterface - ? FSharpHighlightingAttributeIds.Interface - : FSharpHighlightingAttributeIds.Class; + ? FSharpHighlightingAttributeIdsModule.Interface + : FSharpHighlightingAttributeIdsModule.Class; } [NotNull] public static string GetMfvHighlightingAttributeId([NotNull] this FSharpMemberOrFunctionOrValue mfv) { if (mfv.IsEvent || mfv.IsEventAddMethod || mfv.IsEventRemoveMethod || mfv.EventForFSharpProperty != null) - return FSharpHighlightingAttributeIds.Event; + return FSharpHighlightingAttributeIdsModule.Event; if (mfv.IsImplicitConstructor || mfv.IsConstructor) return mfv.DeclaringEntity?.Value is FSharpEntity declEntity && declEntity.IsValueType - ? FSharpHighlightingAttributeIds.Struct - : FSharpHighlightingAttributeIds.Class; + ? FSharpHighlightingAttributeIdsModule.Struct + : FSharpHighlightingAttributeIdsModule.Class; var entity = mfv.DeclaringEntity; if (mfv.IsModuleValueOrMember && (entity != null && !entity.Value.IsFSharpModule || mfv.IsExtensionMember)) return mfv.IsProperty || mfv.IsPropertyGetterMethod || mfv.IsPropertySetterMethod - ? FSharpHighlightingAttributeIds.Property - : FSharpHighlightingAttributeIds.Method; + ? FSharpHighlightingAttributeIdsModule.Property + : FSharpHighlightingAttributeIdsModule.Method; if (mfv.LiteralValue != null) - return FSharpHighlightingAttributeIds.Literal; + return FSharpHighlightingAttributeIdsModule.Literal; if (mfv.IsActivePattern) - return FSharpHighlightingAttributeIds.ActivePatternCase; + return FSharpHighlightingAttributeIdsModule.ActivePatternCase; if (mfv.IsMutable || mfv.IsRefCell()) - return FSharpHighlightingAttributeIds.MutableValue; + return FSharpHighlightingAttributeIdsModule.MutableValue; if (IsMangledOpName(mfv.LogicalName)) - return FSharpHighlightingAttributeIds.Operator; + return FSharpHighlightingAttributeIdsModule.Operator; var fsType = mfv.FullType; if (fsType.HasTypeDefinition && fsType.TypeDefinition is var mfvTypeEntity && mfvTypeEntity.IsByRef) - return FSharpHighlightingAttributeIds.MutableValue; + return FSharpHighlightingAttributeIdsModule.MutableValue; - return FSharpHighlightingAttributeIds.Value; + return FSharpHighlightingAttributeIdsModule.Value; } [NotNull] @@ -87,21 +87,21 @@ public static string GetHighlightingAttributeId([NotNull] this FSharpSymbol symb case FSharpField field: return field.IsLiteral - ? FSharpHighlightingAttributeIds.Literal - : FSharpHighlightingAttributeIds.Field; + ? FSharpHighlightingAttributeIdsModule.Literal + : FSharpHighlightingAttributeIdsModule.Field; case FSharpUnionCase _: - return FSharpHighlightingAttributeIds.UnionCase; + return FSharpHighlightingAttributeIdsModule.UnionCase; case FSharpGenericParameter _: - return FSharpHighlightingAttributeIds.TypeParameter; + return FSharpHighlightingAttributeIdsModule.TypeParameter; case FSharpActivePatternCase _: - return FSharpHighlightingAttributeIds.ActivePatternCase; + return FSharpHighlightingAttributeIdsModule.ActivePatternCase; } // some highlighting is needed for tooltip provider - return FSharpHighlightingAttributeIds.Value; + return FSharpHighlightingAttributeIdsModule.Value; } } } diff --git a/ReSharper.FSharp/src/Daemon.FSharp/src/Highlightings/IdentifierHighlighting.cs b/ReSharper.FSharp/src/Daemon.FSharp/src/Highlightings/IdentifierHighlighting.cs index d4797c3225..03c05cf03d 100644 --- a/ReSharper.FSharp/src/Daemon.FSharp/src/Highlightings/IdentifierHighlighting.cs +++ b/ReSharper.FSharp/src/Daemon.FSharp/src/Highlightings/IdentifierHighlighting.cs @@ -9,7 +9,7 @@ public interface IFSharpIdentifierTooltipProvider } [DaemonTooltipProvider(typeof(IFSharpIdentifierTooltipProvider))] - [StaticSeverityHighlighting(Severity.INFO, HighlightingGroupIds.IdentifierHighlightingsGroup, + [StaticSeverityHighlighting(Severity.INFO, typeof(HighlightingGroupIds.IdentifierHighlightings), OverlapResolve = OverlapResolveKind.NONE, ShowToolTipInStatusBar = false)] public class FSharpIdentifierHighlighting : ICustomAttributeIdHighlighting { diff --git a/ReSharper.FSharp/src/Daemon.FSharp/src/Stages/HighlightIdentifiersStage.cs b/ReSharper.FSharp/src/Daemon.FSharp/src/Stages/HighlightIdentifiersStage.cs index f8db2d214d..1099207ee3 100644 --- a/ReSharper.FSharp/src/Daemon.FSharp/src/Stages/HighlightIdentifiersStage.cs +++ b/ReSharper.FSharp/src/Daemon.FSharp/src/Stages/HighlightIdentifiersStage.cs @@ -45,7 +45,7 @@ private void AddHighlightings(IEnumerable symbolsUses, var highlightingId = symbolUse.IsFromComputationExpression - ? FSharpHighlightingAttributeIds.Keyword + ? FSharpHighlightingAttributeIdsModule.Keyword : symbol.GetHighlightingAttributeId(); if (symbolUse.IsFromDefinition && symbol is FSharpMemberOrFunctionOrValue mfv) diff --git a/ReSharper.FSharp/src/FSharp.Common/FSharp.Common.fsproj b/ReSharper.FSharp/src/FSharp.Common/FSharp.Common.fsproj index edbfd7b433..0495757d1f 100644 --- a/ReSharper.FSharp/src/FSharp.Common/FSharp.Common.fsproj +++ b/ReSharper.FSharp/src/FSharp.Common/FSharp.Common.fsproj @@ -39,8 +39,10 @@ - - + + + + diff --git a/ReSharper.FSharp/src/FSharp.Common/src/Checker/FSharpCheckerService.fs b/ReSharper.FSharp/src/FSharp.Common/src/Checker/FSharpCheckerService.fs index aa99275328..3db42a5e1a 100644 --- a/ReSharper.FSharp/src/FSharp.Common/src/Checker/FSharpCheckerService.fs +++ b/ReSharper.FSharp/src/FSharp.Common/src/Checker/FSharpCheckerService.fs @@ -1,7 +1,6 @@ namespace rec JetBrains.ReSharper.Plugins.FSharp.Checker open System -open System.Collections.Generic open System.Runtime.InteropServices open FSharp.Compiler.SourceCodeServices open FSharp.Compiler.Text @@ -11,6 +10,7 @@ open JetBrains.Application open JetBrains.Application.Settings open JetBrains.DataFlow open JetBrains.DocumentModel +open JetBrains.Lifetimes open JetBrains.ProjectModel open JetBrains.ReSharper.Feature.Services open JetBrains.ReSharper.Plugins.FSharp @@ -21,10 +21,15 @@ open JetBrains.ReSharper.Psi.Modules open JetBrains.ReSharper.Psi.Tree open JetBrains.Util +module FSharpCheckerService = + let getSourceText (document: IDocument) = + SourceText.ofString(document.GetText()) + + [] type FSharpCheckerService - (lifetime, logger: ILogger, onSolutionCloseNotifier: OnSolutionCloseNotifier, settingsStore: ISettingsStore, - settingsSchema: SettingsSchema) = + (lifetime: Lifetime, logger: ILogger, onSolutionCloseNotifier: OnSolutionCloseNotifier, + settingsStore: ISettingsStore, settingsSchema: SettingsSchema) = let checker = Environment.SetEnvironmentVariable("FCS_CheckFileInProjectCacheSize", "20") @@ -55,13 +60,23 @@ type FSharpCheckerService if checker.IsValueCreated then checker.Value.InvalidateAll()) - member val OptionsProvider = Unchecked.defaultof with get, set + member val FcsReactorMonitor = Unchecked.defaultof with get, set + member val FcsProjectProvider = Unchecked.defaultof with get, set + member x.Checker = checker.Value - member x.ParseFile(path: FileSystemPath, document: IDocument, parsingOptions: FSharpParsingOptions) = - let source = SourceText.ofString (document.GetText()) + member x.ParseFile(path, document, parsingOptions, [] noCache: bool) = try - let parseResults = x.Checker.ParseFile(path.FullPath, source, parsingOptions).RunAsTask() + let source = FSharpCheckerService.getSourceText document + let fullPath = getFullPath path + + let parseAsync = + if noCache then + x.Checker.ParseFileNoCache(fullPath, source, parsingOptions) + else + x.Checker.ParseFile(fullPath, source, parsingOptions) + + let parseResults = parseAsync.RunAsTask() Some parseResults with | OperationCanceled -> reraise() @@ -71,21 +86,23 @@ type FSharpCheckerService None member x.ParseFile([] sourceFile: IPsiSourceFile) = - let parsingOptions = x.OptionsProvider.GetParsingOptions(sourceFile) + let parsingOptions = x.FcsProjectProvider.GetParsingOptions(sourceFile) x.ParseFile(sourceFile.GetLocation(), sourceFile.Document, parsingOptions) member x.ParseAndCheckFile([] file: IPsiSourceFile, opName, [] allowStaleResults) = - match x.OptionsProvider.GetProjectOptions(file) with + match x.FcsProjectProvider.GetProjectOptions(file) with | None -> None | Some options -> let path = file.GetLocation().FullPath - let source = SourceText.ofString (file.Document.GetText()) + let source = FSharpCheckerService.getSourceText file.Document logger.Trace("ParseAndCheckFile: start {0}, {1}", path, opName) + use op = x.FcsReactorMonitor.MonitorOperation opName + // todo: don't cancel the computation when file didn't change - match x.Checker.ParseAndCheckDocument(path, source, options, allowStaleResults, opName).RunAsTask() with + match x.Checker.ParseAndCheckDocument(path, source, options, allowStaleResults, op.OperationName).RunAsTask() with | Some (parseResults, checkResults) when parseResults.ParseTree.IsSome -> logger.Trace("ParseAndCheckFile: finish {0}, {1}", path, opName) Some { ParseResults = parseResults; CheckResults = checkResults } @@ -95,7 +112,7 @@ type FSharpCheckerService None member x.TryGetStaleCheckResults([] file: IPsiSourceFile, opName) = - match x.OptionsProvider.GetProjectOptions(file) with + match x.FcsProjectProvider.GetProjectOptions(file) with | None -> None | Some options -> @@ -111,9 +128,9 @@ type FSharpCheckerService logger.Trace("TryGetStaleCheckResults: fail {0}, {1}", path, opName) None - member x.InvalidateFSharpProject(fsProject: FSharpProject) = + member x.InvalidateFcsProject(fcsProjectOptions: FSharpProjectOptions) = if checker.IsValueCreated then - checker.Value.InvalidateConfiguration(fsProject.ProjectOptions, false) + checker.Value.InvalidateConfiguration(fcsProjectOptions, false) /// Use with care: returns wrong symbol inside its non-recursive declaration, see dotnet/fsharp#7694. member x.ResolveNameAtLocation(sourceFile: IPsiSourceFile, names, coords, opName) = @@ -123,7 +140,9 @@ type FSharpCheckerService let checkResults = results.CheckResults let fcsPos = getPosFromCoords coords let lineText = sourceFile.Document.GetLineText(coords.Line) - checkResults.GetSymbolUseAtLocation(fcsPos.Line, fcsPos.Column, lineText, names, opName).RunAsTask()) + + use op = x.FcsReactorMonitor.MonitorOperation opName + checkResults.GetSymbolUseAtLocation(fcsPos.Line, fcsPos.Column, lineText, names, op.OperationName).RunAsTask()) /// Use with care: returns wrong symbol inside its non-recursive declaration, see dotnet/fsharp#7694. member x.ResolveNameAtLocation(sourceFile: IPsiSourceFile, name, coords, opName) = @@ -137,31 +156,37 @@ type FSharpCheckerService x.ResolveNameAtLocation(sourceFile, names, coords, opName) -type FSharpProject = - { ProjectOptions: FSharpProjectOptions - ParsingOptions: FSharpParsingOptions - FileIndices: IDictionary - ImplFilesWithSigs: ISet } - - member x.ContainsFile(file: IPsiSourceFile) = - x.FileIndices.ContainsKey(file.GetLocation()) - - type FSharpParseAndCheckResults = { ParseResults: FSharpParseFileResults CheckResults: FSharpCheckFileResults } -type IFSharpProjectOptionsProvider = +type IFcsProjectProvider = abstract GetProjectOptions: IPsiSourceFile -> FSharpProjectOptions option abstract GetParsingOptions: IPsiSourceFile -> FSharpParsingOptions abstract GetFileIndex: IPsiSourceFile -> int + + // Indicates if implementation file has an associated signature file. abstract HasPairFile: IPsiSourceFile -> bool - abstract Invalidate: IProject -> bool + + /// Returns True when the project has been invalidated. + abstract InvalidateReferencesToProject: IProject -> bool + abstract ModuleInvalidated: ISignal - abstract HasFSharpProjects: bool + + /// True when any F# projects are currently known to project options provider after requesting info from FCS. + abstract HasFcsProjects: bool -type IFSharpScriptProjectOptionsProvider = +type IScriptFcsProjectProvider = abstract GetScriptOptions: IPsiSourceFile -> FSharpProjectOptions option abstract GetScriptOptions: FileSystemPath * string -> FSharpProjectOptions option + + +type IMonitoredReactorOperation = + inherit IDisposable + abstract OperationName : string + + +type IFcsReactorMonitor = + abstract MonitorOperation : opName: string -> IMonitoredReactorOperation diff --git a/ReSharper.FSharp/src/FSharp.Common/src/Checker/FSharpProjectOptionsBuilder.fs b/ReSharper.FSharp/src/FSharp.Common/src/Checker/FSharpProjectOptionsBuilder.fs deleted file mode 100644 index 47c9ea349d..0000000000 --- a/ReSharper.FSharp/src/FSharp.Common/src/Checker/FSharpProjectOptionsBuilder.fs +++ /dev/null @@ -1,252 +0,0 @@ -namespace JetBrains.ReSharper.Plugins.FSharp.Checker - -open System -open System.Collections.Generic -open FSharp.Compiler.SourceCodeServices -open JetBrains.Application -open JetBrains.Diagnostics -open JetBrains.ProjectModel -open JetBrains.ProjectModel.ProjectsHost -open JetBrains.ProjectModel.ProjectsHost.MsBuild.Strategies -open JetBrains.ProjectModel.Properties -open JetBrains.ProjectModel.Properties.Managed -open JetBrains.ReSharper.Plugins.FSharp.ProjectModel -open JetBrains.ReSharper.Plugins.FSharp.ProjectModel.ProjectProperties -open JetBrains.ReSharper.Plugins.FSharp.ProjectModel.ProjectItems.ItemsContainer -open JetBrains.ReSharper.Plugins.FSharp.Util -open JetBrains.ReSharper.Psi.Modules -open JetBrains.Util -open JetBrains.Util.Dotnet.TargetFrameworkIds - -module FSharpProperties = - let [] TargetProfile = "TargetProfile" - let [] BaseAddress = "BaseAddress" - let [] OtherFlags = "OtherFlags" - let [] NoWarn = "NoWarn" - let [] WarnAsError = "WarnAsError" - let [] FscToolPath = "FscToolPath" - let [] LangVersion = "LangVersion" - - -[] -type FSharpProjectPropertiesRequest() = - let properties = - [| FSharpProperties.TargetProfile - FSharpProperties.BaseAddress - FSharpProperties.OtherFlags - FSharpProperties.NoWarn - FSharpProperties.WarnAsError - FSharpProperties.FscToolPath - FSharpProperties.LangVersion |] - - interface IProjectPropertiesRequest with - member x.RequestedProperties = properties :> _ - - -[] -type FSharpTargetsProjectLoadModificator() = - let fsTargets = - [| "GenerateCode" - "GenerateFSharpInternalsVisibleToFile" - "GenerateAssemblyFileVersionTask" - "ImplicitlyExpandNETStandardFacades" |] - - interface MsBuildLegacyLoadStrategy.IModificator with - member x.IsApplicable(mark) = - match mark with - | FSharpProjectMark -> true - | _ -> false - - member x.Modify(targets) = - targets.AddRange(fsTargets) - -[] -module ProjectOptions = - let sandboxParsingOptions = - { FSharpParsingOptions.Default with SourceFiles = [| "Sandbox.fs" |] } - - [] - module ImplicitDefines = - let sourceDefines = [ "EDITING"; "COMPILED" ] - let scriptDefines = [ "EDITING"; "INTERACTIVE" ] - - let getImplicitDefines isScript = - if isScript then scriptDefines else sourceDefines - - - -type IFSharpProjectOptionsBuilder = - abstract BuildSingleFSharpProject: IProject * IPsiModule -> FSharpProject - - -[] -type FSharpProjectOptionsBuilder - (checkerService: FSharpCheckerService, logger: ILogger, itemsContainer: IFSharpItemsContainer) = - - let defaultDelimiters = [| ';'; ','; ' ' |] - - let defaultOptions = - [| "--noframework" - "--debug:full" - "--debug+" - "--optimize-" - "--tailcalls-" - "--fullpaths" - "--flaterrors" - "--highentropyva+" - "--noconditionalerasure" |] - - let unusedValuesWarns = - [| "--warnon:1182" |] - - let splitAndTrim (delimiters: char[]) = function - | null -> EmptyArray.Instance - | (s: string) -> s.Split(delimiters, StringSplitOptions.RemoveEmptyEntries) - - let getReferences psiModule = - getReferencePaths (fun _ -> true) psiModule - |> Seq.map (fun r -> "-r:" + r) - - let getOutputType outputType = - match outputType with - | ProjectOutputType.CONSOLE_EXE -> "exe" - | ProjectOutputType.WIN_EXE -> "winexe" - | ProjectOutputType.MODULE -> "module" - | _ -> "library" - - abstract GetProjectItemsPaths: - project: IProject * targetFrameworkId: TargetFrameworkId -> (FileSystemPath * BuildAction)[] - - default x.GetProjectItemsPaths(project, targetFrameworkId) = - let projectMark = project.GetProjectMark().NotNull() - itemsContainer.GetProjectItemsPaths(projectMark, targetFrameworkId) - - member x.GetProjectFilesAndResources(project: IProject, targetFrameworkId) = - let sourceFiles = List() - let resources = List() - - let sigFiles = HashSet() - let implsWithSigs = HashSet() - - let projectItems = x.GetProjectItemsPaths(project, targetFrameworkId) - - for path, buildAction in projectItems do - match buildAction with - | SourceFile -> - sourceFiles.Add(path) |> ignore - let fileName = path.NameWithoutExtension - match path.ExtensionNoDot with - | SigExtension -> sigFiles.Add(fileName) |> ignore - | ImplExtension when sigFiles.Contains(fileName) -> implsWithSigs.add(path) - | _ -> () - - | Resource -> resources.Add(path) |> ignore - | _ -> () - - let resources: IList<_> = if resources.IsEmpty() then EmptyList.InstanceList else resources :> _ - let implsWithSigs: ISet<_> = if implsWithSigs.IsEmpty() then EmptySet.Instance :> _ else implsWithSigs :> _ - - sourceFiles.ToArray(), implsWithSigs, resources - - interface IFSharpProjectOptionsBuilder with - member x.BuildSingleFSharpProject(project: IProject, psiModule: IPsiModule) = - let targetFrameworkId = psiModule.TargetFrameworkId - let properties = project.ProjectProperties - - let options = List() - - let outPath = project.GetOutputFilePath(targetFrameworkId) - if not outPath.IsEmpty then - options.Add("--out:" + outPath.FullPath) - - options.AddRange(defaultOptions) - options.AddRange(unusedValuesWarns) - options.AddRange(getReferences psiModule) - - match properties.ActiveConfigurations.TryGetConfiguration(targetFrameworkId) with - | :? IManagedProjectConfiguration as cfg -> - let definedConstants = splitAndTrim defaultDelimiters cfg.DefineConstants - options.AddRange(definedConstants |> Seq.map (fun c -> "--define:" + c)) - - options.Add("--target:" + getOutputType cfg.OutputType) - - options.Add(sprintf "--warn:%d" cfg.WarningLevel) - - if cfg.TreatWarningsAsErrors then - options.Add("--warnaserror") - - let doc = cfg.DocumentationFile - if not (doc.IsNullOrWhitespace()) then options.Add("--doc:" + doc) - - let props = cfg.PropertiesCollection - - let getOption f p = - match props.TryGetValue(p) with - | true, v when not (v.IsNullOrWhitespace()) -> Some ("--" + p.ToLower() + ":" + f v) - | _ -> None - - [ FSharpProperties.TargetProfile; FSharpProperties.BaseAddress; FSharpProperties.LangVersion ] - |> List.choose (getOption id) - |> options.AddRange - - [ FSharpProperties.NoWarn; FSharpProperties.WarnAsError ] - |> List.choose (getOption (fun v -> (splitAndTrim defaultDelimiters v).Join(","))) - |> options.AddRange - - match props.TryGetValue(FSharpProperties.OtherFlags) with - | true, otherFlags when not (otherFlags.IsNullOrWhitespace()) -> splitAndTrim [| ' ' |] otherFlags - | _ -> EmptyArray.Instance - |> options.AddRange - | _ -> () - - let filePaths, implsWithSig, resources = x.GetProjectFilesAndResources(project, targetFrameworkId) - - options.AddRange(resources |> Seq.map (fun (r: FileSystemPath) -> "--resource:" + r.FullPath)) - let fileIndices = Dictionary() - Array.iteri (fun i p -> fileIndices.[p] <- i) filePaths - - let projectOptions = - { ProjectFileName = sprintf "%O.%O.fsproj" project.ProjectFileLocation targetFrameworkId - ProjectId = None - SourceFiles = Array.map (fun (p: FileSystemPath ) -> p.FullPath) filePaths - OtherOptions = options.ToArray() - ReferencedProjects = Array.empty - IsIncompleteTypeCheckEnvironment = false - UseScriptResolutionRules = false - LoadTime = DateTime.Now - OriginalLoadReferences = List.empty - UnresolvedReferences = None - ExtraProjectInfo = None - Stamp = None } - - let hasFSharpCoreReference options = - options.OtherOptions - |> Seq.exists (fun s -> - s.StartsWith("-r:", StringComparison.Ordinal) && - s.EndsWith("FSharp.Core.dll", StringComparison.Ordinal)) - - let shouldAddFSharpCore options = - not (hasFSharpCoreReference options || options.OtherOptions |> Array.contains "--compiling-fslib") - - let options = - if shouldAddFSharpCore projectOptions then - { projectOptions with - OtherOptions = FSharpCoreFix.ensureCorrectFSharpCore projectOptions.OtherOptions } - else projectOptions - - let parsingOptions, errors = - checkerService.Checker.GetParsingOptionsFromCommandLineArgs(List.ofArray options.OtherOptions) - - let defines = ImplicitDefines.sourceDefines @ parsingOptions.ConditionalCompilationDefines - - let parsingOptions = { parsingOptions with - SourceFiles = options.SourceFiles - ConditionalCompilationDefines = defines } - - if not errors.IsEmpty then - logger.Warn("Getting parsing options: {0}", concatErrors errors) - - { ProjectOptions = projectOptions - ParsingOptions = parsingOptions - FileIndices = fileIndices - ImplFilesWithSigs = implsWithSig } diff --git a/ReSharper.FSharp/src/FSharp.Common/src/Checker/FSharpProjectOptionsProvider.fs b/ReSharper.FSharp/src/FSharp.Common/src/Checker/FSharpProjectOptionsProvider.fs deleted file mode 100644 index 6c1a318d81..0000000000 --- a/ReSharper.FSharp/src/FSharp.Common/src/Checker/FSharpProjectOptionsProvider.fs +++ /dev/null @@ -1,311 +0,0 @@ -namespace rec JetBrains.ReSharper.Plugins.FSharp.Checker - -open System.Collections.Generic -open FSharp.Compiler.SourceCodeServices -open FSharp.Compiler.Text -open JetBrains.Annotations -open JetBrains.Application.changes -open JetBrains.DataFlow -open JetBrains.ProjectModel -open JetBrains.ProjectModel.Assemblies.Impl -open JetBrains.ProjectModel.Build -open JetBrains.ReSharper.Feature.Services.Daemon -open JetBrains.ReSharper.Plugins.FSharp.ProjectModel.Scripts -open JetBrains.ReSharper.Plugins.FSharp -open JetBrains.ReSharper.Plugins.FSharp.Checker -open JetBrains.ReSharper.Plugins.FSharp.ProjectModel -open JetBrains.ReSharper.Plugins.FSharp.ProjectModel.ProjectItems.ItemsContainer -open JetBrains.ReSharper.Plugins.FSharp.ProjectModel.ProjectProperties -open JetBrains.ReSharper.Plugins.FSharp.Settings -open JetBrains.ReSharper.Plugins.FSharp.Util -open JetBrains.ReSharper.Psi -open JetBrains.ReSharper.Psi.Files -open JetBrains.ReSharper.Psi.Modules -open JetBrains.Threading -open JetBrains.Util - -[] -type FSharpProjectOptionsProvider - (lifetime, solution: ISolution, changeManager: ChangeManager, checkerService: FSharpCheckerService, - optionsBuilder: IFSharpProjectOptionsBuilder, scriptOptionsProvider: IFSharpScriptProjectOptionsProvider, - fsFileService: IFSharpFileService, moduleReferenceResolveStore: ModuleReferencesResolveStore, logger: ILogger, - psiModules: IPsiModules, resolveContextManager: PsiModuleResolveContextManager) as this = - inherit RecursiveProjectModelChangeDeltaVisitor() - - let [] invalidatingProjectChangeType = - ProjectModelChangeType.PROPERTIES ||| ProjectModelChangeType.TARGET_FRAMEWORK ||| - ProjectModelChangeType.REFERENCE_TARGET - - let [] invalidatingChildChangeType = - ProjectModelChangeType.ADDED ||| ProjectModelChangeType.REMOVED ||| - ProjectModelChangeType.MOVED_IN ||| ProjectModelChangeType.MOVED_OUT ||| - ProjectModelChangeType.REFERENCE_TARGET - - let projects = Dictionary>() - let psiModulesToFsProjects = Dictionary() - - let locker = JetFastSemiReenterableRWLock() - do - changeManager.Changed2.Advise(lifetime, this.ProcessChange) - checkerService.OptionsProvider <- this - lifetime.OnTermination(fun _ -> checkerService.OptionsProvider <- Unchecked.defaultof<_>) |> ignore - - let moduleInvalidated = new Signal(lifetime, "FSharpPsiModuleInvalidated") - - let tryGetFSharpProject (psiModule: IPsiModule) = - use lock = locker.UsingReadLock() - tryGetValue psiModule psiModulesToFsProjects - - let rec createFSharpProject (project: IProject) (psiModule: IPsiModule) = - let mutable fsProject = Unchecked.defaultof<_> - match psiModulesToFsProjects.TryGetValue(psiModule, &fsProject) with - | true -> fsProject - | _ -> - - logger.Info("Creating options for {0} {1}", project, psiModule) - let fsProject = optionsBuilder.BuildSingleFSharpProject(project, psiModule) - - let referencedProjectsOptions = seq { - let resolveContext = - resolveContextManager.GetOrCreateModuleResolveContext(project, psiModule, psiModule.TargetFrameworkId) - - let referencedProjectsPsiModules = - psiModules.GetModuleReferences(psiModule, resolveContext) - |> Seq.choose (fun reference -> - match reference.Module.ContainingProjectModule with - | FSharpProject referencedProject when - referencedProject.IsOpened && (referencedProject != project) -> - Some reference.Module - | _ -> None) - - for referencedPsiModule in referencedProjectsPsiModules do - let project = referencedPsiModule.ContainingProjectModule :?> IProject - let outPath = project.GetOutputFilePath(referencedPsiModule.TargetFrameworkId).FullPath - let fsProject = createFSharpProject project referencedPsiModule - yield outPath, fsProject.ProjectOptions } - - let options = { fsProject.ProjectOptions with ReferencedProjects = Array.ofSeq referencedProjectsOptions } - let fsProject = { fsProject with ProjectOptions = options } - - psiModulesToFsProjects.[psiModule] <- fsProject - projects.GetOrCreateValue(project, fun () -> Dictionary()).[psiModule] <- fsProject - - fsProject - - let getOrCreateFSharpProject (file: IPsiSourceFile) = - match tryGetFSharpProject file.PsiModule with - | Some _ as result -> result - | _ -> - - match file.GetProject() with - | FSharpProject project -> - use lock = locker.UsingWriteLock() - let fsProject = createFSharpProject project file.PsiModule - Some fsProject - - | _ -> None - - let invalidateProject project = - let invalidatedProjects = HashSet() - let mutable invalidated = false - - let rec invalidate (project: IProject) = - logger.Info("Invalidating {0}", project) - match tryGetValue project projects with - | None -> () - | Some fsProjectsForProject -> - for KeyValue (psiModule, fsProject) in fsProjectsForProject do - checkerService.InvalidateFSharpProject(fsProject) - moduleInvalidated.Fire(psiModule) - psiModulesToFsProjects.Remove(psiModule) |> ignore - invalidated <- true - - fsProjectsForProject.Clear() - - invalidatedProjects.Add(project) |> ignore - // todo: keep referencing projects for invalidating removed projects - let referencesToProject = moduleReferenceResolveStore.GetReferencesToProject(project) - if not (referencesToProject.IsEmpty()) then - logger.Info("Invalidating projects reverencing {0}", project) - for reference in referencesToProject do - match reference.GetProject() with - | FSharpProject referencingProject when - not (invalidatedProjects.Contains(referencingProject)) -> - invalidate referencingProject - | _ -> () - logger.Info("Done invalidating {0}", project) - invalidate project - invalidated - - - let isScriptLike file = - fsFileService.IsScriptLike(file) || file.PsiModule.IsMiscFilesProjectModule() || isNull (file.GetProject()) - - let getParsingOptionsForSingleFile ([] sourceFile: IPsiSourceFile) isScript = - { FSharpParsingOptions.Default with - SourceFiles = [| sourceFile.GetLocation().FullPath |] - ConditionalCompilationDefines = ImplicitDefines.scriptDefines - IsExe = isScript } - - member x.ModuleInvalidated = moduleInvalidated - - member private x.ProcessChange(obj: ChangeEventArgs) = - match obj.ChangeMap.GetChange(solution) with - | null -> () - - | :? ProjectReferenceChange as referenceChange -> - use lock = locker.UsingWriteLock() - let referenceProject = referenceChange.ProjectToModuleReference.OwnerModule - if referenceProject.IsFSharp then - invalidateProject referenceProject |> ignore - - | change -> - if not change.IsClosingSolution then - use lock = locker.UsingWriteLock() - x.VisitDelta(change) - - override x.VisitDelta(change: ProjectModelChange) = - match change.ProjectModelElement with - | :? IProject as project -> - if project.IsFSharp then - if change.ContainsChangeType(invalidatingProjectChangeType) then - invalidateProject project |> ignore - - else if change.IsSubtreeChanged then - let mutable shouldInvalidate = false - let changeVisitor = - { new RecursiveProjectModelChangeDeltaVisitor() with - member x.VisitDelta(change) = - if change.ContainsChangeType(invalidatingChildChangeType) then - shouldInvalidate <- true - - if not shouldInvalidate then - base.VisitDelta(change) } - - change.Accept(changeVisitor) - if shouldInvalidate then - invalidateProject project |> ignore - - if change.IsRemoved then - solution.GetComponent().RemoveProject(project) - - let mutable fsProjects = Unchecked.defaultof<_> - match projects.TryGetValue(project, &fsProjects) with - | false -> () - | _ -> - - logger.Info("Removing {0}", project) - - for KeyValue (psiModule, fsProject) in fsProjects do - checkerService.InvalidateFSharpProject(fsProject) - psiModulesToFsProjects.Remove(psiModule) |> ignore - - projects.Remove(project) |> ignore - - else if project.ProjectProperties.ProjectKind = ProjectKind.SOLUTION_FOLDER then - base.VisitDelta(change) - - | :? ISolution -> base.VisitDelta(change) - | _ -> () - - interface IFSharpProjectOptionsProvider with - member x.GetProjectOptions(file) = - if fsFileService.IsScriptLike(file) then scriptOptionsProvider.GetScriptOptions(file) else - if file.PsiModule.IsMiscFilesProjectModule() then None else - - getOrCreateFSharpProject file - |> Option.map (fun fsProject -> fsProject.ProjectOptions) - - member x.HasPairFile(file) = - if isScriptLike file then false else - - match getOrCreateFSharpProject file with - | Some fsProject -> fsProject.ImplFilesWithSigs.Contains(file.GetLocation()) - | _ -> false - - member x.GetParsingOptions(sourceFile) = - if isNull sourceFile then sandboxParsingOptions else - if isScriptLike sourceFile then getParsingOptionsForSingleFile sourceFile true else - - match getOrCreateFSharpProject sourceFile with - | Some fsProject -> fsProject.ParsingOptions - | _ -> getParsingOptionsForSingleFile sourceFile false - - member x.GetFileIndex(sourceFile) = - if isScriptLike sourceFile then 0 else - - getOrCreateFSharpProject sourceFile - |> Option.bind (fun fsProject -> - let path = sourceFile.GetLocation() - tryGetValue path fsProject.FileIndices) - |> Option.defaultWith (fun _ -> -1) - - member x.ModuleInvalidated = x.ModuleInvalidated :> _ - - member x.Invalidate(project: IProject) = - invalidateProject project - - member x.HasFSharpProjects = not (projects.IsEmpty()) - -[] -type FSharpScriptProjectOptionsProvider - (lifetime, logger: ILogger, checkerService: FSharpCheckerService, scriptOptions: FSharpScriptOptionsProvider) = - - let getScriptOptionsLock = obj() - let defaultFlags = [| "--warnon:1182" |] - - let getOtherFlags languageVersion = - if languageVersion = FSharpLanguageVersion.Default then defaultFlags else - - let languageVersionOptionArg = FSharpLanguageVersion.toCompilerArg languageVersion - Array.append defaultFlags [| languageVersionOptionArg |] - - let otherFlags = - lazy - let languageVersion = scriptOptions.LanguageVersion - let flags = new Property<_>("FSharpScriptOtherFlags", getOtherFlags languageVersion.Value) - IPropertyEx.FlowInto(languageVersion, lifetime, flags, fun version -> getOtherFlags version) - flags - - let fixScriptOptions options = - { options with OtherOptions = FSharpCoreFix.ensureCorrectFSharpCore options.OtherOptions } - - let getOptions (path: FileSystemPath) source = - let path = path.FullPath - let source = SourceText.ofString source - lock getScriptOptionsLock (fun _ -> - let getScriptOptionsAsync = - checkerService.Checker.GetProjectOptionsFromScript(path, source, otherFlags = otherFlags.Value.Value) - try - let options, errors = getScriptOptionsAsync.RunAsTask() - if not errors.IsEmpty then - logger.Warn("Script options for {0}: {1}", path, concatErrors errors) - let options = fixScriptOptions options - Some options - with - | OperationCanceled -> reraise() - | exn -> - logger.Warn("Error while getting script options for {0}: {1}", path, exn.Message) - logger.LogExceptionSilently(exn) - None) - - interface IFSharpScriptProjectOptionsProvider with - member x.GetScriptOptions(path: FileSystemPath, source) = - getOptions path source - - member x.GetScriptOptions(file: IPsiSourceFile) = - let path = file.GetLocation() - let source = file.Document.GetText() - getOptions path source - - -[] -type OutputAssemblyChangeInvalidator(lifetime, outputAssemblies: OutputAssemblies, daemon: IDaemon, psiFiles: IPsiFiles, - provider: IFSharpProjectOptionsProvider) = - do - outputAssemblies.ProjectOutputAssembliesChanged.Advise(lifetime, fun (project: IProject) -> - if not provider.HasFSharpProjects || project.IsFSharp then () else - - if provider.Invalidate(project) then - psiFiles.IncrementModificationTimestamp(null) - daemon.Invalidate()) diff --git a/ReSharper.FSharp/src/FSharp.Common/src/Checker/FcsProjectBuilder.fs b/ReSharper.FSharp/src/FSharp.Common/src/Checker/FcsProjectBuilder.fs new file mode 100644 index 0000000000..4251f86f10 --- /dev/null +++ b/ReSharper.FSharp/src/FSharp.Common/src/Checker/FcsProjectBuilder.fs @@ -0,0 +1,270 @@ +namespace JetBrains.ReSharper.Plugins.FSharp.Checker + +open System +open System.Collections.Generic +open FSharp.Compiler.SourceCodeServices +open JetBrains.Application +open JetBrains.Diagnostics +open JetBrains.ProjectModel +open JetBrains.ProjectModel.ProjectsHost +open JetBrains.ProjectModel.ProjectsHost.MsBuild.Strategies +open JetBrains.ProjectModel.Properties +open JetBrains.ProjectModel.Properties.Managed +open JetBrains.ReSharper.Plugins.FSharp.ProjectModel +open JetBrains.ReSharper.Plugins.FSharp.ProjectModel.ProjectProperties +open JetBrains.ReSharper.Plugins.FSharp.ProjectModel.ProjectItems.ItemsContainer +open JetBrains.ReSharper.Plugins.FSharp.Util +open JetBrains.ReSharper.Psi +open JetBrains.ReSharper.Psi.Modules +open JetBrains.Util +open JetBrains.Util.Dotnet.TargetFrameworkIds + +type FcsProject = + { OutputPath: FileSystemPath + FileIndices: Dictionary + ProjectOptions: FSharpProjectOptions + ParsingOptions: FSharpParsingOptions + ImplementationFilesWithSignatures: ISet } + + member x.IsKnownFile(sourceFile: IPsiSourceFile) = + x.FileIndices.ContainsKey(sourceFile.GetLocation()) + + +type ReferencedModule = + { ReferencedPath: FileSystemPath + ReferencingModules: HashSet } + + static member Create(psiModule: IPsiModule) = + { ReferencedPath = getOutputPath psiModule + ReferencingModules = HashSet() } + + +module FSharpProperties = + let [] TargetProfile = "TargetProfile" + let [] BaseAddress = "BaseAddress" + let [] OtherFlags = "OtherFlags" + let [] NoWarn = "NoWarn" + let [] WarnAsError = "WarnAsError" + let [] FscToolPath = "FscToolPath" + let [] LangVersion = "LangVersion" + + +[] +type FSharpProjectPropertiesRequest() = + let properties = + [| FSharpProperties.TargetProfile + FSharpProperties.BaseAddress + FSharpProperties.OtherFlags + FSharpProperties.NoWarn + FSharpProperties.WarnAsError + FSharpProperties.FscToolPath + FSharpProperties.LangVersion |] + + interface IProjectPropertiesRequest with + member x.RequestedProperties = properties :> _ + + +[] +type FSharpTargetsProjectLoadModificator() = + let fsTargets = + [| "GenerateCode" + "GenerateFSharpInternalsVisibleToFile" + "GenerateAssemblyFileVersionTask" + "ImplicitlyExpandNETStandardFacades" |] + + interface MsBuildLegacyLoadStrategy.IModificator with + member x.IsApplicable(mark) = + match mark with + | FSharpProjectMark -> true + | _ -> false + + member x.Modify(targets) = + targets.AddRange(fsTargets) + +[] +module ProjectOptions = + let sandboxParsingOptions = + { FSharpParsingOptions.Default with SourceFiles = [| "Sandbox.fs" |] } + + [] + module ImplicitDefines = + let sourceDefines = [ "EDITING"; "COMPILED" ] + let scriptDefines = [ "EDITING"; "INTERACTIVE" ] + + let getImplicitDefines isScript = + if isScript then scriptDefines else sourceDefines + + +[] +type FcsProjectBuilder(checkerService: FSharpCheckerService, itemsContainer: IFSharpItemsContainer, logger: ILogger) = + + let itemsDelimiters = [| ';'; ','; ' ' |] + + let defaultOptions = + [| "--noframework" + "--debug:full" + "--debug+" + "--optimize-" + "--tailcalls-" + "--fullpaths" + "--flaterrors" + "--highentropyva+" + "--noconditionalerasure" |] + + let unusedValuesWarns = + [| "--warnon:1182" |] + + let splitAndTrim (delimiters: char[]) (s: string) = + if isNull s then EmptyArray.Instance else + s.Split(delimiters, StringSplitOptions.RemoveEmptyEntries) + + let getReferences psiModule = + getReferencedModules psiModule + |> Seq.map getModuleFullPath + |> Seq.map (fun r -> "-r:" + r) + + let getOutputType (outputType: ProjectOutputType) = + match outputType with + | ProjectOutputType.CONSOLE_EXE -> "exe" + | ProjectOutputType.WIN_EXE -> "winexe" + | ProjectOutputType.MODULE -> "module" + | _ -> "library" + + abstract GetProjectItemsPaths: + project: IProject * targetFrameworkId: TargetFrameworkId -> (FileSystemPath * BuildAction)[] + + default x.GetProjectItemsPaths(project, targetFrameworkId) = + let projectMark = project.GetProjectMark().NotNull() + itemsContainer.GetProjectItemsPaths(projectMark, targetFrameworkId) + + member x.GetProjectFilesAndResources(project: IProject, targetFrameworkId) = + let sourceFiles = List() + let resources = List() + + let sigFiles = HashSet() + let implsWithSigs = HashSet() + + let projectItems = x.GetProjectItemsPaths(project, targetFrameworkId) + + for path, buildAction in projectItems do + match buildAction with + | SourceFile -> + sourceFiles.Add(path) |> ignore + let fileName = path.NameWithoutExtension + match path.ExtensionNoDot with + | SigExtension -> sigFiles.Add(fileName) |> ignore + | ImplExtension when sigFiles.Contains(fileName) -> implsWithSigs.add(path) + | _ -> () + + | Resource -> resources.Add(path) |> ignore + | _ -> () + + let resources: IList<_> = if resources.IsEmpty() then EmptyList.InstanceList else resources :> _ + let implsWithSigs: ISet<_> = if implsWithSigs.IsEmpty() then EmptySet.Instance :> _ else implsWithSigs :> _ + + sourceFiles.ToArray(), implsWithSigs, resources + + member x.BuildFcsProject(psiModule: IPsiModule, project: IProject): FcsProject = + logger.Verbose("Creating FcsProject: {0}", psiModule) + + let targetFrameworkId = psiModule.TargetFrameworkId + let projectProperties = project.ProjectProperties + + let otherOptions = List() + + let outPath = project.GetOutputFilePath(targetFrameworkId) + if not outPath.IsEmpty then + otherOptions.Add("--out:" + outPath.FullPath) + + otherOptions.AddRange(defaultOptions) + otherOptions.AddRange(unusedValuesWarns) + otherOptions.AddRange(getReferences psiModule) + + match projectProperties.ActiveConfigurations.TryGetConfiguration(targetFrameworkId) with + | :? IManagedProjectConfiguration as cfg -> + let definedConstants = splitAndTrim itemsDelimiters cfg.DefineConstants + otherOptions.AddRange(definedConstants |> Seq.map (fun c -> "--define:" + c)) + + otherOptions.Add("--target:" + getOutputType cfg.OutputType) + + otherOptions.Add(sprintf "--warn:%d" cfg.WarningLevel) + + if cfg.TreatWarningsAsErrors then + otherOptions.Add("--warnaserror") + + let doc = cfg.DocumentationFile + if not (doc.IsNullOrWhitespace()) then otherOptions.Add("--doc:" + doc) + + let props = cfg.PropertiesCollection + + let getOption f p = + match props.TryGetValue(p) with + | true, v when not (v.IsNullOrWhitespace()) -> Some ("--" + p.ToLower() + ":" + f v) + | _ -> None + + [ FSharpProperties.TargetProfile; FSharpProperties.BaseAddress; FSharpProperties.LangVersion ] + |> List.choose (getOption id) + |> otherOptions.AddRange + + [ FSharpProperties.NoWarn; FSharpProperties.WarnAsError ] + |> List.choose (getOption (fun v -> (splitAndTrim itemsDelimiters v).Join(","))) + |> otherOptions.AddRange + + match props.TryGetValue(FSharpProperties.OtherFlags) with + | true, otherFlags when not (otherFlags.IsNullOrWhitespace()) -> splitAndTrim [| ' ' |] otherFlags + | _ -> EmptyArray.Instance + |> otherOptions.AddRange + | _ -> () + + let filePaths, implsWithSig, resources = x.GetProjectFilesAndResources(project, targetFrameworkId) + + otherOptions.AddRange(resources |> Seq.map (fun (r: FileSystemPath) -> "--resource:" + r.FullPath)) + let fileIndices = Dictionary() + Array.iteri (fun i p -> fileIndices.[p] <- i) filePaths + + let projectOptions = + { ProjectFileName = sprintf "%O.%O.fsproj" project.ProjectFileLocation targetFrameworkId + ProjectId = None + SourceFiles = Array.map (fun (p: FileSystemPath ) -> p.FullPath) filePaths + OtherOptions = otherOptions.ToArray() + ReferencedProjects = Array.empty + IsIncompleteTypeCheckEnvironment = false + UseScriptResolutionRules = false + LoadTime = DateTime.Now + OriginalLoadReferences = List.empty + UnresolvedReferences = None + ExtraProjectInfo = None + Stamp = None } + + let hasFSharpCoreReference options = + options.OtherOptions + |> Seq.exists (fun s -> + s.StartsWith("-r:", StringComparison.Ordinal) && + s.EndsWith("FSharp.Core.dll", StringComparison.Ordinal)) + + let shouldAddFSharpCore options = + not (hasFSharpCoreReference options || options.OtherOptions |> Array.contains "--compiling-fslib") + + let options = + if shouldAddFSharpCore projectOptions then + { projectOptions with + OtherOptions = FSharpCoreFix.ensureCorrectFSharpCore projectOptions.OtherOptions } + else projectOptions + + let parsingOptions, errors = + checkerService.Checker.GetParsingOptionsFromCommandLineArgs(List.ofArray options.OtherOptions) + + let defines = ImplicitDefines.sourceDefines @ parsingOptions.ConditionalCompilationDefines + + let parsingOptions = { parsingOptions with + SourceFiles = options.SourceFiles + ConditionalCompilationDefines = defines } + + if not errors.IsEmpty then + logger.Warn("Getting parsing options: {0}", concatErrors errors) + + { OutputPath = outPath + ProjectOptions = projectOptions + ParsingOptions = parsingOptions + FileIndices = fileIndices + ImplementationFilesWithSignatures = implsWithSig } diff --git a/ReSharper.FSharp/src/FSharp.Common/src/Checker/FcsProjectProvider.fs b/ReSharper.FSharp/src/FSharp.Common/src/Checker/FcsProjectProvider.fs new file mode 100644 index 0000000000..5af5a67dd3 --- /dev/null +++ b/ReSharper.FSharp/src/FSharp.Common/src/Checker/FcsProjectProvider.fs @@ -0,0 +1,278 @@ +namespace JetBrains.ReSharper.Plugins.FSharp.Checker + +open System.Collections.Generic +open FSharp.Compiler.SourceCodeServices +open JetBrains.Annotations +open JetBrains.Application.Threading +open JetBrains.Application.changes +open JetBrains.DataFlow +open JetBrains.Lifetimes +open JetBrains.ProjectModel +open JetBrains.ProjectModel.Build +open JetBrains.ProjectModel.Tasks +open JetBrains.ReSharper.Feature.Services.Daemon +open JetBrains.ReSharper.Plugins.FSharp.ProjectModel.Scripts +open JetBrains.ReSharper.Plugins.FSharp.Checker +open JetBrains.ReSharper.Plugins.FSharp.ProjectModel +open JetBrains.ReSharper.Plugins.FSharp.ProjectModel.ProjectProperties +open JetBrains.ReSharper.Plugins.FSharp.Util +open JetBrains.ReSharper.Psi +open JetBrains.ReSharper.Psi.Files +open JetBrains.ReSharper.Psi.Modules +open JetBrains.Threading +open JetBrains.Util + + +[] +module FcsProjectProvider = + let isProjectModule (psiModule: IPsiModule) = + psiModule :? IProjectPsiModule + + let getModuleProject (psiModule: IPsiModule) = + psiModule.ContainingProjectModule.As() + + let isFSharpProject (projectModelModule: IModule) = + match projectModelModule with + | :? IProject as project -> project.IsFSharp // todo: check `isOpened`? + | _ -> false + + let isFSharpProjectModule (psiModule: IPsiModule) = + psiModule.IsValid() && isFSharpProject psiModule.ContainingProjectModule + + +[] +type FcsProjectProvider + (lifetime: Lifetime, solution: ISolution, changeManager: ChangeManager, checkerService: FSharpCheckerService, + fcsProjectBuilder: FcsProjectBuilder, scriptFcsProjectProvider: IScriptFcsProjectProvider, + scheduler: ISolutionLoadTasksScheduler, fsFileService: IFSharpFileService, psiModules: IPsiModules, + locks: IShellLocks, logger: ILogger) as this = + inherit RecursiveProjectModelChangeDeltaVisitor() + + let locker = JetFastSemiReenterableRWLock() + + let fcsProjects = Dictionary() + let referencedModules = Dictionary() + + // todo: keep standalone projects +// let fcsStandaloneProjects = Dictionary() // todo + + let dirtyModules = HashSet() + let fcsProjectInvalidated = new Signal(lifetime, "FcsProjectInvalidated") + + let getReferencingModules (psiModule: IPsiModule) = + match tryGetValue psiModule referencedModules with + | None -> Seq.empty + | Some referencedModule -> referencedModule.ReferencingModules :> _ + + let rec invalidateFcsProject (psiModule: IPsiModule) = + match tryGetValue psiModule fcsProjects with + | None -> () + | Some fcsProject -> + + logger.Trace("Start invalidating project: {0}", psiModule) + fcsProjectInvalidated.Fire(psiModule) + + // Invalidate FCS projects for the old project options, before creating new ones. + // todo: try to not invalidate FCS project if a project is not changed actually? + checkerService.InvalidateFcsProject(fcsProject.ProjectOptions) + getReferencingModules psiModule |> Seq.iter invalidateFcsProject + + referencedModules.Remove(psiModule) |> ignore + fcsProjects.Remove(psiModule) |> ignore + dirtyModules.Remove(psiModule) |> ignore + +// if not (psiModule.IsValid()) then // todo: keep change type in dirtyModules? +// solution.GetComponent().RemoveProject(project) + + // todo: remove removed psiModules? (don't we remove them anyway?) (standalone projects only?) + // todo: invalidate resolved symbol cache + // todo: invalidate fcsProjects on request from resolved symbols cache + logger.Trace("Done invalidating project: {0}", psiModule) + + let processDirtyFcsProjects () = + use lock = locker.UsingWriteLock() + if dirtyModules.IsEmpty() then () else + + logger.Verbose("Start invalidating dirty projects") + let modulesToInvalidate = List(dirtyModules) + for psiModule in modulesToInvalidate do + invalidateFcsProject psiModule + logger.Verbose("Done invalidating dirty projects") + + do + // Start listening for the changes after project model is updated. + scheduler.EnqueueTask(SolutionLoadTask("FSharpProjectOptionsProvider", SolutionLoadTaskKinds.StartPsi, fun _ -> + changeManager.Changed2.Advise(lifetime, this.ProcessChange))) + + checkerService.FcsProjectProvider <- this + lifetime.OnTermination(fun _ -> checkerService.FcsProjectProvider <- Unchecked.defaultof<_>) |> ignore + + let tryGetFcsProject (psiModule: IPsiModule): FcsProject option = + use lock = locker.UsingReadLock() + tryGetValue psiModule fcsProjects + + let rec createFcsProject (project: IProject) (psiModule: IPsiModule): FcsProject = + match tryGetValue psiModule fcsProjects with + | Some fcsProject -> fcsProject + | _ -> + + let fcsProject = fcsProjectBuilder.BuildFcsProject(psiModule, project) + + let referencedProjectPsiModules = + getReferencedModules psiModule + |> Seq.filter (fun psiModule -> + psiModule.IsValid() && isProjectModule psiModule && psiModule.ContainingProjectModule != project) + |> List + + let referencedFcsProjects = + referencedProjectPsiModules + |> Seq.filter isFSharpProjectModule + |> Seq.map (fun referencedPsiModule -> + let referencedProject = referencedPsiModule.ContainingProjectModule :?> _ + let referencedFcsProject = createFcsProject referencedProject referencedPsiModule + referencedFcsProject.OutputPath.FullPath, referencedFcsProject.ProjectOptions) + |> Seq.toArray + + let fcsProjectOptions = { fcsProject.ProjectOptions with ReferencedProjects = referencedFcsProjects } + let fcsProject = { fcsProject with ProjectOptions = fcsProjectOptions } + + fcsProjects.[psiModule] <- fcsProject + + for referencedPsiModule in referencedProjectPsiModules do + let referencedModule = referencedModules.GetOrCreateValue(referencedPsiModule, ReferencedModule.Create) + referencedModule.ReferencingModules.Add(psiModule) |> ignore + + fcsProject + + let getOrCreateFcsProject (psiModule: IPsiModule): FcsProject option = + match tryGetFcsProject psiModule with + | Some _ as fcsProject -> fcsProject + | _ -> + + match getModuleProject psiModule with + | FSharpProject project -> + use lock = locker.UsingWriteLock() + let fcsProject = createFcsProject project psiModule + Some fcsProject + + | _ -> None + + let getOrCreateFcsProjectForFile (sourceFile: IPsiSourceFile) = + getOrCreateFcsProject sourceFile.PsiModule + + let isScriptLike file = + fsFileService.IsScriptLike(file) || file.PsiModule.IsMiscFilesProjectModule() || isNull (file.GetProject()) + + let getParsingOptionsForSingleFile ([] sourceFile: IPsiSourceFile) isScript = + { FSharpParsingOptions.Default with + SourceFiles = [| sourceFile.GetLocation().FullPath |] + ConditionalCompilationDefines = ImplicitDefines.scriptDefines + IsExe = isScript } + + let getProjectOptions (sourceFile: IPsiSourceFile) = + let psiModule = sourceFile.PsiModule + + // Scripts belong to separate psi modules even when are in projects, project/misc module check is enough. + if isProjectModule psiModule && not (psiModule.IsMiscFilesProjectModule()) then + match getOrCreateFcsProject psiModule with + | Some fcsProject when fcsProject.IsKnownFile(sourceFile) -> Some fcsProject.ProjectOptions + | _ -> None + + elif psiModule :? FSharpScriptPsiModule then + scriptFcsProjectProvider.GetScriptOptions(sourceFile) + + else + None + + member x.FcsProjectInvalidated = fcsProjectInvalidated + + member private x.ProcessChange(obj: ChangeEventArgs) = + if not (solution.IsValid()) then () else + + match obj.ChangeMap.GetChange(psiModules) with + | null -> () + | change -> + + // todo: check if there's a change for a project module when referenced assembly module is changed? + use lock = locker.UsingWriteLock() + + for moduleChange in change.ModuleChanges do + // todo: ignore `PsiModuleChange.ChangeType.Invalidated`? + if moduleChange.Type <> PsiModuleChange.ChangeType.Added then + dirtyModules.Add(moduleChange.Item) |> ignore + + for fileChange in change.FileChanges do + let changeType = fileChange.Type + if changeType = PsiModuleChange.ChangeType.Added || changeType = PsiModuleChange.ChangeType.Removed then + let psiModule = fileChange.Item.PsiModule + dirtyModules.Add(psiModule) |> ignore + + interface IFcsProjectProvider with + member x.GetProjectOptions(sourceFile) = + locks.AssertReadAccessAllowed() + processDirtyFcsProjects () + + getProjectOptions sourceFile + + member x.HasPairFile(sourceFile) = + locks.AssertReadAccessAllowed() + processDirtyFcsProjects () + + if isScriptLike sourceFile then false else + + match getOrCreateFcsProjectForFile sourceFile with + | Some fsProject -> fsProject.ImplementationFilesWithSignatures.Contains(sourceFile.GetLocation()) + | _ -> false + + member x.GetParsingOptions(sourceFile) = + locks.AssertReadAccessAllowed() + processDirtyFcsProjects () + + if isNull sourceFile then sandboxParsingOptions else + if isScriptLike sourceFile then getParsingOptionsForSingleFile sourceFile true else + + match getOrCreateFcsProjectForFile sourceFile with + | Some fsProject -> fsProject.ParsingOptions + | _ -> getParsingOptionsForSingleFile sourceFile false + + member x.GetFileIndex(sourceFile) = + locks.AssertReadAccessAllowed() + processDirtyFcsProjects () + + if isScriptLike sourceFile then 0 else + + getOrCreateFcsProjectForFile sourceFile + |> Option.bind (fun fsProject -> + let path = sourceFile.GetLocation() + tryGetValue path fsProject.FileIndices) + |> Option.defaultWith (fun _ -> -1) + + member x.ModuleInvalidated = x.FcsProjectInvalidated :> _ + + member x.InvalidateReferencesToProject(project: IProject) = + (false, project.GetPsiModules()) ||> Seq.fold (fun invalidated psiModule -> + tryGetValue psiModule referencedModules + |> Option.map (fun referencedModule -> + (invalidated, referencedModule.ReferencingModules) + ||> Seq.fold (fun invalidated psiModule -> dirtyModules.Add(psiModule) || invalidated)) + |> Option.defaultValue invalidated) + + member x.HasFcsProjects = not (fcsProjects.IsEmpty()) + + +/// Invalidates psi caches when a non-F# project is built and FCS cached resolve results become stale +[] +type OutputAssemblyChangeInvalidator + (lifetime: Lifetime, outputAssemblies: OutputAssemblies, daemon: IDaemon, psiFiles: IPsiFiles, + fcsProjectProvider: IFcsProjectProvider, scheduler: ISolutionLoadTasksScheduler) = + do + scheduler.EnqueueTask(SolutionLoadTask("FSharpProjectOptionsProvider", SolutionLoadTaskKinds.StartPsi, fun _ -> + // todo: track file system changes instead? This currently may be triggered on a project model change too. + outputAssemblies.ProjectOutputAssembliesChanged.Advise(lifetime, fun (project: IProject) -> + if not fcsProjectProvider.HasFcsProjects || project.IsFSharp then () else + + if fcsProjectProvider.InvalidateReferencesToProject(project) then + psiFiles.IncrementModificationTimestamp(null) // Drop cached values. + daemon.Invalidate() // Request files re-highlighting. + ) + )) diff --git a/ReSharper.FSharp/src/FSharp.Common/src/Checker/ScriptFcsProjectProvider.fs b/ReSharper.FSharp/src/FSharp.Common/src/Checker/ScriptFcsProjectProvider.fs new file mode 100644 index 0000000000..6dfb3bfe43 --- /dev/null +++ b/ReSharper.FSharp/src/FSharp.Common/src/Checker/ScriptFcsProjectProvider.fs @@ -0,0 +1,72 @@ +namespace JetBrains.ReSharper.Plugins.FSharp.Checker + +open FSharp.Compiler.SourceCodeServices +open FSharp.Compiler.Text +open JetBrains.DataFlow +open JetBrains.ProjectModel +open JetBrains.ReSharper.Plugins.FSharp +open JetBrains.ReSharper.Plugins.FSharp.ProjectModel +open JetBrains.ReSharper.Plugins.FSharp.Settings +open JetBrains.ReSharper.Plugins.FSharp.Util +open JetBrains.ReSharper.Psi +open JetBrains.Util + +[] +type ScriptFcsProjectProvider + (lifetime, logger: ILogger, checkerService: FSharpCheckerService, scriptSettings: FSharpScriptSettingsProvider) = + + let getScriptOptionsLock = obj() + + let defaultFlags = + [| "--warnon:1182" + + if PlatformUtil.IsRunningOnCore then + "--targetprofile:netcore" + "--simpleresolution" |] + + let getOtherFlags languageVersion = + if languageVersion = FSharpLanguageVersion.Default then defaultFlags else + + let languageVersionOptionArg = FSharpLanguageVersion.toCompilerArg languageVersion + Array.append defaultFlags [| languageVersionOptionArg |] + + let otherFlags = + lazy + let languageVersion = scriptSettings.LanguageVersion + let flags = new Property<_>("FSharpScriptOtherFlags", getOtherFlags languageVersion.Value) + IPropertyEx.FlowInto(languageVersion, lifetime, flags, fun version -> getOtherFlags version) + flags + + let fixScriptOptions options = + { options with OtherOptions = FSharpCoreFix.ensureCorrectFSharpCore options.OtherOptions } + + let getOptions (path: FileSystemPath) source = + let path = path.FullPath + let source = SourceText.ofString source + lock getScriptOptionsLock (fun _ -> + let getScriptOptionsAsync = + checkerService.Checker.GetProjectOptionsFromScript( + path, source, + otherFlags = otherFlags.Value.Value, + assumeDotNetFramework = not PlatformUtil.IsRunningOnCore) + try + let options, errors = getScriptOptionsAsync.RunAsTask() + if not errors.IsEmpty then + logger.Warn("Script options for {0}: {1}", path, concatErrors errors) + let options = fixScriptOptions options + Some options + with + | OperationCanceled -> reraise() + | exn -> + logger.Warn("Error while getting script options for {0}: {1}", path, exn.Message) + logger.LogExceptionSilently(exn) + None) + + interface IScriptFcsProjectProvider with + member x.GetScriptOptions(path: FileSystemPath, source) = + getOptions path source + + member x.GetScriptOptions(file: IPsiSourceFile) = + let path = file.GetLocation() + let source = file.Document.GetText() + getOptions path source diff --git a/ReSharper.FSharp/src/FSharp.Common/src/FcsReactorMonitor.fs b/ReSharper.FSharp/src/FSharp.Common/src/FcsReactorMonitor.fs new file mode 100644 index 0000000000..b2d5f18eae --- /dev/null +++ b/ReSharper.FSharp/src/FSharp.Common/src/FcsReactorMonitor.fs @@ -0,0 +1,163 @@ +namespace JetBrains.ReSharper.Plugins.FSharp + +open System +open System.Collections.Concurrent +open System.Diagnostics +open System.IO +open System.Text.RegularExpressions +open System.Threading +open JetBrains.Application.Threading +open JetBrains.DataFlow +open JetBrains.Diagnostics +open JetBrains.Lifetimes +open JetBrains.Platform.RdFramework.Util +open JetBrains.ProjectModel +open JetBrains.ReSharper.Plugins.FSharp.Checker +open JetBrains.ReSharper.Host.Features.BackgroundTasks +open JetBrains.Util + +[] +module MonitoredReactorOperation = + let empty opName = + { new IMonitoredReactorOperation with + override __.Dispose () = () + override __.OperationName = opName + } + + +[] +type FcsReactorMonitor + (lifetime: Lifetime, backgroundTaskHost: RiderBackgroundTaskHost, threading: IThreading, + checkerService: FSharpCheckerService, logger: ILogger, solution: ISolution) as this = + + inherit TraceListener("FcsReactorMonitor") + + /// How long after the reactor becoming busy that the background task should be shown + let showDelay = new Property("showDelay") + + let mutable lastOperationId = 0L + let operations = ConcurrentDictionary() + + /// How long after the reactor becoming free that the background task should be hidden + let hideDelay = TimeSpan.FromSeconds 0.5 + + /// How long an operation must be running for before a stack trace of the enqueuing thread is dumped + let dumpStackDelay = TimeSpan.FromSeconds 10.0 + + let mutable slowOperationTimer = null + let isReactorBusy = new Property("isReactorBusy") + + let taskHeader = new Property("taskHeader") + let taskDescription = new Property("taskDescription") + let showBackgroundTask = new Property("showBackgroundTask") + + let opStartRegex = Regex(@"--> (.+) \((.+)\), remaining \d+$", RegexOptions.Compiled) + + let createNewTask (activeLifetime: Lifetime) = + let task = + RiderBackgroundTaskBuilder.Create() + .WithTitle("F# Compiler Service is busy...") + .WithHeader(taskHeader) + .WithDescription(taskDescription) + .AsIndeterminate() + .AsNonCancelable() + .Build() + + // Only show the background task after we've been busy for some time + threading.QueueAt( + activeLifetime, + "FcsReactorMonitor.AddNewTask", + showDelay.Value, + fun () -> backgroundTaskHost.AddNewTask(activeLifetime, task)) + + /// Called when a FCS operation starts. + /// Always called from the current FCS reactor thread. + let onOperationStart (opName: string) (opArg: string) = + // Try to parse the operation ID from the front of the opName + let operationId, opName = + let endIndex = opName.IndexOf '}' + if endIndex = -1 || opName.[0] <> '{' then None, opName else + + match Int64.TryParse(opName.Substring(1, endIndex - 1)) with + | false, _ -> None, opName + | true, operationId -> + + let opName = opName.Substring(endIndex + 1) + + match operations.TryGetValue operationId with + | null -> None, opName + | stackTrace -> + + // Warn if the operation still hasn't finished in a few seconds + slowOperationTimer <- + let callback _ = logger.Warn("Operation '{0}' ({1}) is taking a long time. Stack trace:\n{2}", opName, opArg, stackTrace) + new Timer(callback, null, dumpStackDelay, Timeout.InfiniteTimeSpan) + + Some operationId, opName + + taskHeader.SetValue opName |> ignore + + let opArg = if Path.IsPathRooted opArg then Path.GetFileName opArg else opArg + match operationId with + | None -> taskDescription.SetValue(opArg) |> ignore + | Some operationId -> taskDescription.SetValue(sprintf "%s (operation #%d)" opArg operationId) |> ignore + + isReactorBusy.SetValue true |> ignore + + /// Called when a FCS operation ends. + /// Always called from the current FCS reactor thread. + let onOperationEnd () = + // Cancel slow operation timer - the operation is now finished + if isNotNull slowOperationTimer then + slowOperationTimer.Dispose() + slowOperationTimer <- null + + isReactorBusy.SetValue false |> ignore + + let onTrace (message: string) = + // todo: add and use a proper reactor event interface in FCS instead of matching trace messages + + if message.Contains "<--" then + onOperationEnd () + else + let opStartMatch = opStartRegex.Match(message) + if opStartMatch.Success then + onOperationStart (opStartMatch.Groups.[1].Value) (opStartMatch.Groups.[2].Value) + + do + solution.RdFSharpModel().FcsBusyDelayMs.FlowInto(lifetime, showDelay, + fun ms -> TimeSpan.FromMilliseconds(float ms)) + + showBackgroundTask.WhenTrue(lifetime, Action<_> createNewTask) + + isReactorBusy.WhenTrue(lifetime, fun lt -> showBackgroundTask.SetValue true |> ignore) + + isReactorBusy.WhenFalse(lifetime, fun lt -> + threading.QueueAt(lt, "FcsReactorMonitor.HideTask", hideDelay, fun () -> + showBackgroundTask.SetValue false |> ignore)) + + // Start listening for trace events + checkerService.FcsReactorMonitor <- this + Trace.Listeners.Add(this) |> ignore + lifetime.OnTermination(fun () -> + checkerService.FcsReactorMonitor <- Unchecked.defaultof<_> + Trace.Listeners.Remove(this)) |> ignore + + override x.Write(_: string) = () + override x.WriteLine(message: string) = if message.StartsWith "Reactor:" then onTrace message + + interface IFcsReactorMonitor with + override __.MonitorOperation opName = + // Only monitor operations when trace logging is enabled + if not (logger.IsEnabled LoggingLevel.TRACE) then + MonitoredReactorOperation.empty opName + else + + let stackTrace = StackTrace(1, true) + let operationId = Interlocked.Increment &lastOperationId + operations.TryAdd(operationId, stackTrace) |> ignore + + { new IMonitoredReactorOperation with + override __.Dispose () = match operations.TryRemove operationId with _ -> () + override __.OperationName = sprintf "{%d}%s" operationId opName + } diff --git a/ReSharper.FSharp/src/FSharp.Common/src/ProjectModel/FSharpProjectModelUtil.fs b/ReSharper.FSharp/src/FSharp.Common/src/ProjectModel/FSharpProjectModelUtil.fs index 574f7c7ffe..3ab761252f 100644 --- a/ReSharper.FSharp/src/FSharp.Common/src/ProjectModel/FSharpProjectModelUtil.fs +++ b/ReSharper.FSharp/src/FSharp.Common/src/ProjectModel/FSharpProjectModelUtil.fs @@ -1,33 +1,48 @@ [] module JetBrains.ReSharper.Plugins.FSharp.ProjectModel.FSharpProjectModelUtil -open System.Collections.Generic open JetBrains.ProjectModel -open JetBrains.ProjectModel.Assemblies.Impl open JetBrains.ReSharper.Psi.Modules -let getReferencePaths assemblyFilter (psiModule: IPsiModule) = +let getResolveContext (resolveContextManager: PsiModuleResolveContextManager) project psiModule = + resolveContextManager.GetOrCreateModuleResolveContext(project, psiModule, psiModule.TargetFrameworkId) + +let getModuleResolveContext (resolveContextManager: PsiModuleResolveContextManager) (psiModule: IPsiModule) = + let project = psiModule.ContainingProjectModule :?> IProject + getResolveContext resolveContextManager project psiModule + + +let getReferencedModules (psiModule: IPsiModule) = let project = psiModule.ContainingProjectModule :?> _ let solution = psiModule.GetSolution() let psiModules = solution.PsiModules() - let resolveContextManager = solution.GetComponent() + let resolveContextManager = solution.GetComponent() - let result = List() - let resolveContext = resolveContextManager.GetOrCreateProjectResolveContext(project, psiModule.TargetFrameworkId) - for reference in psiModules.GetModuleReferences(psiModule, resolveContext) do + let resolveContext = getResolveContext resolveContextManager project psiModule + psiModules.GetModuleReferences(psiModule, resolveContext) + |> Seq.filter (fun reference -> match reference.Module with - | :? IAssemblyPsiModule as assemblyPsiModule -> - let assembly = assemblyPsiModule.Assembly + | :? IProjectPsiModule as projectPsiModule -> projectPsiModule != project + | _ -> true) + |> Seq.map (fun reference -> reference.Module) + +let getModulePath (psiModule: IPsiModule) = + match psiModule with + | :? IAssemblyPsiModule as assemblyPsiModule -> + assemblyPsiModule.Assembly.Location + + | :? IProjectPsiModule as projectPsiModule -> + projectPsiModule.Project.GetOutputFilePath(projectPsiModule.TargetFrameworkId) - if assemblyFilter assembly then - result.Add(assembly.Location.FullPath) + | _ -> FileSystemPath.Empty - | :? IProjectPsiModule as projectPsiModule -> - let referencedProject = projectPsiModule.Project - if referencedProject <> project then - result.Add(referencedProject.GetOutputFilePath(projectPsiModule.TargetFrameworkId).FullPath) +let getModuleFullPath (psiModule: IPsiModule) = + let path = getModulePath psiModule + path.FullPath - | _ -> () - result +let getOutputPath (psiModule: IPsiModule) = + match psiModule.ContainingProjectModule with + | :? IProject as project -> project.GetOutputFilePath(psiModule.TargetFrameworkId) + | _ -> FileSystemPath.Empty diff --git a/ReSharper.FSharp/src/FSharp.Common/src/ProjectModel/FSharpScriptPsiModuleFactory.fs b/ReSharper.FSharp/src/FSharp.Common/src/ProjectModel/FSharpScriptPsiModuleFactory.fs index 80ad0b7c7b..303db82faf 100644 --- a/ReSharper.FSharp/src/FSharp.Common/src/ProjectModel/FSharpScriptPsiModuleFactory.fs +++ b/ReSharper.FSharp/src/FSharp.Common/src/ProjectModel/FSharpScriptPsiModuleFactory.fs @@ -36,7 +36,7 @@ open JetBrains.Util.Dotnet.TargetFrameworkIds [] type FSharpScriptPsiModulesProvider (lifetime: Lifetime, solution: ISolution, changeManager: ChangeManager, documentManager: DocumentManager, - scriptOptionsProvider: IFSharpScriptProjectOptionsProvider, platformManager: PlatformManager, + scriptOptionsProvider: IScriptFcsProjectProvider, platformManager: PlatformManager, assemblyFactory: AssemblyFactory, projectFileExtensions, projectFileTypeCoordinator) as this = /// There may be multiple project files for a path (i.e. linked in multiple projects) and we must distinguish them. @@ -416,6 +416,10 @@ type FSharpScriptPsiModule if projectHandlers.IsEmpty() then modulesProvider.RemoveProjectFilePsiModule(this) + override x.ToString() = + let typeName = this.GetType().Name + sprintf "%s(%s)" typeName path.FullPath + interface IPsiModule with member x.Name = "F# script: " + path.Name member x.DisplayName = "F# script: " + path.Name diff --git a/ReSharper.FSharp/src/FSharp.Common/src/Settings/FSharpOptions.fs b/ReSharper.FSharp/src/FSharp.Common/src/Settings/FSharpOptions.fs index 18d88a0700..ccb20f283b 100644 --- a/ReSharper.FSharp/src/FSharp.Common/src/Settings/FSharpOptions.fs +++ b/ReSharper.FSharp/src/FSharp.Common/src/Settings/FSharpOptions.fs @@ -52,16 +52,15 @@ type FSharpScriptOptions = [] -type FSharpScriptOptionsProvider(lifetime: Lifetime, settings: IContextBoundSettingsStoreLive) = +type FSharpScriptSettingsProvider(lifetime: Lifetime, settings: IContextBoundSettingsStoreLive) = new (lifetime: Lifetime, solution: ISolution, settingsStore: ISettingsStore) = let settings = settingsStore.BindToContextLive(lifetime, ContextRange.Smart(solution.ToDataContext())) - FSharpScriptOptionsProvider(lifetime, settings) + FSharpScriptSettingsProvider(lifetime, settings) member val LanguageVersion = settings.GetValueProperty(lifetime, fun s -> s.LanguageVersion) member val CustomDefines = settings.GetValueProperty(lifetime, fun s -> s.CustomDefines) - module FSharpTypeHintOptions = let [] pipeReturnTypes = "Show return type hints in |> chains" @@ -91,7 +90,7 @@ type FSharpOptionsPage this.AddComboEnum((fun key -> key.LanguageVersion), FSharpScriptOptions.languageVersion, FSharpLanguageVersion.toString) |> ignore this.AddHeader("Type hints") - let showPipeReturnTypes = this.AddBoolOption((fun key -> key.ShowPipeReturnTypes), RichText(FSharpTypeHintOptions.pipeReturnTypes), null) + this.AddBoolOption((fun key -> key.ShowPipeReturnTypes), RichText(FSharpTypeHintOptions.pipeReturnTypes), null) |> ignore do use _x = this.Indent() [ @@ -100,7 +99,7 @@ type FSharpOptionsPage |> Seq.iter (fun checkbox -> this.AddBinding(checkbox, BindingStyle.IsEnabledProperty, (fun key -> key.ShowPipeReturnTypes), id) ) - + this.AddHeader("FSharp.Compiler.Service options") this.AddBoolOption((fun key -> key.BackgroundTypeCheck), RichText(backgroundTypeCheck), null) |> ignore diff --git a/ReSharper.FSharp/src/FSharp.Common/src/Util/FSharpAssemblyUtil.fs b/ReSharper.FSharp/src/FSharp.Common/src/Util/FSharpAssemblyUtil.fs index aaeb0e3d93..1991abc21f 100644 --- a/ReSharper.FSharp/src/FSharp.Common/src/Util/FSharpAssemblyUtil.fs +++ b/ReSharper.FSharp/src/FSharp.Common/src/Util/FSharpAssemblyUtil.fs @@ -1,4 +1,4 @@ -[] +[] module JetBrains.ReSharper.Plugins.FSharp.Util.FSharpAssemblyUtil open System.Collections.Generic @@ -8,7 +8,6 @@ open JetBrains.Metadata.Utils open JetBrains.ProjectModel open JetBrains.ReSharper.Psi open JetBrains.ReSharper.Psi.Caches -open JetBrains.ReSharper.Psi.Impl.Reflection2 open JetBrains.ReSharper.Psi.Modules open JetBrains.ReSharper.Resources.Shell open JetBrains.Util @@ -97,30 +96,3 @@ let getNestedTypes (declaredElement: IClrDeclaredElement) (symbolScope: ISymbolS | :? ITypeElement as typeElement -> typeElement.NestedTypes :> _ | _ -> Seq.empty -let rec importAutoOpenModule (declaredElement: IClrDeclaredElement) (symbolScope: ISymbolScope)(result: ICollection) = - result.Add(declaredElement) - for typeElement in getNestedTypes declaredElement symbolScope do - for attribute in getAutoOpenAttributes typeElement do - if attribute.PositionParameterCount = 0 then - importAutoOpenModule typeElement symbolScope result - -let getAutoOpenModules (psiAssemblyFileLoader: IPsiAssemblyFileLoader) (assembly: IPsiAssembly) = - let result = List() - - psiAssemblyFileLoader.GetOrLoadAssembly(assembly, true, fun psiAssembly assemblyFile metadataAssembly -> - let attributesSet = assemblyFile.CreateAssemblyAttributes() - let attributes = getAutoOpenAttributes attributesSet - - if attributes.IsEmpty() then () else - - let psiServices = psiAssembly.PsiModule.GetPsiServices() - let symbolScope = psiServices.Symbols.GetSymbolScope(psiAssembly.PsiModule, false, true) - - for attribute in attributes do - let moduleString = attribute.PositionParameter(0).ConstantValue.Value.As() - if moduleString.IsNullOrEmpty() then () else - - for declaredElement in symbolScope.GetElementsByQualifiedName(moduleString) do - importAutoOpenModule declaredElement symbolScope result) |> ignore - - result diff --git a/ReSharper.FSharp/src/FSharp.Common/src/Util/FSharpCompilerAttributesUtil.fs b/ReSharper.FSharp/src/FSharp.Common/src/Util/FSharpCompilerAttributesUtil.fs index 347d814aa6..8bd645805c 100644 --- a/ReSharper.FSharp/src/FSharp.Common/src/Util/FSharpCompilerAttributesUtil.fs +++ b/ReSharper.FSharp/src/FSharp.Common/src/Util/FSharpCompilerAttributesUtil.fs @@ -2,6 +2,7 @@ module JetBrains.ReSharper.Plugins.FSharp.Util.FSharpCompilerAttributesUtil open JetBrains.ReSharper.Psi +open JetBrains.ReSharper.Psi.ExtensionsAPI.Caches2 [] let getCompilationMappingAttrInstanceFlag (attrInstance: IAttributeInstance) = @@ -42,10 +43,6 @@ let isCompiledException (property: IAttributesOwner) = getCompilationMappingFlag property = SourceConstructFlags.Exception -[] -let hasAutoOpenAttribute (attrsOwner: IAttributesOwner) = - attrsOwner.HasAttributeInstance(autoOpenAttrTypeName, false) - [] let getAutoOpenAttributes (attributesSet: IAttributesSet) = attributesSet.GetAttributeInstances(autoOpenAttrTypeName, AttributesSource.Self) diff --git a/ReSharper.FSharp/src/FSharp.Common/src/Util/FSharpGlobalUtil.fs b/ReSharper.FSharp/src/FSharp.Common/src/Util/FSharpGlobalUtil.fs index 5c073dbd7f..3b5d96ed46 100644 --- a/ReSharper.FSharp/src/FSharp.Common/src/Util/FSharpGlobalUtil.fs +++ b/ReSharper.FSharp/src/FSharp.Common/src/Util/FSharpGlobalUtil.fs @@ -9,7 +9,7 @@ module FSharpGlobalUtil = | _ -> null /// Reference equality. - let inline (==) a b = LanguagePrimitives.PhysicalEquality a b + let inline (==) a b = obj.ReferenceEquals(a, b) /// Reference inequality. let inline (!=) a b = not (a == b) diff --git a/ReSharper.FSharp/src/FSharp.Common/src/Util/FSharpHighlightingAttributeIds.fs b/ReSharper.FSharp/src/FSharp.Common/src/Util/FSharpHighlightingAttributeIds.fs index f7e6c1ec32..c2df0dd9f2 100644 --- a/ReSharper.FSharp/src/FSharp.Common/src/Util/FSharpHighlightingAttributeIds.fs +++ b/ReSharper.FSharp/src/FSharp.Common/src/Util/FSharpHighlightingAttributeIds.fs @@ -68,78 +68,69 @@ type FSharpSettingsNamesProvider() = // todo: replace explicit styles with fallback ids when highlighting registration refactoring is finished. -[); - - assembly: - RegisterHighlighter( - FSharpHighlightingAttributeIds.Keyword, - FallbackAttributeId = DefaultLanguageAttributeIds.KEYWORD, - GroupId = FSharpHighlightingAttributeIds.GroupId, - RiderPresentableName = "Syntax//Keyword", - Layer = HighlighterLayer.SYNTAX, - EffectType = EffectType.TEXT, ForegroundColor = "#0000E0", DarkForegroundColor = "#569CD6"); - - assembly: - RegisterHighlighter( - FSharpHighlightingAttributeIds.String, - FallbackAttributeId = DefaultLanguageAttributeIds.STRING, - GroupId = FSharpHighlightingAttributeIds.GroupId, - RiderPresentableName = "Syntax//String", - Layer = HighlighterLayer.SYNTAX, - EffectType = EffectType.TEXT, ForegroundColor = "#A31515", DarkForegroundColor = "#D69D85"); - - assembly: - RegisterHighlighter( - FSharpHighlightingAttributeIds.Number, - FallbackAttributeId = DefaultLanguageAttributeIds.NUMBER, - GroupId = FSharpHighlightingAttributeIds.GroupId, - RiderPresentableName = "Syntax//Number", - Layer = HighlighterLayer.SYNTAX, - EffectType = EffectType.TEXT, ForegroundColor = "#000000", DarkForegroundColor = "#B5CEA8"); - - assembly: - RegisterHighlighter( - FSharpHighlightingAttributeIds.LineComment, - FallbackAttributeId = DefaultLanguageAttributeIds.LINE_COMMENT, - GroupId = FSharpHighlightingAttributeIds.GroupId, - RiderPresentableName = "Comments//Line comment", - Layer = HighlighterLayer.ADDITIONAL_SYNTAX, - EffectType = EffectType.TEXT, ForegroundColor = "#007F00", DarkForegroundColor = "#57A64A"); - - assembly: - RegisterHighlighter( - FSharpHighlightingAttributeIds.BlockComment, - FallbackAttributeId = DefaultLanguageAttributeIds.BLOCK_COMMENT, - GroupId = FSharpHighlightingAttributeIds.GroupId, - RiderPresentableName = "Comments//Block comment", - Layer = HighlighterLayer.ADDITIONAL_SYNTAX, - EffectType = EffectType.TEXT, ForegroundColor = "#007F00", DarkForegroundColor = "#57A64A"); - - assembly: - RegisterHighlighter( - FSharpHighlightingAttributeIds.EscapeCharacter1, - FallbackAttributeId = DefaultLanguageAttributeIds.STRING_ESCAPE_CHARACTER_1, - GroupId = FSharpHighlightingAttributeIds.GroupId, - Layer = FSharpHighlightingAttributeIds.LayerSyntaxPlusOne, - VSPriority = FSharpHighlightingAttributeIds.VsPriorityPlusOne, - EffectType = EffectType.TEXT, ForegroundColor = "#FF007F", DarkForegroundColor = "#E07A00"); - - assembly: - RegisterHighlighter( - FSharpHighlightingAttributeIds.EscapeCharacter2, - FallbackAttributeId = DefaultLanguageAttributeIds.STRING_ESCAPE_CHARACTER_2, - GroupId = FSharpHighlightingAttributeIds.GroupId, - Layer = FSharpHighlightingAttributeIds.LayerSyntaxPlusOne, - VSPriority = FSharpHighlightingAttributeIds.VsPriorityPlusOne, - EffectType = EffectType.TEXT, ForegroundColor = "#FF66B2", DarkForegroundColor = "#FF8D1C"); - - assembly: - RegisterHighlighter( +[); + + RegisterHighlighter( + FSharpHighlightingAttributeIds.Keyword, + FallbackAttributeId = DefaultLanguageAttributeIds.KEYWORD, + GroupId = FSharpHighlightingAttributeIds.GroupId, + RiderPresentableName = "Syntax//Keyword", + Layer = HighlighterLayer.SYNTAX, + EffectType = EffectType.TEXT, ForegroundColor = "#0000E0", DarkForegroundColor = "#569CD6"); + + RegisterHighlighter( + FSharpHighlightingAttributeIds.String, + FallbackAttributeId = DefaultLanguageAttributeIds.STRING, + GroupId = FSharpHighlightingAttributeIds.GroupId, + RiderPresentableName = "Syntax//String", + Layer = HighlighterLayer.SYNTAX, + EffectType = EffectType.TEXT, ForegroundColor = "#A31515", DarkForegroundColor = "#D69D85"); + + RegisterHighlighter( + FSharpHighlightingAttributeIds.Number, + FallbackAttributeId = DefaultLanguageAttributeIds.NUMBER, + GroupId = FSharpHighlightingAttributeIds.GroupId, + RiderPresentableName = "Syntax//Number", + Layer = HighlighterLayer.SYNTAX, + EffectType = EffectType.TEXT, ForegroundColor = "#000000", DarkForegroundColor = "#B5CEA8"); + + RegisterHighlighter( + FSharpHighlightingAttributeIds.LineComment, + FallbackAttributeId = DefaultLanguageAttributeIds.LINE_COMMENT, + GroupId = FSharpHighlightingAttributeIds.GroupId, + RiderPresentableName = "Comments//Line comment", + Layer = HighlighterLayer.ADDITIONAL_SYNTAX, + EffectType = EffectType.TEXT, ForegroundColor = "#007F00", DarkForegroundColor = "#57A64A"); + + RegisterHighlighter( + FSharpHighlightingAttributeIds.BlockComment, + FallbackAttributeId = DefaultLanguageAttributeIds.BLOCK_COMMENT, + GroupId = FSharpHighlightingAttributeIds.GroupId, + RiderPresentableName = "Comments//Block comment", + Layer = HighlighterLayer.ADDITIONAL_SYNTAX, + EffectType = EffectType.TEXT, ForegroundColor = "#007F00", DarkForegroundColor = "#57A64A"); + + RegisterHighlighter( + FSharpHighlightingAttributeIds.EscapeCharacter1, + FallbackAttributeId = DefaultLanguageAttributeIds.STRING_ESCAPE_CHARACTER_1, + GroupId = FSharpHighlightingAttributeIds.GroupId, + Layer = FSharpHighlightingAttributeIds.LayerSyntaxPlusOne, + VSPriority = FSharpHighlightingAttributeIds.VsPriorityPlusOne, + EffectType = EffectType.TEXT, ForegroundColor = "#FF007F", DarkForegroundColor = "#E07A00"); + + RegisterHighlighter( + FSharpHighlightingAttributeIds.EscapeCharacter2, + FallbackAttributeId = DefaultLanguageAttributeIds.STRING_ESCAPE_CHARACTER_2, + GroupId = FSharpHighlightingAttributeIds.GroupId, + Layer = FSharpHighlightingAttributeIds.LayerSyntaxPlusOne, + VSPriority = FSharpHighlightingAttributeIds.VsPriorityPlusOne, + EffectType = EffectType.TEXT, ForegroundColor = "#FF66B2", DarkForegroundColor = "#FF8D1C"); + + RegisterHighlighter( FSharpHighlightingAttributeIds.PreprocessorKeyword, FallbackAttributeId = DefaultLanguageAttributeIds.PREPROCESSOR_KEYWORD, GroupId = FSharpHighlightingAttributeIds.GroupId, @@ -147,229 +138,206 @@ type FSharpSettingsNamesProvider() = Layer = HighlighterLayer.SYNTAX, EffectType = EffectType.TEXT, ForegroundColor = "#0000E0", DarkForegroundColor = "#569CD6"); - assembly: - RegisterHighlighter( - FSharpHighlightingAttributeIds.PreprocessorInactiveBranch, - FallbackAttributeId = DefaultLanguageAttributeIds.PREPROCESSOR_INACTIVE_BRANCH, - GroupId = FSharpHighlightingAttributeIds.GroupId, - RiderPresentableName = "Preprocessor//Inactive branch", - Layer = HighlighterLayer.DEADCODE, - VSPriority = VSPriority.DEADCODE, - EffectType = EffectType.TEXT, ForegroundColor = "DarkGray"); - - assembly: - RegisterHighlighter( - FSharpHighlightingAttributeIds.Namespace, - FallbackAttributeId = DefaultLanguageAttributeIds.NAMESPACE, - GroupId = FSharpHighlightingAttributeIds.GroupId, - RiderPresentableName = "Modules and namespaces//Namespace", - Layer = HighlighterLayer.SYNTAX, - VSPriority = VSPriority.IDENTIFIERS, - EffectType = EffectType.TEXT, ForegroundColor = "DarkBlue", DarkForegroundColor = "LightBlue"); - - assembly: - RegisterHighlighter( - FSharpHighlightingAttributeIds.Module, - FallbackAttributeId = FSharpHighlightingAttributeIds.StaticClass, - GroupId = FSharpHighlightingAttributeIds.GroupId, - RiderPresentableName = "Modules and namespaces//Module", - Layer = HighlighterLayer.SYNTAX, - VSPriority = VSPriority.IDENTIFIERS, - EffectType = EffectType.TEXT, ForegroundColor = "DarkBlue", DarkForegroundColor = "LightBlue"); - - assembly: - RegisterHighlighter( - FSharpHighlightingAttributeIds.Class, - FallbackAttributeId = DefaultLanguageAttributeIds.CLASS, - GroupId = FSharpHighlightingAttributeIds.GroupId, - RiderPresentableName = "Types//Class", - Layer = HighlighterLayer.SYNTAX, - VSPriority = VSPriority.IDENTIFIERS, - EffectType = EffectType.TEXT, ForegroundColor = "DarkBlue", DarkForegroundColor = "LightBlue"); - - assembly: - RegisterHighlighter( - FSharpHighlightingAttributeIds.StaticClass, - FallbackAttributeId = FSharpHighlightingAttributeIds.Class, - GroupId = FSharpHighlightingAttributeIds.GroupId, - RiderPresentableName = "Types//Static class", - Layer = HighlighterLayer.SYNTAX, - VSPriority = VSPriority.IDENTIFIERS, - EffectType = EffectType.TEXT, ForegroundColor = "DarkBlue", DarkForegroundColor = "LightBlue"); - - assembly: - RegisterHighlighter( - FSharpHighlightingAttributeIds.Interface, - FallbackAttributeId = DefaultLanguageAttributeIds.INTERFACE, - GroupId = FSharpHighlightingAttributeIds.GroupId, - RiderPresentableName = "Types//Interface", - Layer = HighlighterLayer.SYNTAX, - VSPriority = VSPriority.IDENTIFIERS, - EffectType = EffectType.TEXT, ForegroundColor = "DarkBlue", DarkForegroundColor = "LightBlue"); - - assembly: - RegisterHighlighter( - FSharpHighlightingAttributeIds.Delegate, - FallbackAttributeId = DefaultLanguageAttributeIds.DELEGATE, - GroupId = FSharpHighlightingAttributeIds.GroupId, - RiderPresentableName = "Types//Delegate", - Layer = HighlighterLayer.SYNTAX, - VSPriority = VSPriority.IDENTIFIERS, - EffectType = EffectType.TEXT, ForegroundColor = "DarkBlue", DarkForegroundColor = "LightBlue"); - - assembly: - RegisterHighlighter( - FSharpHighlightingAttributeIds.Struct, - FallbackAttributeId = DefaultLanguageAttributeIds.STRUCT, - GroupId = FSharpHighlightingAttributeIds.GroupId, - RiderPresentableName = "Types//Struct", - Layer = HighlighterLayer.SYNTAX, - VSPriority = VSPriority.IDENTIFIERS, - EffectType = EffectType.TEXT, ForegroundColor = "DarkBlue", DarkForegroundColor = "LightBlue"); - - assembly: - RegisterHighlighter( - FSharpHighlightingAttributeIds.Enum, - FallbackAttributeId = DefaultLanguageAttributeIds.ENUM, - GroupId = FSharpHighlightingAttributeIds.GroupId, - RiderPresentableName = "Types//Enum", - Layer = HighlighterLayer.SYNTAX, - VSPriority = VSPriority.IDENTIFIERS, - EffectType = EffectType.TEXT, ForegroundColor = "DarkBlue", DarkForegroundColor = "LightBlue"); - - assembly: - RegisterHighlighter( - FSharpHighlightingAttributeIds.TypeParameter, - FallbackAttributeId = DefaultLanguageAttributeIds.TYPE_PARAMETER, - GroupId = FSharpHighlightingAttributeIds.GroupId, - RiderPresentableName = "Types//Type parameter", - Layer = HighlighterLayer.SYNTAX, - VSPriority = VSPriority.IDENTIFIERS, - EffectType = EffectType.TEXT, ForegroundColor = "DarkBlue", DarkForegroundColor = "LightBlue"); - - assembly: - RegisterHighlighter( - FSharpHighlightingAttributeIds.Union, - FallbackAttributeId = FSharpHighlightingAttributeIds.Enum, - GroupId = FSharpHighlightingAttributeIds.GroupId, - RiderPresentableName = "Types//Union", - Layer = HighlighterLayer.SYNTAX, - VSPriority = VSPriority.IDENTIFIERS, - EffectType = EffectType.TEXT, ForegroundColor = "DarkBlue", DarkForegroundColor = "LightBlue"); - - assembly: - RegisterHighlighter( - FSharpHighlightingAttributeIds.UnionCase, - FallbackAttributeId = FSharpHighlightingAttributeIds.Class, - GroupId = FSharpHighlightingAttributeIds.GroupId, - RiderPresentableName = "Types//Union Case", - Layer = HighlighterLayer.SYNTAX, - VSPriority = VSPriority.IDENTIFIERS, - EffectType = EffectType.TEXT, ForegroundColor = "DarkBlue", DarkForegroundColor = "LightBlue"); - - assembly: - RegisterHighlighter( - FSharpHighlightingAttributeIds.Record, - FallbackAttributeId = FSharpHighlightingAttributeIds.Class, - GroupId = FSharpHighlightingAttributeIds.GroupId, - RiderPresentableName = "Types//Record", - Layer = HighlighterLayer.SYNTAX, - VSPriority = VSPriority.IDENTIFIERS, - EffectType = EffectType.TEXT, ForegroundColor = "DarkBlue", DarkForegroundColor = "LightBlue"); - - assembly: - RegisterHighlighter( - FSharpHighlightingAttributeIds.Literal, - FallbackAttributeId = DefaultLanguageAttributeIds.CONSTANT, - GroupId = FSharpHighlightingAttributeIds.GroupId, - RiderPresentableName = "Values//Literal", - Layer = HighlighterLayer.SYNTAX, - VSPriority = VSPriority.IDENTIFIERS, - EffectType = EffectType.TEXT, ForegroundColor = "Purple", DarkForegroundColor = "Violet", - FontStyle = FontStyle.Bold); - - assembly: - RegisterHighlighter( - FSharpHighlightingAttributeIds.Event, - FallbackAttributeId = DefaultLanguageAttributeIds.EVENT, - GroupId = FSharpHighlightingAttributeIds.GroupId, - RiderPresentableName = "Members//Event", - Layer = HighlighterLayer.SYNTAX, - VSPriority = VSPriority.IDENTIFIERS, - EffectType = EffectType.TEXT, ForegroundColor = "Magenta", DarkForegroundColor = "Plum"); - - assembly: - RegisterHighlighter( - FSharpHighlightingAttributeIds.Field, - FallbackAttributeId = DefaultLanguageAttributeIds.FIELD, - GroupId = FSharpHighlightingAttributeIds.GroupId, - RiderPresentableName = "Members//Field", - Layer = HighlighterLayer.SYNTAX, - VSPriority = VSPriority.IDENTIFIERS, - EffectType = EffectType.TEXT, ForegroundColor = "Purple", DarkForegroundColor = "Violet"); - - assembly: - RegisterHighlighter( - FSharpHighlightingAttributeIds.Property, - FallbackAttributeId = DefaultLanguageAttributeIds.PROPERTY, - GroupId = FSharpHighlightingAttributeIds.GroupId, - RiderPresentableName = "Members//Property", - Layer = HighlighterLayer.SYNTAX, - VSPriority = VSPriority.IDENTIFIERS, - EffectType = EffectType.TEXT, ForegroundColor = "Purple", DarkForegroundColor = "Violet"); - - assembly: - RegisterHighlighter( - FSharpHighlightingAttributeIds.Value, - FallbackAttributeId = DefaultLanguageAttributeIds.LOCAL_VARIABLE, - GroupId = FSharpHighlightingAttributeIds.GroupId, - RiderPresentableName = "Values//Value", - Layer = HighlighterLayer.SYNTAX, - VSPriority = VSPriority.IDENTIFIERS, - EffectType = EffectType.TEXT); - - assembly: - RegisterHighlighter( - FSharpHighlightingAttributeIds.MutableValue, - FallbackAttributeId = DefaultLanguageAttributeIds.MUTABLE_LOCAL_VARIABLE, - GroupId = FSharpHighlightingAttributeIds.GroupId, - RiderPresentableName = "Values//Mutable value", - Layer = FSharpHighlightingAttributeIds.LayerSyntaxPlusOne, - VSPriority = FSharpHighlightingAttributeIds.VsPriorityPlusOne, - EffectType = EffectType.TEXT, - FontStyle = FontStyle.Bold); - - assembly: - RegisterHighlighter( - FSharpHighlightingAttributeIds.Method, - FallbackAttributeId = DefaultLanguageAttributeIds.METHOD, - GroupId = FSharpHighlightingAttributeIds.GroupId, - RiderPresentableName = "Members//Method", - Layer = HighlighterLayer.SYNTAX, - VSPriority = VSPriority.IDENTIFIERS, - EffectType = EffectType.TEXT, ForegroundColor = "DarkCyan:Maroon", DarkForegroundColor = "Cyan"); - - assembly: - RegisterHighlighter( - FSharpHighlightingAttributeIds.Operator, - FallbackAttributeId = DefaultLanguageAttributeIds.OVERLOADED_OPERATOR, - GroupId = FSharpHighlightingAttributeIds.GroupId, - RiderPresentableName = "Values//Operator", - Layer = HighlighterLayer.SYNTAX, - VSPriority = VSPriority.IDENTIFIERS, - EffectType = EffectType.TEXT, ForegroundColor = "DarkCyan:Blue", DarkForegroundColor = "Cyan"); - - assembly: - RegisterHighlighter( - FSharpHighlightingAttributeIds.ActivePatternCase, - FallbackAttributeId = FSharpHighlightingAttributeIds.Method, - GroupId = FSharpHighlightingAttributeIds.GroupId, - RiderPresentableName = "Values//Active pattern case", - Layer = HighlighterLayer.SYNTAX, - VSPriority = VSPriority.IDENTIFIERS, - EffectType = EffectType.TEXT, ForegroundColor = "DarkCyan:Blue", DarkForegroundColor = "Cyan")>] -do - () + RegisterHighlighter( + FSharpHighlightingAttributeIds.PreprocessorInactiveBranch, + FallbackAttributeId = DefaultLanguageAttributeIds.PREPROCESSOR_INACTIVE_BRANCH, + GroupId = FSharpHighlightingAttributeIds.GroupId, + RiderPresentableName = "Preprocessor//Inactive branch", + Layer = HighlighterLayer.DEADCODE, + VSPriority = VSPriority.DEADCODE, + EffectType = EffectType.TEXT, ForegroundColor = "DarkGray"); + + RegisterHighlighter( + FSharpHighlightingAttributeIds.Namespace, + FallbackAttributeId = DefaultLanguageAttributeIds.NAMESPACE, + GroupId = FSharpHighlightingAttributeIds.GroupId, + RiderPresentableName = "Modules and namespaces//Namespace", + Layer = HighlighterLayer.SYNTAX, + VSPriority = VSPriority.IDENTIFIERS, + EffectType = EffectType.TEXT, ForegroundColor = "DarkBlue", DarkForegroundColor = "LightBlue"); + + RegisterHighlighter( + FSharpHighlightingAttributeIds.Module, + FallbackAttributeId = FSharpHighlightingAttributeIds.StaticClass, + GroupId = FSharpHighlightingAttributeIds.GroupId, + RiderPresentableName = "Modules and namespaces//Module", + Layer = HighlighterLayer.SYNTAX, + VSPriority = VSPriority.IDENTIFIERS, + EffectType = EffectType.TEXT, ForegroundColor = "DarkBlue", DarkForegroundColor = "LightBlue"); + + RegisterHighlighter( + FSharpHighlightingAttributeIds.Class, + FallbackAttributeId = DefaultLanguageAttributeIds.CLASS, + GroupId = FSharpHighlightingAttributeIds.GroupId, + RiderPresentableName = "Types//Class", + Layer = HighlighterLayer.SYNTAX, + VSPriority = VSPriority.IDENTIFIERS, + EffectType = EffectType.TEXT, ForegroundColor = "DarkBlue", DarkForegroundColor = "LightBlue"); + + RegisterHighlighter( + FSharpHighlightingAttributeIds.StaticClass, + FallbackAttributeId = FSharpHighlightingAttributeIds.Class, + GroupId = FSharpHighlightingAttributeIds.GroupId, + RiderPresentableName = "Types//Static class", + Layer = HighlighterLayer.SYNTAX, + VSPriority = VSPriority.IDENTIFIERS, + EffectType = EffectType.TEXT, ForegroundColor = "DarkBlue", DarkForegroundColor = "LightBlue"); + + RegisterHighlighter( + FSharpHighlightingAttributeIds.Interface, + FallbackAttributeId = DefaultLanguageAttributeIds.INTERFACE, + GroupId = FSharpHighlightingAttributeIds.GroupId, + RiderPresentableName = "Types//Interface", + Layer = HighlighterLayer.SYNTAX, + VSPriority = VSPriority.IDENTIFIERS, + EffectType = EffectType.TEXT, ForegroundColor = "DarkBlue", DarkForegroundColor = "LightBlue"); + + RegisterHighlighter( + FSharpHighlightingAttributeIds.Delegate, + FallbackAttributeId = DefaultLanguageAttributeIds.DELEGATE, + GroupId = FSharpHighlightingAttributeIds.GroupId, + RiderPresentableName = "Types//Delegate", + Layer = HighlighterLayer.SYNTAX, + VSPriority = VSPriority.IDENTIFIERS, + EffectType = EffectType.TEXT, ForegroundColor = "DarkBlue", DarkForegroundColor = "LightBlue"); + + RegisterHighlighter( + FSharpHighlightingAttributeIds.Struct, + FallbackAttributeId = DefaultLanguageAttributeIds.STRUCT, + GroupId = FSharpHighlightingAttributeIds.GroupId, + RiderPresentableName = "Types//Struct", + Layer = HighlighterLayer.SYNTAX, + VSPriority = VSPriority.IDENTIFIERS, + EffectType = EffectType.TEXT, ForegroundColor = "DarkBlue", DarkForegroundColor = "LightBlue"); + + RegisterHighlighter( + FSharpHighlightingAttributeIds.Enum, + FallbackAttributeId = DefaultLanguageAttributeIds.ENUM, + GroupId = FSharpHighlightingAttributeIds.GroupId, + RiderPresentableName = "Types//Enum", + Layer = HighlighterLayer.SYNTAX, + VSPriority = VSPriority.IDENTIFIERS, + EffectType = EffectType.TEXT, ForegroundColor = "DarkBlue", DarkForegroundColor = "LightBlue"); + + RegisterHighlighter( + FSharpHighlightingAttributeIds.TypeParameter, + FallbackAttributeId = DefaultLanguageAttributeIds.TYPE_PARAMETER, + GroupId = FSharpHighlightingAttributeIds.GroupId, + RiderPresentableName = "Types//Type parameter", + Layer = HighlighterLayer.SYNTAX, + VSPriority = VSPriority.IDENTIFIERS, + EffectType = EffectType.TEXT, ForegroundColor = "DarkBlue", DarkForegroundColor = "LightBlue"); + + RegisterHighlighter( + FSharpHighlightingAttributeIds.Union, + FallbackAttributeId = FSharpHighlightingAttributeIds.Enum, + GroupId = FSharpHighlightingAttributeIds.GroupId, + RiderPresentableName = "Types//Union", + Layer = HighlighterLayer.SYNTAX, + VSPriority = VSPriority.IDENTIFIERS, + EffectType = EffectType.TEXT, ForegroundColor = "DarkBlue", DarkForegroundColor = "LightBlue"); + + RegisterHighlighter( + FSharpHighlightingAttributeIds.UnionCase, + FallbackAttributeId = FSharpHighlightingAttributeIds.Class, + GroupId = FSharpHighlightingAttributeIds.GroupId, + RiderPresentableName = "Types//Union Case", + Layer = HighlighterLayer.SYNTAX, + VSPriority = VSPriority.IDENTIFIERS, + EffectType = EffectType.TEXT, ForegroundColor = "DarkBlue", DarkForegroundColor = "LightBlue"); + + RegisterHighlighter( + FSharpHighlightingAttributeIds.Record, + FallbackAttributeId = FSharpHighlightingAttributeIds.Class, + GroupId = FSharpHighlightingAttributeIds.GroupId, + RiderPresentableName = "Types//Record", + Layer = HighlighterLayer.SYNTAX, + VSPriority = VSPriority.IDENTIFIERS, + EffectType = EffectType.TEXT, ForegroundColor = "DarkBlue", DarkForegroundColor = "LightBlue"); + + RegisterHighlighter( + FSharpHighlightingAttributeIds.Literal, + FallbackAttributeId = DefaultLanguageAttributeIds.CONSTANT, + GroupId = FSharpHighlightingAttributeIds.GroupId, + RiderPresentableName = "Values//Literal", + Layer = HighlighterLayer.SYNTAX, + VSPriority = VSPriority.IDENTIFIERS, + EffectType = EffectType.TEXT, ForegroundColor = "Purple", DarkForegroundColor = "Violet", + FontStyle = FontStyle.Bold); + + RegisterHighlighter( + FSharpHighlightingAttributeIds.Event, + FallbackAttributeId = DefaultLanguageAttributeIds.EVENT, + GroupId = FSharpHighlightingAttributeIds.GroupId, + RiderPresentableName = "Members//Event", + Layer = HighlighterLayer.SYNTAX, + VSPriority = VSPriority.IDENTIFIERS, + EffectType = EffectType.TEXT, ForegroundColor = "Magenta", DarkForegroundColor = "Plum"); + + RegisterHighlighter( + FSharpHighlightingAttributeIds.Field, + FallbackAttributeId = DefaultLanguageAttributeIds.FIELD, + GroupId = FSharpHighlightingAttributeIds.GroupId, + RiderPresentableName = "Members//Field", + Layer = HighlighterLayer.SYNTAX, + VSPriority = VSPriority.IDENTIFIERS, + EffectType = EffectType.TEXT, ForegroundColor = "Purple", DarkForegroundColor = "Violet"); + + RegisterHighlighter( + FSharpHighlightingAttributeIds.Property, + FallbackAttributeId = DefaultLanguageAttributeIds.PROPERTY, + GroupId = FSharpHighlightingAttributeIds.GroupId, + RiderPresentableName = "Members//Property", + Layer = HighlighterLayer.SYNTAX, + VSPriority = VSPriority.IDENTIFIERS, + EffectType = EffectType.TEXT, ForegroundColor = "Purple", DarkForegroundColor = "Violet"); + + RegisterHighlighter( + FSharpHighlightingAttributeIds.Value, + FallbackAttributeId = DefaultLanguageAttributeIds.LOCAL_VARIABLE, + GroupId = FSharpHighlightingAttributeIds.GroupId, + RiderPresentableName = "Values//Value", + Layer = HighlighterLayer.SYNTAX, + VSPriority = VSPriority.IDENTIFIERS, + EffectType = EffectType.TEXT); + + RegisterHighlighter( + FSharpHighlightingAttributeIds.MutableValue, + FallbackAttributeId = DefaultLanguageAttributeIds.MUTABLE_LOCAL_VARIABLE, + GroupId = FSharpHighlightingAttributeIds.GroupId, + RiderPresentableName = "Values//Mutable value", + Layer = FSharpHighlightingAttributeIds.LayerSyntaxPlusOne, + VSPriority = FSharpHighlightingAttributeIds.VsPriorityPlusOne, + EffectType = EffectType.TEXT, + FontStyle = FontStyle.Bold); + + RegisterHighlighter( + FSharpHighlightingAttributeIds.Method, + FallbackAttributeId = DefaultLanguageAttributeIds.METHOD, + GroupId = FSharpHighlightingAttributeIds.GroupId, + RiderPresentableName = "Members//Method", + Layer = HighlighterLayer.SYNTAX, + VSPriority = VSPriority.IDENTIFIERS, + EffectType = EffectType.TEXT, ForegroundColor = "DarkCyan:Maroon", DarkForegroundColor = "Cyan"); + + RegisterHighlighter( + FSharpHighlightingAttributeIds.Operator, + FallbackAttributeId = DefaultLanguageAttributeIds.OVERLOADED_OPERATOR, + GroupId = FSharpHighlightingAttributeIds.GroupId, + RiderPresentableName = "Values//Operator", + Layer = HighlighterLayer.SYNTAX, + VSPriority = VSPriority.IDENTIFIERS, + EffectType = EffectType.TEXT, ForegroundColor = "DarkCyan:Blue", DarkForegroundColor = "Cyan"); + + RegisterHighlighter( + FSharpHighlightingAttributeIds.ActivePatternCase, + FallbackAttributeId = FSharpHighlightingAttributeIds.Method, + GroupId = FSharpHighlightingAttributeIds.GroupId, + RiderPresentableName = "Values//Active pattern case", + Layer = HighlighterLayer.SYNTAX, + VSPriority = VSPriority.IDENTIFIERS, + EffectType = EffectType.TEXT, ForegroundColor = "DarkCyan:Blue", DarkForegroundColor = "Cyan")>] +type FSharpHighlightingAttributeIds() = class end module MissingAssemblyReferenceWorkaround = type T(p: FontStyle) = diff --git a/ReSharper.FSharp/src/FSharp.Common/src/Util/FSharpPredefinedType.fs b/ReSharper.FSharp/src/FSharp.Common/src/Util/FSharpPredefinedType.fs index e520dfc9fd..2b310431f7 100644 --- a/ReSharper.FSharp/src/FSharp.Common/src/Util/FSharpPredefinedType.fs +++ b/ReSharper.FSharp/src/FSharp.Common/src/Util/FSharpPredefinedType.fs @@ -13,6 +13,9 @@ let sourceNameAttrTypeName = clrTypeName "Microsoft.FSharp.Core.CompilationSourc [] let compilationMappingAttrTypeName = clrTypeName "Microsoft.FSharp.Core.CompilationMappingAttribute" +[] +let compilationRepresentationAttrTypeName = clrTypeName "Microsoft.FSharp.Core.CompilationRepresentationAttribute" + [] let autoOpenAttrTypeName = clrTypeName "Microsoft.FSharp.Core.AutoOpenAttribute" diff --git a/ReSharper.FSharp/src/FSharp.Common/src/Util/Util.fs b/ReSharper.FSharp/src/FSharp.Common/src/Util/Util.fs index c779164295..f10da474b8 100644 --- a/ReSharper.FSharp/src/FSharp.Common/src/Util/Util.fs +++ b/ReSharper.FSharp/src/FSharp.Common/src/Util/Util.fs @@ -62,6 +62,9 @@ module rec CommonUtil = let isSigFile (path: FileSystemPath) = isSigFileExtension path.ExtensionNoDot + let getFullPath (path: FileSystemPath) = + path.FullPath + type Line = Int32 type Column = Int32 @@ -202,9 +205,16 @@ module rec FSharpMsBuildUtils = [] module PsiUtil = + let private getModuleSymbolScope withReferences (psiModule: IPsiModule) = + psiModule.GetPsiServices().Symbols.GetSymbolScope(psiModule, withReferences, true) + [] let getSymbolScope (psiModule: IPsiModule) = - psiModule.GetPsiServices().Symbols.GetSymbolScope(psiModule, true, true) + getModuleSymbolScope true psiModule + + [] + let getModuleOnlySymbolScope (psiModule: IPsiModule) = + getModuleSymbolScope false psiModule [] let getTokenType ([] node: ITreeNode) = diff --git a/ReSharper.FSharp/src/FSharp.ProjectModelBase/src/FSharpIcons.cs b/ReSharper.FSharp/src/FSharp.ProjectModelBase/src/FSharpIcons.cs index 925c0441c8..e4c8c92a2a 100644 --- a/ReSharper.FSharp/src/FSharp.ProjectModelBase/src/FSharpIcons.cs +++ b/ReSharper.FSharp/src/FSharp.ProjectModelBase/src/FSharpIcons.cs @@ -53,23 +53,23 @@ public sealed class FSharpModule : global::JetBrains.Application.Icons.CompiledI new global::JetBrains.Application.Icons.CompiledIconsCs.CompiledIconCsId(typeof(FSharpModule)); /// Loads the image for Themed Icon FSharpModule theme aspect SymbolsVs11Color. - public global::JetBrains.Application.UI.Icons.Images.TiImage Load_SymbolsVs11Color() + public global::JetBrains.Util.Icons.TiImage Load_SymbolsVs11Color() { - return global::JetBrains.Application.UI.Icons.Images.TiImageConverter.FromCanonicalSExpressionAsciiString( + return global::JetBrains.Util.Icons.TiImageConverter.FromCanonicalSExpressionAsciiString( @"(7:TiImage2:v1(6:Vector(4:Size5:16,16)(7:Drawing(4:Path(4:Fill(5:Solid9:#00FFFFFF))(8:Segments(1:F0:0:1:11:1)(1:L2:160:)(1:L2:162:16)(1:L0:2:16)))(4:Path(4:Fill(6:Linear(5:Start5:0.5,0)(3:End5:0.5,1)(5:Stops9:#FF5D5F620:9:#FF292C2D1:1)))(8:Segments(1:F1:21:11:11:1)(1:L2:151:1)(1:L2:152:14)(1:L1:22:14)))(4:Path(4:Fill(6:Linear(5:Start22:0.5,0.0414000000000001)(3:End10:0.5,1.0168)(5:Stops9:#FF85DAFF0:9:#FF6BB3FF1:1)))(8:Segments(1:F1:31:81:11:1)(1:L2:141:8)(1:L2:142:13)(1:L1:32:13)))(4:Path(4:Fill(6:Linear(5:Start22:0.5,0.0277999999999999)(3:End10:0.5,1.0154)(5:Stops9:#FFFF78FF0:9:#FFFC0EFF1:1)))(8:Segments(1:F1:31:21:11:1)(1:L1:81:2)(1:L1:81:7)(1:L1:31:7)))(4:Path(4:Fill(6:Linear(5:Start5:0.5,0)(3:End5:0.5,1)(5:Stops9:#FFFFF6590:9:#FFD6AF001:1)))(8:Segments(1:F1:91:21:11:1)(1:L2:141:2)(1:L2:141:7)(1:L1:91:7))))(8:ClipMask)))"); } /// Loads the image for Themed Icon FSharpModule theme aspect SymbolsVs11Gray. - public global::JetBrains.Application.UI.Icons.Images.TiImage Load_SymbolsVs11Gray() + public global::JetBrains.Util.Icons.TiImage Load_SymbolsVs11Gray() { - return global::JetBrains.Application.UI.Icons.Images.TiImageConverter.FromCanonicalSExpressionAsciiString( + return global::JetBrains.Util.Icons.TiImageConverter.FromCanonicalSExpressionAsciiString( @"(7:TiImage2:v1(6:Vector(4:Size5:16,16)(7:Drawing(4:Path(4:Fill(5:Solid9:#00FFFFFF))(8:Segments(1:F0:0:1:11:1)(1:L2:160:)(1:L2:162:16)(1:L0:2:16)))(4:Path(4:Fill(5:Solid9:#FFF4F4F4))(8:Segments(1:F1:21:11:11:1)(1:L2:151:1)(1:L2:152:14)(1:L1:22:14)))(4:Path(4:Fill(5:Solid9:#FF642E8D))(8:Segments(1:F1:31:81:11:1)(1:L2:141:8)(1:L2:142:13)(1:L1:32:13)))(4:Path(4:Fill(5:Solid9:#FF642E8D))(8:Segments(1:F1:31:21:11:1)(1:L1:81:2)(1:L1:81:7)(1:L1:31:7)))(4:Path(4:Fill(5:Solid9:#FF642E8D))(8:Segments(1:F1:91:21:11:1)(1:L2:141:2)(1:L2:141:7)(1:L1:91:7))))(8:ClipMask)))"); } /// Loads the image for Themed Icon FSharpModule theme aspect SymbolsVs11GrayDark. - public global::JetBrains.Application.UI.Icons.Images.TiImage Load_SymbolsVs11GrayDark() + public global::JetBrains.Util.Icons.TiImage Load_SymbolsVs11GrayDark() { - return global::JetBrains.Application.UI.Icons.Images.TiImageConverter.FromCanonicalSExpressionAsciiString( + return global::JetBrains.Util.Icons.TiImageConverter.FromCanonicalSExpressionAsciiString( @"(7:TiImage2:v1(6:Vector(4:Size5:16,16)(7:Drawing(4:Path(4:Fill(5:Solid9:#00FFFFFF))(8:Segments(1:F0:0:1:11:1)(1:L2:160:)(1:L2:162:16)(1:L0:2:16)))(4:Path(4:Fill(5:Solid9:#FF252525))(8:Segments(1:F1:21:11:11:1)(1:L2:151:1)(1:L2:152:14)(1:L1:22:14)))(4:Path(4:Fill(5:Solid9:#FFB280D3))(8:Segments(1:F1:31:81:11:1)(1:L2:141:8)(1:L2:142:13)(1:L1:32:13)))(4:Path(4:Fill(5:Solid9:#FFB280D3))(8:Segments(1:F1:31:21:11:1)(1:L1:81:2)(1:L1:81:7)(1:L1:31:7)))(4:Path(4:Fill(5:Solid9:#FFB280D3))(8:Segments(1:F1:91:21:11:1)(1:L2:141:2)(1:L2:141:7)(1:L1:91:7))))(8:ClipMask)))"); } @@ -148,21 +148,21 @@ public sealed class ExtensionOverlay : global::JetBrains.Application.Icons.Compi public static global::JetBrains.UI.Icons.IconId Id = new global::JetBrains.Application.Icons.CompiledIconsCs.CompiledIconCsId(typeof(ExtensionOverlay)); /// Loads the image for Themed Icon ExtensionOverlay theme aspect Color. - public global::JetBrains.Application.UI.Icons.Images.TiImage Load_Color() + public global::JetBrains.Util.Icons.TiImage Load_Color() { - return global::JetBrains.Application.UI.Icons.Images.TiImageConverter.FromCanonicalSExpressionAsciiString(@"(7:TiImage2:v1(6:Vector(4:Size5:16,16)(7:Drawing(4:Path(4:Fill(5:Solid9:#00FFFFFF))(8:Segments(1:F0:0:1:11:1)(1:L2:160:)(1:L2:162:16)(1:L0:2:16)))(4:Path(4:Fill(6:Linear(5:Start9:0.5,0.013)(3:End20:0.5,1.00009090909091)(5:Stops9:#FF3861A00:9:#FF1B3A691:1)))(8:Segments(1:F6:15.0581:81:11:1)(1:L2:145:9.058)(1:L2:141:5)(1:L2:101:5)(1:L2:105:9.058)(1:L5:8.9421:8)(1:L1:81:8)(1:L1:86:12.414)(1:L6:11.5862:16)(1:L6:12.4142:16)(1:L2:166:12.414)(1:L2:161:8)(1:L6:15.0581:8)))(4:Path(4:Fill(6:Linear(5:Start22:0.5,0.0413333333333333)(3:End20:0.5,1.01677777777778)(5:Stops9:#FF6ED8FF0:9:#FF80FFF41:1)))(8:Segments(1:F2:111:71:11:1)(1:L2:111:6)(1:L2:131:6)(1:L2:131:7)(1:F2:111:71:10:)(1:F2:131:81:11:1)(1:L2:111:8)(1:L2:116:11.472)(1:L1:95:9.472)(1:L1:92:12)(1:L2:122:15)(1:L2:152:12)(1:L2:155:9.472)(1:L2:136:11.472)(1:F2:131:81:10:))))(8:ClipMask)))"); + return global::JetBrains.Util.Icons.TiImageConverter.FromCanonicalSExpressionAsciiString(@"(7:TiImage2:v1(6:Vector(4:Size5:16,16)(7:Drawing(4:Path(4:Fill(5:Solid9:#00FFFFFF))(8:Segments(1:F0:0:1:11:1)(1:L2:160:)(1:L2:162:16)(1:L0:2:16)))(4:Path(4:Fill(6:Linear(5:Start9:0.5,0.013)(3:End20:0.5,1.00009090909091)(5:Stops9:#FF3861A00:9:#FF1B3A691:1)))(8:Segments(1:F6:15.0581:81:11:1)(1:L2:145:9.058)(1:L2:141:5)(1:L2:101:5)(1:L2:105:9.058)(1:L5:8.9421:8)(1:L1:81:8)(1:L1:86:12.414)(1:L6:11.5862:16)(1:L6:12.4142:16)(1:L2:166:12.414)(1:L2:161:8)(1:L6:15.0581:8)))(4:Path(4:Fill(6:Linear(5:Start22:0.5,0.0413333333333333)(3:End20:0.5,1.01677777777778)(5:Stops9:#FF6ED8FF0:9:#FF80FFF41:1)))(8:Segments(1:F2:111:71:11:1)(1:L2:111:6)(1:L2:131:6)(1:L2:131:7)(1:F2:111:71:10:)(1:F2:131:81:11:1)(1:L2:111:8)(1:L2:116:11.472)(1:L1:95:9.472)(1:L1:92:12)(1:L2:122:15)(1:L2:152:12)(1:L2:155:9.472)(1:L2:136:11.472)(1:F2:131:81:10:))))(8:ClipMask)))"); } /// Loads the image for Themed Icon ExtensionOverlay theme aspect Gray. - public global::JetBrains.Application.UI.Icons.Images.TiImage Load_Gray() + public global::JetBrains.Util.Icons.TiImage Load_Gray() { - return global::JetBrains.Application.UI.Icons.Images.TiImageConverter.FromCanonicalSExpressionAsciiString(@"(7:TiImage2:v1(6:Vector(4:Size5:16,16)(7:Drawing(4:Path(4:Fill(5:Solid9:#00FFFFFF))(8:Segments(1:F0:0:1:11:1)(1:L2:160:)(1:L2:162:16)(1:L0:2:16)))(4:Path(4:Fill(5:Solid9:#FFF4F4F4))(8:Segments(1:F6:15.0581:81:11:1)(1:L2:145:9.058)(1:L2:141:5)(1:L2:101:5)(1:L2:105:9.058)(1:L5:8.9421:8)(1:L1:81:8)(1:L1:86:12.414)(1:L6:11.5862:16)(1:L6:12.4142:16)(1:L2:166:12.414)(1:L2:161:8)(1:L6:15.0581:8)))(4:Path(4:Fill(5:Solid9:#FF00539C))(8:Segments(1:F2:111:71:11:1)(1:L2:111:6)(1:L2:131:6)(1:L2:131:7)(1:F2:111:71:10:)(1:F2:131:81:11:1)(1:L2:111:8)(1:L2:116:11.472)(1:L1:95:9.472)(1:L1:92:12)(1:L2:122:15)(1:L2:152:12)(1:L2:155:9.472)(1:L2:136:11.472)(1:F2:131:81:10:))))(8:ClipMask)))"); + return global::JetBrains.Util.Icons.TiImageConverter.FromCanonicalSExpressionAsciiString(@"(7:TiImage2:v1(6:Vector(4:Size5:16,16)(7:Drawing(4:Path(4:Fill(5:Solid9:#00FFFFFF))(8:Segments(1:F0:0:1:11:1)(1:L2:160:)(1:L2:162:16)(1:L0:2:16)))(4:Path(4:Fill(5:Solid9:#FFF4F4F4))(8:Segments(1:F6:15.0581:81:11:1)(1:L2:145:9.058)(1:L2:141:5)(1:L2:101:5)(1:L2:105:9.058)(1:L5:8.9421:8)(1:L1:81:8)(1:L1:86:12.414)(1:L6:11.5862:16)(1:L6:12.4142:16)(1:L2:166:12.414)(1:L2:161:8)(1:L6:15.0581:8)))(4:Path(4:Fill(5:Solid9:#FF00539C))(8:Segments(1:F2:111:71:11:1)(1:L2:111:6)(1:L2:131:6)(1:L2:131:7)(1:F2:111:71:10:)(1:F2:131:81:11:1)(1:L2:111:8)(1:L2:116:11.472)(1:L1:95:9.472)(1:L1:92:12)(1:L2:122:15)(1:L2:152:12)(1:L2:155:9.472)(1:L2:136:11.472)(1:F2:131:81:10:))))(8:ClipMask)))"); } /// Loads the image for Themed Icon ExtensionOverlay theme aspect GrayDark. - public global::JetBrains.Application.UI.Icons.Images.TiImage Load_GrayDark() + public global::JetBrains.Util.Icons.TiImage Load_GrayDark() { - return global::JetBrains.Application.UI.Icons.Images.TiImageConverter.FromCanonicalSExpressionAsciiString(@"(7:TiImage2:v1(6:Vector(4:Size5:16,16)(7:Drawing(4:Path(4:Fill(5:Solid9:#00FFFFFF))(8:Segments(1:F0:0:1:11:1)(1:L2:160:)(1:L2:162:16)(1:L0:2:16)))(4:Path(4:Fill(5:Solid9:#FF252525))(8:Segments(1:F6:15.0581:81:11:1)(1:L2:145:9.058)(1:L2:141:5)(1:L2:101:5)(1:L2:105:9.058)(1:L5:8.9421:8)(1:L1:81:8)(1:L1:86:12.414)(1:L6:11.5862:16)(1:L6:12.4142:16)(1:L2:166:12.414)(1:L2:161:8)(1:L6:15.0581:8)))(4:Path(4:Fill(5:Solid9:#FF7CBEFF))(8:Segments(1:F2:111:71:11:1)(1:L2:111:6)(1:L2:131:6)(1:L2:131:7)(1:F2:111:71:10:)(1:F2:131:81:11:1)(1:L2:111:8)(1:L2:116:11.472)(1:L1:95:9.472)(1:L1:92:12)(1:L2:122:15)(1:L2:152:12)(1:L2:155:9.472)(1:L2:136:11.472)(1:F2:131:81:10:))))(8:ClipMask)))"); + return global::JetBrains.Util.Icons.TiImageConverter.FromCanonicalSExpressionAsciiString(@"(7:TiImage2:v1(6:Vector(4:Size5:16,16)(7:Drawing(4:Path(4:Fill(5:Solid9:#00FFFFFF))(8:Segments(1:F0:0:1:11:1)(1:L2:160:)(1:L2:162:16)(1:L0:2:16)))(4:Path(4:Fill(5:Solid9:#FF252525))(8:Segments(1:F6:15.0581:81:11:1)(1:L2:145:9.058)(1:L2:141:5)(1:L2:101:5)(1:L2:105:9.058)(1:L5:8.9421:8)(1:L1:81:8)(1:L1:86:12.414)(1:L6:11.5862:16)(1:L6:12.4142:16)(1:L2:166:12.414)(1:L2:161:8)(1:L6:15.0581:8)))(4:Path(4:Fill(5:Solid9:#FF7CBEFF))(8:Segments(1:F2:111:71:11:1)(1:L2:111:6)(1:L2:131:6)(1:L2:131:7)(1:F2:111:71:10:)(1:F2:131:81:11:1)(1:L2:111:8)(1:L2:116:11.472)(1:L1:95:9.472)(1:L1:92:12)(1:L2:122:15)(1:L2:152:12)(1:L2:155:9.472)(1:L2:136:11.472)(1:F2:131:81:10:))))(8:ClipMask)))"); } /// Returns the set of theme images for Themed Icon ExtensionOverlay. diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/FSharp.Psi.Features.fsproj b/ReSharper.FSharp/src/FSharp.Psi.Features/FSharp.Psi.Features.fsproj index edc2bd6d38..e77e2b5a25 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/FSharp.Psi.Features.fsproj +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/FSharp.Psi.Features.fsproj @@ -7,15 +7,16 @@ - + + @@ -48,6 +49,7 @@ + @@ -63,6 +65,7 @@ + @@ -81,12 +84,13 @@ + - + @@ -143,6 +147,8 @@ + + @@ -157,6 +163,8 @@ + + diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/CodeCompletion/FSharpLookupItem.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/CodeCompletion/FSharpLookupItem.fs index aa6ae8d11a..447a0c1fd6 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/CodeCompletion/FSharpLookupItem.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/CodeCompletion/FSharpLookupItem.fs @@ -7,6 +7,7 @@ open JetBrains.ReSharper.Feature.Services.Lookup open JetBrains.ReSharper.Feature.Services.ParameterInfo open JetBrains.ReSharper.Host.Features.Completion open JetBrains.ReSharper.Plugins.FSharp +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Plugins.FSharp.Services.Cs.CodeCompletion diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Analyzers/ColorReferenceAnalyzer.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Analyzers/ColorReferenceAnalyzer.fs index 80233bef08..8978bcfbc4 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Analyzers/ColorReferenceAnalyzer.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Analyzers/ColorReferenceAnalyzer.fs @@ -1,4 +1,4 @@ -module JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Analyzers.ColorReferenceAnalyzer +namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Analyzers open JetBrains.Application.Settings open JetBrains.ReSharper.Daemon.VisualElements @@ -6,9 +6,8 @@ open JetBrains.ReSharper.Feature.Services.Daemon open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Stages open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -[, - HighlightingTypes = [| typeof |])>] -type RedundantAttributeSuffixAnalyzer() = +[, HighlightingTypes = [| typeof |])>] +type ColorReferenceAnalyzer() = inherit ElementProblemAnalyzer() override x.Run(expr, analyzerData, consumer) = diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Analyzers/LetDisposableAnalyzer.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Analyzers/LetDisposableAnalyzer.fs index 87f0df4180..f9c4edcc1f 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Analyzers/LetDisposableAnalyzer.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Analyzers/LetDisposableAnalyzer.fs @@ -12,7 +12,7 @@ open JetBrains.ReSharper.Psi.Util //[, // HighlightingTypes = [| typeof |])>] type LetDisposableAnalyzer() = - inherit ElementProblemAnalyzer() + inherit ElementProblemAnalyzer() override x.Run(letExpr, _, consumer) = if letExpr.IsUse then () else diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Analyzers/ReSpellerHelper.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Analyzers/ReSpellerHelper.fs index 3475b6e6fa..33ffab4115 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Analyzers/ReSpellerHelper.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Analyzers/ReSpellerHelper.fs @@ -11,7 +11,7 @@ type ReSpellerPsiHelper() = override x.ShouldSkipDeclaration(declaration) = match declaration with - | :? ISynPat as synPat -> not synPat.IsDeclaration + | :? IFSharpPattern as fsPattern -> not fsPattern.IsDeclaration | :? IFSharpDeclaration as fsDeclaration -> fsDeclaration.NameIdentifier :? IActivePatternId | _ -> true diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Analyzers/RedundantNew.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Analyzers/RedundantNew.fs index 18336b904d..5f6fdcd053 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Analyzers/RedundantNew.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Analyzers/RedundantNew.fs @@ -2,9 +2,9 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Analyzers open FSharp.Compiler.SourceCodeServices open JetBrains.ReSharper.Feature.Services.Daemon +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Psi [, @@ -14,6 +14,8 @@ type RedundantNewAnalyzer() = override x.Run(newExpr, _, consumer) = let typeName = newExpr.TypeName + if isNull typeName then () else + let resolveResult = typeName.Reference.Resolve() match resolveResult.DeclaredElement.As() with | null -> () @@ -23,7 +25,7 @@ type RedundantNewAnalyzer() = if typeElement.IsDescendantOf(predefinedType.IDisposable.GetTypeElement()) then () else if isNull newExpr.NewKeyword then () else - match newExpr.CheckerService.ResolveNameAtLocation(newExpr, typeName.Names, "RedundantNewAnalyzer") with + match newExpr.GetFcsCheckerService().ResolveNameAtLocation(newExpr, typeName.Names, "RedundantNewAnalyzer") with | None -> () | Some symbolUse -> diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Analyzers/RedundantQualifierAnalyzer.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Analyzers/RedundantQualifierAnalyzer.fs new file mode 100644 index 0000000000..2af2043620 --- /dev/null +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Analyzers/RedundantQualifierAnalyzer.fs @@ -0,0 +1,54 @@ +module JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Analyzers.RedundantQualifierAnalyzer + +open JetBrains.ReSharper.Feature.Services.Daemon +open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings +open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Stages +open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Util +open JetBrains.ReSharper.Plugins.FSharp.Psi.Parsing +open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree +open JetBrains.ReSharper.Plugins.FSharp.Psi.Util +open JetBrains.ReSharper.Psi +open JetBrains.ReSharper.Psi.ExtensionsAPI + +let [] OpName = "RedundantQualifierAnalyzer" + +// todo: module decls + +let isRedundant (data: ElementProblemAnalyzerData) (referenceOwner: IFSharpReferenceOwner) = + let reference = referenceOwner.Reference + + let qualifierExpr = reference.QualifierReference + if isNull qualifierExpr then false else + + let qualifierName = qualifierExpr.GetName() + if qualifierName = SharedImplUtil.MISSING_DECLARATION_NAME then false else + + let opens = data.GetData(FSharpErrorsStage.openedModulesProvider).GetOpenedModuleNames + if not (opens.Contains(qualifierName)) then false else +// if not (opens.GetValuesSafe(shortName) |> Seq.exists (endsWith qualifierExpr.QualifiedName)) then () else + + let referenceName = referenceOwner.As() + if isNotNull referenceName && isInOpen referenceName then false else + + let declaredElement = + match reference.Resolve().DeclaredElement with + | :? IConstructor as ctor -> ctor.GetContainingType() :> IDeclaredElement + | declaredElement -> declaredElement + + if isNull declaredElement then false else + + // Don't make namespace usages unqualified, e.g. don't remove `System` leaving `Collections.Generic.List`. + if declaredElement :? INamespace && qualifierName <> FSharpTokenType.GLOBAL.TokenRepresentation then false else + + // todo: try to check next qualified names in case we got into multiple-result resolve, i.e. for module? + FSharpResolveUtil.resolvesToUnqualified declaredElement reference OpName + + +[; typeof; typeof |], + HighlightingTypes = [| typeof |])>] +type RedundantQualifierExpressionAnalyzer() = + interface IElementProblemAnalyzer with + member x.Run(refExpr, data, consumer) = + let referenceOwner = refExpr :?> IFSharpReferenceOwner + if isRedundant data referenceOwner then + consumer.AddHighlighting(RedundantQualifierWarning(refExpr)) diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Highlightings/CommonErrors.xml b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Highlightings/CommonErrors.xml index 5b6e54031a..821f5173b2 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Highlightings/CommonErrors.xml +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Highlightings/CommonErrors.xml @@ -2,8 +2,8 @@ JetBrains.ReSharper.Intentions.QuickFixes; + JetBrains.ReSharper.Plugins.FSharp.Psi; JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings; - JetBrains.ReSharper.Plugins.FSharp.Psi.Util.PsiUtil; JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree; JetBrains.ReSharper.Plugins.FSharp.Psi.Resolve; JetBrains.ReSharper.Plugins.FSharp.Psi.Impl; @@ -90,7 +90,7 @@ - + fcsMessage @@ -104,7 +104,7 @@ - + fcsMessage @@ -117,7 +117,7 @@ - + fcsMessage @@ -125,6 +125,7 @@ expr.GetHighlightingRange() AddIgnoreFix + IntroduceVarFix @@ -259,7 +260,7 @@ - + letExpr.LetOrUseToken.GetHighlightingRange() @@ -267,7 +268,7 @@ - + letExpr.LetOrUseToken.GetHighlightingRange() @@ -277,7 +278,7 @@ - + if prefixApp.FunctionExpression == expr then "Unexpected argument" else "Unexpected arguments" @@ -331,4 +332,28 @@ ToAbstractFix + + + + yieldExpr.GetHighlightingRange() + + RemoveYieldFix + + + + + + yieldExpr.GetHighlightingRange() + + RemoveYieldFix + + + + + getQualifierRange treeNode + + + RemoveRedundantQualifierFix + + diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Highlightings/ErrorHighlightings.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Highlightings/ErrorHighlightings.fs index 22900cdcde..95dc4fb315 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Highlightings/ErrorHighlightings.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Highlightings/ErrorHighlightings.fs @@ -5,6 +5,10 @@ open JetBrains.DocumentModel open JetBrains.ReSharper.Feature.Services.Daemon open JetBrains.ReSharper.Feature.Services.Daemon.Attributes +[] +type FSharpErrors() = + class end + [] type FSharpErrorHighlightingBase(message, range: DocumentRange) = interface IHighlighting with @@ -14,42 +18,42 @@ type FSharpErrorHighlightingBase(message, range: DocumentRange) = member x.CalculateRange() = range -[, AttributeId = AnalysisHighlightingAttributeIds.ERROR, OverlapResolve = OverlapResolveKind.NONE)>] type ErrorHighlighting(message, range) = inherit FSharpErrorHighlightingBase(message, range) -[, AttributeId = AnalysisHighlightingAttributeIds.WARNING, OverlapResolve = OverlapResolveKind.NONE)>] type WarningHighlighting(message, range) = inherit FSharpErrorHighlightingBase(message, range) -[, AttributeId = AnalysisHighlightingAttributeIds.UNRESOLVED_ERROR, OverlapResolve = OverlapResolveKind.NONE)>] type UnresolvedHighlighting(message, range) = inherit FSharpErrorHighlightingBase(message, range) -[, AttributeId = AnalysisHighlightingAttributeIds.DEADCODE, OverlapResolve = OverlapResolveKind.NONE)>] type UnusedHighlighting(message, range) = inherit FSharpErrorHighlightingBase(message, range) -[, AttributeId = AnalysisHighlightingAttributeIds.ERROR, OverlapResolve = OverlapResolveKind.NONE)>] type UseKeywordIllegalInPrimaryCtor(message, range) = inherit FSharpErrorHighlightingBase(message, range) -[, AttributeId = AnalysisHighlightingAttributeIds.DEADCODE, OverlapResolve = OverlapResolveKind.NONE)>] type DeadCodeHighlighting(range) = diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Highlightings/FSharpErrorUtil.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Highlightings/FSharpErrorUtil.fs index 167a4c07ca..adb745f4aa 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Highlightings/FSharpErrorUtil.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Highlightings/FSharpErrorUtil.fs @@ -3,20 +3,21 @@ module JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings.FSha open JetBrains.DocumentModel open JetBrains.ReSharper.Feature.Services.Daemon +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Parsing open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Plugins.FSharp.Util open JetBrains.ReSharper.Psi.Tree -open JetBrains.Util + +let getTreeNodesDocumentRange (startNode: ITreeNode) (endNode: ITreeNode) = + let startOffset = startNode.GetDocumentStartOffset() + let endOffset = endNode.GetDocumentEndOffset() + DocumentRange(&startOffset, &endOffset) let getUpcastRange (upcastExpr: IUpcastExpr) = if not (isValid upcastExpr && isValid upcastExpr.OperatorToken) then DocumentRange.InvalidRange else - let documentRange = upcastExpr.GetNavigationRange() - let operatorRange = upcastExpr.OperatorToken.GetNavigationRange() - - DocumentRange(documentRange.Document, TextRange(operatorRange.StartOffset.Offset, documentRange.EndOffset.Offset)) + getTreeNodesDocumentRange upcastExpr upcastExpr.OperatorToken let getIndexerArgListRange (indexerExpr: IItemIndexerExpr) = match indexerExpr.IndexerArgList with @@ -28,7 +29,7 @@ let getLetTokenText (token: ITokenNode) = let tokenType = if isNull tokenType then FSharpTokenType.LET else tokenType tokenType.TokenRepresentation -let getExpressionsRanges (exprs: ISynExpr seq) = +let getExpressionsRanges (exprs: IFSharpExpression seq) = exprs |> Seq.map (fun x -> if isValid x then x.GetHighlightingRange() else DocumentRange.InvalidRange) let getRefExprNameRange (refExpr: IReferenceExpr) = @@ -36,7 +37,7 @@ let getRefExprNameRange (refExpr: IReferenceExpr) = | null -> refExpr.GetHighlightingRange() | identifier -> identifier.GetHighlightingRange() -let rec getUnusedExpr (expr: ISynExpr) = +let rec getUnusedExpr (expr: IFSharpExpression) = match expr with | :? ILetOrUseExpr as letExpr -> let inExpr = letExpr.InExpression @@ -50,6 +51,17 @@ let rec getUnusedExpr (expr: ISynExpr) = let getAttributeSuffixRange (attribute: IAttribute) = let referenceName = attribute.ReferenceName - if isNull referenceName || not (referenceName.ShortName |> endsWith "Attribute") then DocumentRange.InvalidRange else + if isNull referenceName || not (referenceName.ShortName |> endsWith "Attribute") then + DocumentRange.InvalidRange else referenceName.GetDocumentEndOffset().ExtendLeft("Attribute".Length) + +let getQualifierRange (element: ITreeNode) = + match element with + | :? IReferenceExpr as refExpr -> getTreeNodesDocumentRange refExpr.Qualifier refExpr.Delimiter + | :? IReferenceName as referenceName -> getTreeNodesDocumentRange referenceName.Qualifier referenceName.Delimiter + + | :? ITypeExtensionDeclaration as typeExtension -> + getTreeNodesDocumentRange typeExtension.QualifierReferenceName typeExtension.Delimiter + + | _ -> DocumentRange.InvalidRange diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Highlightings/TypeHintHighlighting.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Highlightings/TypeHintHighlighting.fs index a95f007175..41fb21b817 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Highlightings/TypeHintHighlighting.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Highlightings/TypeHintHighlighting.fs @@ -10,7 +10,7 @@ open JetBrains.UI.RichText [)>] [, AttributeId = AnalysisHighlightingAttributeIds.PARAMETER_NAME_HINT, OverlapResolve = OverlapResolveKind.NONE, ShowToolTipInStatusBar = false)>] @@ -20,16 +20,22 @@ type TypeHintHighlighting(typeNameString: string, range: DocumentRange) = interface IHighlighting with member x.ToolTip = null member x.ErrorStripeToolTip = null - member x.IsValid() = not text.IsEmpty && not range.IsEmpty + member x.IsValid() = x.IsValid() member x.CalculateRange() = range interface IHighlightingWithTestOutput with member x.TestOutput = text.Text member x.Text = text + member x.IsValid() = not text.IsEmpty && not range.IsEmpty and [] TypeHintAdornmentProvider() = interface IHighlighterIntraTextAdornmentProvider with + member x.IsValid(highlighter) = + match highlighter.UserData with + | :? TypeHintHighlighting as dm -> dm.IsValid() + | _ -> false + member x.CreateDataModel(highlighter) = match highlighter.UserData with | :? TypeHintHighlighting as thh -> @@ -43,5 +49,6 @@ and [] TypeHintAdornmentProvider() = override x.SelectionRange = Nullable<_>() override x.IconId = null override x.IsPreceding = false + override x.Order = 0 } | _ -> null diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/FSharpErrorsStage.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/FSharpErrorsStage.fs index c44648b8d8..657600dec0 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/FSharpErrorsStage.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/FSharpErrorsStage.fs @@ -8,12 +8,15 @@ open JetBrains.ReSharper.Feature.Services.Daemon open JetBrains.ReSharper.Plugins.FSharp.Daemon.Cs.Stages open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree +open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Psi open JetBrains.ReSharper.Psi.Tree open JetBrains.Util +[] module FSharpErrorsStage = let visualElementFactoryKey = Key("ColorUsageHighlightingEnabled") + let openedModulesProvider = Key("OpenedModulesProvider") [ |])>] @@ -27,15 +30,14 @@ type FSharpErrorsStage(elementProblemAnalyzerRegistrar) = and FSharpErrorStageProcess(fsFile, daemonProcess, settings, analyzerRegistrar: ElementProblemAnalyzerRegistrar) = inherit FSharpDaemonStageProcessBase(fsFile, daemonProcess) - static let analyzerRunKind = ElementProblemAnalyzerRunKind.FullDaemon - + let analyzerRunKind = ElementProblemAnalyzerRunKind.FullDaemon let interruptCheck = daemonProcess.GetCheckForInterrupt() - let elementProblemAnalyzerData = ElementProblemAnalyzerData(fsFile, settings, analyzerRunKind, interruptCheck) - let analyzerDispatcher = analyzerRegistrar.CreateDispatcher(elementProblemAnalyzerData) + let analyzerData = ElementProblemAnalyzerData(fsFile, settings, analyzerRunKind, interruptCheck) + let analyzerDispatcher = analyzerRegistrar.CreateDispatcher(analyzerData) do - let visualElementHighlighter = VisualElementHighlighter(fsFile.Language, settings) - elementProblemAnalyzerData.PutData(FSharpErrorsStage.visualElementFactoryKey, visualElementHighlighter) + analyzerData.PutData(visualElementFactoryKey, VisualElementHighlighter(fsFile.Language, settings)) + analyzerData.PutData(openedModulesProvider, OpenedModulesProvider(fsFile)) override x.VisitNode(element: ITreeNode, consumer: IHighlightingConsumer) = analyzerDispatcher.Run(element, consumer) diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/FSharpIdentifierTooltipProvider.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/FSharpIdentifierTooltipProvider.fs index 09b4c4e2dd..493c032ade 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/FSharpIdentifierTooltipProvider.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/FSharpIdentifierTooltipProvider.fs @@ -28,7 +28,7 @@ type FSharpIdentifierTooltipProvider(lifetime, solution, presenter, xmlDocServic let [] opName = "FSharpIdentifierTooltipProvider" - static member GetFSharpToolTipText(checkResults: FSharpCheckFileResults, token: FSharpIdentifierToken) = + static member GetFSharpToolTipText(userOpName: string, checkResults: FSharpCheckFileResults, token: FSharpIdentifierToken) = // todo: fix getting qualifiers let tokenNames = [token.Name] @@ -37,8 +37,10 @@ type FSharpIdentifierTooltipProvider(lifetime, solution, presenter, xmlDocServic let lineText = sourceFile.Document.GetLineText(coords.Line) use cookie = CompilationContextCookie.GetOrCreate(sourceFile.GetPsiModule().GetContextFromModule()) + use op = token.GetFcsCheckerService().FcsReactorMonitor.MonitorOperation userOpName + // todo: provide tooltip for #r strings in fsx, should pass String tag - let getTooltip = checkResults.GetStructuredToolTipText(int coords.Line + 1, int coords.Column, lineText, tokenNames, FSharpTokenTag.Identifier) + let getTooltip = checkResults.GetStructuredToolTipText(int coords.Line + 1, int coords.Column, lineText, tokenNames, FSharpTokenTag.Identifier, op.OperationName) getTooltip.RunAsTask() override x.GetTooltip(highlighter) = @@ -67,7 +69,7 @@ type FSharpIdentifierTooltipProvider(lifetime, solution, presenter, xmlDocServic | Some results -> let result = List() - let (FSharpToolTipText layouts) = FSharpIdentifierTooltipProvider.GetFSharpToolTipText(results.CheckResults, token) + let (FSharpToolTipText layouts) = FSharpIdentifierTooltipProvider.GetFSharpToolTipText(opName, results.CheckResults, token) layouts |> List.iter (function | FSharpStructuredToolTipElement.None diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/FcsErrorsStageProcessBase.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/FcsErrorsStageProcessBase.fs index 6fee9d5aba..44ed837e79 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/FcsErrorsStageProcessBase.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/FcsErrorsStageProcessBase.fs @@ -6,10 +6,10 @@ open FSharp.Compiler.SourceCodeServices open JetBrains.DocumentModel open JetBrains.ReSharper.Feature.Services.Daemon open JetBrains.ReSharper.Plugins.FSharp.Daemon.Cs.Stages +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings open JetBrains.ReSharper.Plugins.FSharp.Util open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl open JetBrains.Util @@ -37,6 +37,8 @@ module FSharpErrors = let [] FieldRequiresAssignment = 764 let [] ExpectedExpressionAfterLet = 588 let [] SuccessiveArgsShouldBeSpacedOrTupled = 597 + let [] ConstructRequiresListArrayOrSequence = 747 + let [] ConstructRequiresComputationExpression = 748 let [] EmptyRecordInvalid = 789 let [] UseBindingsIllegalInModules = 524 let [] LocalClassBindingsCannotBeInline = 894 @@ -190,6 +192,12 @@ type FcsErrorsStageProcessBase(fsFile, daemonProcess) = | SuccessiveArgsShouldBeSpacedOrTupled -> createHighlightingFromNode SuccessiveArgsShouldBeSpacedOrTupledError range + | ConstructRequiresListArrayOrSequence -> + createHighlightingFromNode YieldRequiresSeqExpressionError range + + | ConstructRequiresComputationExpression -> + createHighlightingFromNode ReturnRequiresComputationExpressionError range + | EmptyRecordInvalid -> createHighlightingFromNodeWithMessage EmptyRecordInvalidError range error diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/InferredTypeCodeVisionProvider.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/InferredTypeCodeVisionProvider.fs index 1010464a37..887ff5322d 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/InferredTypeCodeVisionProvider.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/InferredTypeCodeVisionProvider.fs @@ -19,12 +19,12 @@ open JetBrains.ReSharper.Resources.Shell open JetBrains.Rider.Model open JetBrains.Util +module FSharpInferredTypeHighlighting = + let [] Id = "CodeInsights" [] + Severity.INFO, typeof, + AttributeId = FSharpInferredTypeHighlighting.Id, OverlapResolve = OverlapResolveKind.NONE)>] type FSharpInferredTypeHighlighting(range, text, provider: ICodeInsightsProvider) = inherit CodeInsightsHighlighting(range, text, "", "Copy inferred type", provider, null, null) @@ -58,7 +58,7 @@ type InferredTypeCodeVisionProvider() = member x.OnExtraActionClick(_, _, _) = () -[] +[ |])>] type InferredTypeCodeVisionStage(provider: InferredTypeCodeVisionProvider) = inherit FSharpDaemonStageBase() diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/InferredTypeHintStage.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/InferredTypeHintStage.fs new file mode 100644 index 0000000000..7af37a7ae4 --- /dev/null +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/InferredTypeHintStage.fs @@ -0,0 +1,190 @@ +namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Stages + +open System +open FSharp.Compiler.SourceCodeServices +open JetBrains.Application.Settings +open JetBrains.ProjectModel +open JetBrains.ReSharper.Feature.Services.InlayHints +open JetBrains.ReSharper.Feature.Services.TypeNameHints +open JetBrains.ReSharper.Plugins.FSharp +open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Util +open JetBrains.ReSharper.Plugins.FSharp.Psi.Util +open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings +open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl +open JetBrains.ReSharper.Psi +open JetBrains.ReSharper.Psi.ExtensionsAPI +open JetBrains.ReSharper.Psi.Naming +open JetBrains.ReSharper.Psi.Naming.Impl +open JetBrains.ReSharper.Psi.Tree +open JetBrains.ReSharper.Psi.Util +open JetBrains.ReSharper.Feature.Services.Daemon +open JetBrains.ReSharper.Plugins.FSharp.Daemon.Cs.Stages +open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree +open JetBrains.Util + +type LocalReferencePatternVisitor + (fsFile: IFSharpFile, highlightingContext: TypeNameHintHighlightingContext, namingPolicyProvider, nameParser) = + inherit TreeNodeVisitor() + + let isTypeEvidentFromVariableNamePrefix (typ: IType) (variableNameParts: string[]) = + if not (typ.IsBool()) then false else + + if variableNameParts.Length > 0 then + let prefix = variableNameParts.[0].ToLowerInvariant() + prefix = "has" || prefix = "is" + else + false + + let isEvidentFromVariableName (fsType: FSharpType) variableName = + if not highlightingContext.HideTypeNameHintsWhenTypeNameIsEvidentFromVariableName then false else + + let typ = fsType.MapType(EmptyList.InstanceList, fsFile.GetPsiModule()) + if not (typ.IsValid()) then false else + + let variableNameParts = NamesHelper.GetParts(nameParser, namingPolicyProvider, variableName) + if isTypeEvidentFromVariableNamePrefix typ variableNameParts then true else + + match typ.GetTypeElement() with + | null -> false + | typeElement -> + + let typeName = typeElement.ShortName + String.Equals(typeName, variableName, StringComparison.OrdinalIgnoreCase) || + not (String.IsNullOrEmpty(typeName)) && + not (String.IsNullOrEmpty(variableName)) && + NamesHelper.IsLike(variableNameParts, NamesHelper.GetParts(nameParser, namingPolicyProvider, typeName)) + + let isTypeOfPatternEvident (pattern: IFSharpPattern) = + + // v-- not evident + // x::y::z + // ^--^-- evident + let tuplePat = TuplePatNavigator.GetByPattern pattern + if isNotNull tuplePat then + let consPat = ConsPatNavigator.GetByPattern1 tuplePat + if isNull consPat then false else + + // Are we nested inside another ConsPat? + let parentTuplePat = TuplePatNavigator.GetByPattern consPat + if isNull parentTuplePat then tuplePat.Patterns.IndexOf pattern <> 0 else + isNotNull (ConsPatNavigator.GetByPattern1 parentTuplePat) + + else + + // v-- not evident + // [x; y; z] + // ^--^-- evident + let listOrListPat = ArrayOrListPatNavigator.GetByPattern pattern + if isNotNull listOrListPat then + match Seq.tryHead listOrListPat.PatternsEnumerable with + | None -> false + | Some head -> head <> pattern + + else + + false + + override x.VisitNode(node, context) = + for child in node.Children() do + match child with + | :? IFSharpTreeNode as treeNode -> treeNode.Accept(x, context) + | _ -> () + + override x.VisitLocalReferencePat(localRefPat, consumer) = + let pat = localRefPat.IgnoreParentParens() + if isNotNull (TypedPatNavigator.GetByPattern(pat)) then () else + + let binding = BindingNavigator.GetByHeadPattern(pat) + if isNotNull binding && isNotNull binding.ReturnTypeInfo then () else + + let variableName = localRefPat.SourceName + if variableName = SharedImplUtil.MISSING_DECLARATION_NAME then () else + + if isTypeOfPatternEvident pat then () else + + match box (localRefPat.GetFSharpSymbolUse()) with + | null -> () + | symbolUse -> + + let symbolUse = symbolUse :?> FSharpSymbolUse + match symbolUse.Symbol with + | :? FSharpMemberOrFunctionOrValue as mfv when not (isEvidentFromVariableName mfv.FullType variableName) -> + let typeNameStr = + symbolUse.DisplayContext.WithShortTypeNames(true) + |> mfv.FullType.Format + + let range = localRefPat.GetNavigationRange().EndOffsetRange() + + // todo: TypeNameHintHighlighting can be used when RIDER-39605 is resolved + consumer.AddHighlighting(TypeHintHighlighting(typeNameStr, range)) + | _ -> () + +type InferredTypeHintHighlightingProcess + (fsFile, settings: IContextBoundSettingsStore, highlightingContext: TypeNameHintHighlightingContext, + namingManager: NamingManager, nameParser: NameParser, daemonProcess) = + inherit FSharpDaemonStageProcessBase(fsFile, daemonProcess) + + let namingPolicyProvider = namingManager.Policy.GetPolicyProvider(fsFile.Language, fsFile.GetSourceFile()) + let hideHintsForEvidentTypes = highlightingContext.HideTypeNameHintsForImplicitlyTypedVariablesWhenTypeIsEvident + + let visitor = LocalReferencePatternVisitor(fsFile, highlightingContext, namingPolicyProvider, nameParser) + + let visitLetBindings (letBindings: ILetBindings) consumer = + if not highlightingContext.ShowTypeNameHintsForImplicitlyTypedVariables then () else + + for binding in letBindings.Bindings do + if hideHintsForEvidentTypes && isTypeEvident binding.Expression then () else + + match binding.HeadPattern with + | null -> () + | headPat -> headPat.Accept(visitor, consumer) + + override x.Execute(committer) = + let consumer = FilteringHighlightingConsumer(daemonProcess.SourceFile, fsFile, settings) + fsFile.ProcessThisAndDescendants(Processor(x, consumer)) + committer.Invoke(DaemonStageResult(consumer.Highlightings)) + + override x.VisitLetModuleDecl(moduleDecl, consumer) = + visitLetBindings moduleDecl consumer + + override x.VisitLetOrUseExpr(letOrUseExpr, consumer) = + visitLetBindings letOrUseExpr consumer + + override x.VisitMemberParamsDeclaration(paramDecl, consumer) = + if highlightingContext.ShowTypeNameHintsForImplicitlyTypedVariables then + match paramDecl.Pattern with + | null -> () + | pattern -> pattern.Accept(visitor, consumer) + + override x.VisitMatchClause(matchClause, consumer) = + if highlightingContext.ShowTypeNameHintsForVarDeclarationsInPatternMatchingExpressions then + match matchClause.Pattern with + | null -> () + | pattern -> pattern.Accept(visitor, consumer) + + override x.VisitLambdaExpr(lambdaExpr, consumer) = + if not highlightingContext.ShowTypeNameHintsForLambdaExpressionParameters then () else + + for pattern in lambdaExpr.Patterns do + if isNotNull pattern then + pattern.Accept(visitor, consumer) + +[ |])>] +type InferredTypeHintStage(namingManager: NamingManager, nameParser: NameParser) = + inherit FSharpDaemonStageBase() + + override x.IsSupported(sourceFile, processKind) = + processKind = DaemonProcessKind.VISIBLE_DOCUMENT && + base.IsSupported(sourceFile, processKind) && + not (sourceFile.LanguageType.Is()) + + override x.CreateStageProcess(fsFile, settings, daemonProcess) = + let context = TypeNameHintHighlightingContext(settings) + + let isEnabled = + context.ShowTypeNameHintsForImplicitlyTypedVariables || + context.ShowTypeNameHintsForLambdaExpressionParameters || + context.ShowTypeNameHintsForVarDeclarationsInPatternMatchingExpressions + + if not isEnabled then null else + InferredTypeHintHighlightingProcess(fsFile, settings, context, namingManager, nameParser, daemonProcess) :> _ diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/PipeChainTypeHintStage.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/PipeChainTypeHintStage.fs index ffdd35a5c5..6def987630 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/PipeChainTypeHintStage.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/PipeChainTypeHintStage.fs @@ -8,10 +8,10 @@ open JetBrains.ProjectModel open JetBrains.ReSharper.Daemon.Stages open JetBrains.ReSharper.Plugins.FSharp open JetBrains.ReSharper.Plugins.FSharp.Daemon.Stages.Tooltips +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Util open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Plugins.FSharp.Settings open JetBrains.ReSharper.Psi.Tree open JetBrains.ReSharper.Feature.Services.Daemon @@ -81,7 +81,7 @@ type PipeChainHighlightingProcess(logger: ILogger, fsFile, settings: IContextBou for token, exprToAdorn in exprs do if daemonProcess.InterruptFlag then raise <| OperationCanceledException() - let (FSharpToolTipText layouts) = FSharpIdentifierTooltipProvider.GetFSharpToolTipText(checkResults, token) + let (FSharpToolTipText layouts) = FSharpIdentifierTooltipProvider.GetFSharpToolTipText(opName, checkResults, token) // The |> operator should have one overload and two type parameters match layouts with @@ -137,7 +137,7 @@ type PipeChainHighlightingProcess(logger: ILogger, fsFile, settings: IContextBou committer.Invoke(DaemonStageResult remainingHighlightings) -[ |])>] +[ |])>] type PipeChainTypeHintStage(logger: ILogger) = inherit FSharpDaemonStageBase() diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/ScriptLoadPathsStage.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/ScriptLoadPathsStage.fs index 917b4d44b5..f784e851ec 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/ScriptLoadPathsStage.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/ScriptLoadPathsStage.fs @@ -52,7 +52,7 @@ type ScriptLoadPathsStageProcess(fsFile, daemonProcess) = fsFile.Accept(visitor) if allDirectives.IsEmpty() then () else - match fsFile.CheckerService.OptionsProvider.GetProjectOptions(daemonProcess.SourceFile) with + match fsFile.CheckerService.FcsProjectProvider.GetProjectOptions(daemonProcess.SourceFile) with | Some options when not options.OriginalLoadReferences.IsEmpty -> let document = daemonProcess.Document let linesCount = document.GetLineCount() |> int diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/UnusedOpensStage.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/UnusedOpensStage.fs index 78caa3272f..3d4c83dac5 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/UnusedOpensStage.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/UnusedOpensStage.fs @@ -7,9 +7,9 @@ open JetBrains.ReSharper.Feature.Services.Daemon open JetBrains.ReSharper.Plugins.FSharp open JetBrains.ReSharper.Plugins.FSharp.Daemon.Cs open JetBrains.ReSharper.Plugins.FSharp.Daemon.Cs.Stages +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Plugins.FSharp.Util open JetBrains.ReSharper.Resources.Shell open JetBrains.Util diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Debugger/FSharpExpressionEvaluationInfoProvider.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Debugger/FSharpExpressionEvaluationInfoProvider.fs index aff5558464..bfb3723972 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Debugger/FSharpExpressionEvaluationInfoProvider.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Debugger/FSharpExpressionEvaluationInfoProvider.fs @@ -11,14 +11,14 @@ open JetBrains.ReSharper.Psi.Tree [)>] type FSharpExpressionEvaluationInfoProvider() = - static let rec getTextToEvaluate (expr: ISynExpr) = + static let rec getTextToEvaluate (expr: IFSharpExpression) = match expr with | :? IReferenceExpr as refExpr -> let declaredElement = refExpr.Reference.Resolve().DeclaredElement if declaredElement :? ISelfId then "this" else let shortName = refExpr.ShortName - if shortName == SharedImplUtil.MISSING_DECLARATION_NAME then null else + if shortName = SharedImplUtil.MISSING_DECLARATION_NAME then null else let qualifier = getTextToEvaluate refExpr.Qualifier if isNull qualifier then shortName else qualifier + "." + shortName @@ -43,12 +43,12 @@ type FSharpExpressionEvaluationInfoProvider() = | _ -> null - static member GetTextToEvaluate(expr: ISynExpr) = + static member GetTextToEvaluate(expr: IFSharpExpression) = getTextToEvaluate expr interface IExpressionEvaluationInfoProvider with member x.FindExpression(file, range, _) = - let expr = file.GetNode(range) + let expr = file.GetNode(range) let exprName = getTextToEvaluate expr if isNotNull exprName then EvaluationExpressionInfo(expr, exprName, expr.GetText()) diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/ExtendSelection/FSharpExtendSelectionProvider.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/ExtendSelection/FSharpExtendSelectionProvider.fs index 8da81d2db2..ef087fa03b 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/ExtendSelection/FSharpExtendSelectionProvider.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/ExtendSelection/FSharpExtendSelectionProvider.fs @@ -7,10 +7,10 @@ open JetBrains.ProjectModel open JetBrains.ReSharper.Feature.Services.Editor open JetBrains.ReSharper.Feature.Services.SelectEmbracingConstruct open JetBrains.ReSharper.Plugins.FSharp +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features open JetBrains.ReSharper.Plugins.FSharp.Psi.Parsing open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Plugins.FSharp.Util open JetBrains.ReSharper.Psi open JetBrains.ReSharper.Psi.Parsing @@ -46,14 +46,14 @@ type FSharpExtendSelectionProvider(settingsStore: ISettingsStore) = null - | :? ISynPat as synPat -> - let matchClause = MatchClauseNavigator.GetByPattern(synPat) + | :? IFSharpPattern as fsPattern -> + let matchClause = MatchClauseNavigator.GetByPattern(fsPattern) if isNotNull matchClause && isNotNull matchClause.WhenExpression then - FSharpTreeRangeSelection(fsFile, synPat, matchClause.WhenExpression) :> _ else + FSharpTreeRangeSelection(fsFile, fsPattern, matchClause.WhenExpression) :> _ else null - | :? ISynExpr as expr -> + | :? IFSharpExpression as expr -> let attribute = AttributeNavigator.GetByExpression(expr) if isNotNull attribute && isNotNull attribute.ReferenceName && isNotNull attribute.ArgExpression then FSharpTreeRangeSelection(fsFile, attribute.ReferenceName, attribute.ArgExpression) :> _ else @@ -63,13 +63,13 @@ type FSharpExtendSelectionProvider(settingsStore: ISettingsStore) = FSharpTreeRangeSelection(fsFile, typeInherit.TypeName, typeInherit.CtorArg) :> _ else let binding = BindingNavigator.GetByExpression(expr) - let letExpr = LetLikeExprNavigator.GetByBinding(binding) + let letExpr = LetOrUseExprNavigator.GetByBinding(binding) if isNotNull letExpr then FSharpExtendSelectionProvider.CreateLetBindingSelection(fsFile, letExpr, binding) else null - | :? IWhenExpr as whenExpr -> + | :? IWhenExprClause as whenExpr -> let matchClause = MatchClauseNavigator.GetByWhenExpression(whenExpr) if isNotNull matchClause && isNotNull matchClause.Pattern then FSharpTreeRangeSelection(fsFile, matchClause.Pattern, whenExpr) :> _ else @@ -77,7 +77,7 @@ type FSharpExtendSelectionProvider(settingsStore: ISettingsStore) = null | :? IBinding as binding -> - let letBindings = LetNavigator.GetByBinding(binding) + let letBindings = LetBindingsNavigator.GetByBinding(binding) if isNotNull letBindings then FSharpExtendSelectionProvider.CreateLetBindingSelection(fsFile, letBindings, binding) else @@ -92,7 +92,7 @@ type FSharpExtendSelectionProvider(settingsStore: ISettingsStore) = | :? ITokenNode as token -> match token.Parent with - | :? ILet as letExpr -> + | :? ILetBindings as letExpr -> let bindings = letExpr.Bindings if bindings.IsEmpty then null else @@ -121,12 +121,12 @@ type FSharpExtendSelectionProvider(settingsStore: ISettingsStore) = if not (shouldTryFindBetterNode node) then null else FSharpExtendSelectionProvider.ExtendNodeSelection(fsFile, node) - static member CreateLetBindingSelection(fsFile, letBindings: ILet): ISelectedRange = + static member CreateLetBindingSelection(fsFile, letBindings: ILetBindings): ISelectedRange = let bindings = letBindings.Bindings if bindings.IsEmpty then null else FSharpExtendSelectionProvider.CreateLetBindingSelection(fsFile, letBindings, bindings.[0]) - static member CreateLetBindingSelection(fsFile, letExpr: ILet, binding): ISelectedRange = + static member CreateLetBindingSelection(fsFile, letExpr: ILetBindings, binding): ISelectedRange = let bindings = letExpr.Bindings if bindings.[0] == binding then FSharpLetExprBindingSelection(fsFile, letExpr, letExpr.FirstChild, binding) :> _ else @@ -266,10 +266,10 @@ and FSharpTokenPartSelection(fsFile, treeTextRange, token) = FSharpTreeNodeSelection(fsFile, token) :> _ -and FSharpLetExprBindingSelection(fsFile: IFSharpFile, letBindings: ILet, first: ITreeNode, last: ITreeNode) = +and FSharpLetExprBindingSelection(fsFile: IFSharpFile, letBindings: ILetBindings, first: ITreeNode, last: ITreeNode) = inherit FSharpTreeRangeSelection(fsFile, first, last) override x.Parent = match letBindings with - | :? ILetLikeExpr -> FSharpTreeRangeSelection(fsFile, letBindings.FirstChild, letBindings.Bindings.Last()) :> _ + | :? ILetOrUseExpr -> FSharpTreeRangeSelection(fsFile, letBindings.FirstChild, letBindings.Bindings.Last()) :> _ | _ -> FSharpTreeNodeSelection(fsFile, letBindings) :> _ diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Foldings/FSharpCodeFoldings.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Foldings/FSharpCodeFoldings.fs index 948cfd3261..373fb79961 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Foldings/FSharpCodeFoldings.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Foldings/FSharpCodeFoldings.fs @@ -1,4 +1,4 @@ -namespace rec JetBrains.ReSharper.Plugins.FSharp.Services.Foldings +namespace JetBrains.ReSharper.Plugins.FSharp.Services.Foldings open FSharp.Compiler.SourceCodeServices open FSharp.Compiler.SourceCodeServices.Structure @@ -12,14 +12,15 @@ open JetBrains.ReSharper.Psi open JetBrains.TextControl.DocumentMarkup open JetBrains.Util -[)>] -type FSharpCodeFoldingProcessFactory(logger: ILogger) = - interface ICodeFoldingProcessorFactory with - member x.CreateProcessor() = - FSharpCodeFoldingProcess(logger) :> _ +module FSharpCodeFoldingAttributes = + let [] HashDirective = "ReSharper F# Hash Directives Block Folding" + + +[] +type FSharpCodeFoldingAttributes() = class end -and FSharpCodeFoldingProcess(logger: ILogger) = +type FSharpCodeFoldingProcess(logger: ILogger) = inherit TreeNodeVisitor() let mutable processingFinished = false @@ -80,9 +81,8 @@ and FSharpCodeFoldingProcess(logger: ILogger) = | _ -> () -module FSharpCodeFoldingAttributes = - let [] HashDirective = "ReSharper F# Hash Directives Block Folding" - - -[] -do () +[)>] +type FSharpCodeFoldingProcessFactory(logger: ILogger) = + interface ICodeFoldingProcessorFactory with + member x.CreateProcessor() = + FSharpCodeFoldingProcess(logger) :> _ diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Formatter/FSharpReformatCode.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Formatter/FSharpReformatCode.fs index 08c3790b56..17156a963b 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Formatter/FSharpReformatCode.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Formatter/FSharpReformatCode.fs @@ -10,7 +10,6 @@ open JetBrains.ReSharper.Feature.Services.CSharp.CodeCleanup open JetBrains.ReSharper.Feature.Services.CodeCleanup open JetBrains.ReSharper.Plugins.FSharp open JetBrains.ReSharper.Plugins.FSharp.Psi -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Plugins.FSharp.Util open JetBrains.ReSharper.Psi open JetBrains.ReSharper.Psi.Tree @@ -28,7 +27,7 @@ type FSharpReformatCode() = member x.SetDefaultSetting(_, _) = () member x.IsAvailable(sourceFile) = sourceFile.PrimaryPsiLanguage :? FSharpLanguage - member x.Process(sourceFile, rangeMarker, profile, _) = + member x.Process(sourceFile, rangeMarker, profile, _, _) = if not (profile.GetSetting(ReformatCode.REFORMAT_CODE_DESCRIPTOR)) then () else let fsFile = sourceFile.FSharpFile @@ -67,7 +66,7 @@ type FSharpReformatCode() = let stamp = document.LastModificationStamp let modificationSide = TextModificationSide.NotSpecified let newLineText = sourceFile.DetectLineEnding().GetPresentation() - let parsingOptions = checkerService.OptionsProvider.GetParsingOptions(sourceFile) + let parsingOptions = checkerService.FcsProjectProvider.GetParsingOptions(sourceFile) let checker = checkerService.Checker let change = @@ -85,7 +84,7 @@ type FSharpReformatCode() = Some(DocumentChange(document, offset, oldLength, formatted, stamp, modificationSide)) with _ -> None else - let parsingOptions = checkerService.OptionsProvider.GetParsingOptions(sourceFile) + let parsingOptions = checkerService.FcsProjectProvider.GetParsingOptions(sourceFile) let defines = parsingOptions.ConditionalCompilationDefines let formatTask = if List.isEmpty defines diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Fsi/FsiHost.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Fsi/FsiHost.fs index c63d952809..ab3b1da8a4 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Fsi/FsiHost.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Fsi/FsiHost.fs @@ -60,7 +60,7 @@ type FsiHost let assemblyFilter (assembly: IPsiAssembly) = let assemblyName = assembly.AssemblyName - not (isFSharpCore assemblyName || assemblyName.PossiblyContainsPredefinedTypes()) + not (FSharpAssemblyUtil.isFSharpCore assemblyName || assemblyName.PossiblyContainsPredefinedTypes()) let getProjectReferences projectId = use cookie = ReadLockCookie.Create() @@ -69,12 +69,20 @@ type FsiHost let targetFrameworkId = project.GetCurrentTargetFrameworkId() let psiModule = psiModules.GetPrimaryPsiModule(project, targetFrameworkId) - getReferencePaths assemblyFilter psiModule + getReferencedModules psiModule + |> Seq.filter (fun psiModule -> + match psiModule with + | :? IAssemblyPsiModule as assemblyModule -> assemblyFilter assemblyModule.Assembly + | _ -> true) + |> Seq.map getModuleFullPath + |> List do let rdFsiHost = solution.RdFSharpModel().FSharpInteractiveHost rdFsiHost.RequestNewFsiSessionInfo.Set(getNewFsiSessionInfo) rdFsiHost.GetProjectReferences.Set(getProjectReferences) + + rdFsiHost.FsiTools.PrepareCommands.Set(FsiTools.prepareCommands) fsiOptions.MoveCaretOnSendLine.FlowInto(lifetime, rdFsiHost.MoveCaretOnSendLine) fsiOptions.ExecuteRecent.FlowInto(lifetime, rdFsiHost.CopyRecentToEditor) diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Fsi/FsiTools.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Fsi/FsiTools.fs new file mode 100644 index 0000000000..4d3684260d --- /dev/null +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Fsi/FsiTools.fs @@ -0,0 +1,14 @@ +namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Fsi + +open JetBrains.Rider.Model + +module FsiTools = + let wrapCommand (commandIndex: int, command: string) = + "[]\nmodule module" + (commandIndex + 1).ToString() + "=\n " + command.Replace("\n", "\n ") + "\n ignore\n" + + + let prepareCommands (rdFsiPrepareCommandsArgs: RdFsiPrepareCommandsArgs): ResizeArray = + let firstCommandIndex = rdFsiPrepareCommandsArgs.FirstCommandIndex + let commands: ResizeArray = rdFsiPrepareCommandsArgs.Commands + + commands |> Seq.mapi(fun i x -> wrapCommand(firstCommandIndex + i, x)) |> ResizeArray diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Intentions/ElifToIfAction.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Intentions/ElifToIfAction.fs index a1f9484c18..9e498cbf47 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Intentions/ElifToIfAction.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Intentions/ElifToIfAction.fs @@ -3,10 +3,10 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Intentions open System open JetBrains.ReSharper.Feature.Services.ContextActions open JetBrains.ReSharper.Feature.Services.Util +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree open JetBrains.ReSharper.Plugins.FSharp.Psi.Parsing open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Psi.ExtensionsAPI open JetBrains.ReSharper.Psi.ExtensionsAPI.Tree open JetBrains.ReSharper.Psi.Tree diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Intentions/IfToElifAction.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Intentions/IfToElifAction.fs index 90295632a3..599d04d4f1 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Intentions/IfToElifAction.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Intentions/IfToElifAction.fs @@ -2,10 +2,10 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Intentions open System open JetBrains.ReSharper.Feature.Services.ContextActions +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree open JetBrains.ReSharper.Plugins.FSharp.Psi.Parsing open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Psi.ExtensionsAPI open JetBrains.ReSharper.Psi.ExtensionsAPI.Tree open JetBrains.ReSharper.Psi.Tree diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Intentions/InvertIfAction.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Intentions/InvertIfAction.fs index b71e04b5e4..b4089f8b16 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Intentions/InvertIfAction.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Intentions/InvertIfAction.fs @@ -1,11 +1,11 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Intentions open JetBrains.ReSharper.Feature.Services.ContextActions +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Util open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl open JetBrains.ReSharper.Plugins.FSharp.Psi.Parsing open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Plugins.FSharp.Util open JetBrains.ReSharper.Psi.ExtensionsAPI open JetBrains.ReSharper.Psi.ExtensionsAPI.Tree diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Intentions/ToLiteralAction.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Intentions/ToLiteralAction.fs index a34fa02e85..48dd41ea67 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Intentions/ToLiteralAction.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Intentions/ToLiteralAction.fs @@ -1,9 +1,9 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Intentions open JetBrains.ReSharper.Feature.Services.ContextActions +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Util open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Psi.ExtensionsAPI open JetBrains.ReSharper.Psi.Tree open JetBrains.ReSharper.Resources.Shell @@ -22,8 +22,8 @@ type ToLiteralAction(dataProvider: FSharpContextActionDataProvider) = FSharpAttributesUtil.addAttributesList binding false binding.AttributeLists.[0] - let rec isSimplePattern (pat: ISynPat): bool = - match pat with + let rec isSimplePattern (fsPattern: IFSharpPattern): bool = + match fsPattern with | :? IReferencePat as refPat -> let referenceName = refPat.ReferenceName isNotNull referenceName && isNull referenceName.Qualifier diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Intentions/ToModuleNamespaceDeclarationAction.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Intentions/ToModuleNamespaceDeclarationAction.fs index 6c09e05973..7e3ff8108e 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Intentions/ToModuleNamespaceDeclarationAction.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Intentions/ToModuleNamespaceDeclarationAction.fs @@ -1,10 +1,10 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Intentions open JetBrains.ReSharper.Feature.Services.ContextActions +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree open JetBrains.ReSharper.Plugins.FSharp.Psi.Parsing open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Psi.ExtensionsAPI open JetBrains.ReSharper.Psi.ExtensionsAPI.Tree open JetBrains.ReSharper.Psi.Tree diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Intentions/ToMultilineRecord.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Intentions/ToMultilineRecord.fs index 10b55539fb..2b5d6d339c 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Intentions/ToMultilineRecord.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Intentions/ToMultilineRecord.fs @@ -2,9 +2,9 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Intentions open JetBrains.ReSharper.Feature.Services.ContextActions open JetBrains.ReSharper.Feature.Services.Util +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Psi.ExtensionsAPI open JetBrains.ReSharper.Psi.ExtensionsAPI.Tree open JetBrains.ReSharper.Resources.Shell diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Intentions/ToMutableAction.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Intentions/ToMutableAction.fs index 0a54cb08ed..32e2282598 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Intentions/ToMutableAction.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Intentions/ToMutableAction.fs @@ -1,8 +1,8 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Intentions open JetBrains.ReSharper.Feature.Services.ContextActions +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.DeclaredElement -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Psi.Tree // todo: fix mutable inside binding range, then replace IRecordField usage below diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/LanguageService/FSharpBreadcrumbsHelper.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/LanguageService/FSharpBreadcrumbsHelper.fs index af5cb6803d..e4b9985f54 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/LanguageService/FSharpBreadcrumbsHelper.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/LanguageService/FSharpBreadcrumbsHelper.fs @@ -11,4 +11,4 @@ type FSharpBreadcrumbsHelper() = inherit BreadcrumbsHelperBase() override x.IsApplicable(declaration) = - declaration :? ITypeMemberDeclaration && not (declaration :? ISynPat) + declaration :? ITypeMemberDeclaration && not (declaration :? IFSharpPattern) diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/LanguageService/FSharpDeclaredElementIconProvider.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/LanguageService/FSharpDeclaredElementIconProvider.fs index cbfb6fc861..9d6c1c9b7f 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/LanguageService/FSharpDeclaredElementIconProvider.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/LanguageService/FSharpDeclaredElementIconProvider.fs @@ -27,7 +27,7 @@ type FSharpDeclaredElementIconProvider() = canApplyExtensions <- true match declaredElement with - | :? IModule -> FSharpIcons.FSharpModule.Id + | :? IFSharpModule -> FSharpIcons.FSharpModule.Id | :? IUnionCase as unionCase -> canApplyExtensions <- false diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/LanguageService/FSharpElementFactory.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/LanguageService/FSharpElementFactory.fs index a9f7600c7f..f2c07dd72d 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/LanguageService/FSharpElementFactory.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/LanguageService/FSharpElementFactory.fs @@ -7,7 +7,6 @@ open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Util open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Psi.CodeStyle open JetBrains.ReSharper.Psi.ExtensionsAPI.Tree open JetBrains.ReSharper.Psi.Modules @@ -28,7 +27,7 @@ type FSharpElementFactory(languageService: IFSharpLanguageService, psiModule: IP let document = createDocument source let parser = languageService.CreateParser(document) - let fsFile = parser.ParseFSharpFile(StandaloneDocument = document) + let fsFile = parser.ParseFSharpFile(noCache = true, StandaloneDocument = document) SandBox.CreateSandBoxFor(fsFile, psiModule) fsFile @@ -58,11 +57,6 @@ type FSharpElementFactory(languageService: IFSharpLanguageService, psiModule: IP let newExpr = getExpression source newExpr.As().InnerExpression.As() - let createParenExpr (expr: ISynExpr) = - let parenExpr = getExpression "(())" :?> IParenExpr - ModificationUtil.ReplaceChild(parenExpr.InnerExpression, expr.Copy()) |> ignore - parenExpr - let createAttributeList attrName: IAttributeList = let source = sprintf "[<%s>] ()" attrName let doDecl = getDoDecl source @@ -120,9 +114,6 @@ type FSharpElementFactory(languageService: IFSharpLanguageService, psiModule: IP addParensIfNeeded newArg |> ignore newExpr - member x.CreateAppExpr(addSpace) = - createAppExpr addSpace - member x.CreateAppExpr(funExpr, argExpr, addSpace) = let appExpr = createAppExpr addSpace appExpr.SetFunctionExpression(funExpr.Copy()) |> ignore @@ -169,9 +160,6 @@ type FSharpElementFactory(languageService: IFSharpLanguageService, psiModule: IP member x.CreateParenExpr() = getExpression "(())" :?> _ - member x.CreateParenExpr(expr) = - createParenExpr expr - member x.AsReferenceExpr(typeReference: ITypeReferenceName) = getExpression (typeReference.GetText()) :?> _ @@ -186,7 +174,7 @@ type FSharpElementFactory(languageService: IFSharpLanguageService, psiModule: IP let forExpr = getExpression "for _ in () do ()" :?> IForEachExpr - let expr = ModificationUtil.ReplaceChild(forExpr.InClause, expr.Copy()) + let expr = ModificationUtil.ReplaceChild(forExpr.InExpression, expr.Copy()) let whitespace = ModificationUtil.ReplaceChild(forExpr.DoExpression.PrevSibling, Whitespace(indent)) ModificationUtil.AddChildBefore(whitespace, NewLine(expr.GetLineEnding())) |> ignore @@ -195,7 +183,7 @@ type FSharpElementFactory(languageService: IFSharpLanguageService, psiModule: IP member x.CreateExpr(text) = getExpression text - member x.CreateBinaryAppExpr(text, arg1: ISynExpr, arg2: ISynExpr) = + member x.CreateBinaryAppExpr(text, arg1: IFSharpExpression, arg2: IFSharpExpression) = let source = "() " + text + " ()" let expr = getExpression source let appExpr = expr :?> IBinaryAppExpr @@ -208,7 +196,7 @@ type FSharpElementFactory(languageService: IFSharpLanguageService, psiModule: IP expr - member x.CreateSetExpr(left: ISynExpr, right: ISynExpr) = + member x.CreateSetExpr(left: IFSharpExpression, right: IFSharpExpression) = let source = "() <- ()" let expr = getExpression source let setExpr = expr :?> ISetExpr @@ -221,6 +209,16 @@ type FSharpElementFactory(languageService: IFSharpLanguageService, psiModule: IP expr + member x.CreateExpressionReferenceName(name) = + let source = sprintf "let %s = ()" name + let letModuleDecl = getModuleMember source :?> ILetModuleDecl + letModuleDecl.Bindings.[0].HeadPattern.As().ReferenceName + + member x.CreateTypeReferenceName(name) = + let source = sprintf "type T = %s" name + let typeDeclarationGroup = getModuleMember source :?> ITypeDeclarationGroup + let typeAbbreviation = typeDeclarationGroup.TypeDeclarations.[0].As() + typeAbbreviation.AbbreviatedType.As().ReferenceName member x.CreateEmptyAttributeList() = let attributeList = createAttributeList "Foo" diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/LanguageService/FSharpImportTypeHelper.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/LanguageService/FSharpImportTypeHelper.fs index 1ac9c6375c..869ae4efde 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/LanguageService/FSharpImportTypeHelper.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/LanguageService/FSharpImportTypeHelper.fs @@ -5,6 +5,7 @@ open JetBrains.ProjectModel open JetBrains.ReSharper.Intentions.QuickFixes open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Search +open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Util open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl open JetBrains.ReSharper.Plugins.FSharp.Psi.Resolve open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree @@ -98,15 +99,20 @@ type FSharpImportTypeHelper() = [)>] type FSharpQuickFixUtilComponent() = + let [] FcsOpName = "FSharpQuickFixUtilComponent.BindTo" + interface IQuickFixUtilComponent with member x.BindTo(reference, typeElement, _, _) = let reference = reference :?> FSharpSymbolReference - let context = reference.GetElement() - let fsFile = context.FSharpFile - let settings = fsFile.GetSettingsStore() - let moduleToOpen = getModuleToOpen typeElement + let referenceOwner = reference.GetElement() + use writeCookie = WriteLockCookie.Create(referenceOwner.IsPhysical()) + FSharpReferenceBindingUtil.SetRequiredQualifiers(reference, typeElement) + if FSharpResolveUtil.resolvesToQualified typeElement reference FcsOpName then reference :> _ else + + let moduleToOpen = getModuleToOpen typeElement + let fsFile = referenceOwner.FSharpFile let namingService = NamingManager.GetNamingLanguageService(fsFile.Language) let nameToOpen = @@ -118,8 +124,8 @@ type FSharpQuickFixUtilComponent() = if nameToOpen.IsNullOrEmpty() then reference :> _ else - use writeCookie = WriteLockCookie.Create(context.IsPhysical()) - addOpen (context.GetDocumentStartOffset()) fsFile settings nameToOpen + let settings = fsFile.GetSettingsStore() + addOpen (referenceOwner.GetDocumentStartOffset()) fsFile settings nameToOpen reference :> _ member x.AddImportsForExtensionMethod(reference, _) = reference diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/LanguageService/FSharpLanguageService.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/LanguageService/FSharpLanguageService.fs index f531d5581a..10b7863126 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/LanguageService/FSharpLanguageService.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/LanguageService/FSharpLanguageService.fs @@ -12,7 +12,6 @@ open JetBrains.ReSharper.Plugins.FSharp.Psi.LanguageService.Parsing open JetBrains.ReSharper.Plugins.FSharp.Psi.Parsing open JetBrains.ReSharper.Plugins.FSharp.Psi.Resolve open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Plugins.FSharp.Services.Formatter open JetBrains.ReSharper.Psi open JetBrains.ReSharper.Psi.CSharp.Impl diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/LanguageService/FSharpLanguageSpecificCopyPasteBehavior.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/LanguageService/FSharpLanguageSpecificCopyPasteBehavior.fs new file mode 100644 index 0000000000..3b1fab852a --- /dev/null +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/LanguageService/FSharpLanguageSpecificCopyPasteBehavior.fs @@ -0,0 +1,10 @@ +namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.LanguageService + +open JetBrains.ReSharper.Feature.Services.Clipboard +open JetBrains.ReSharper.Plugins.FSharp.Psi +open JetBrains.ReSharper.Psi + +[)>] +type FSharpLanguageSpecificCopyPasteBehavior() = + interface ILanguageSpecificCopyPasteBehavior with + member x.AllowSmartCopyPaste _ = false diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/LanguageService/FSharpProjectFileLanguageService.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/LanguageService/FSharpProjectFileLanguageService.fs index a2dfb4a3de..d318a8519a 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/LanguageService/FSharpProjectFileLanguageService.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/LanguageService/FSharpProjectFileLanguageService.fs @@ -24,7 +24,7 @@ type FSharpProjectFileLanguageService | null -> FSharpLanguage.Instance.LanguageService().GetPrimaryLexerFactory() | _ -> - let defines = fsCheckerService.OptionsProvider.GetParsingOptions(sourceFile).ConditionalCompilationDefines + let defines = fsCheckerService.FcsProjectProvider.GetParsingOptions(sourceFile).ConditionalCompilationDefines FSharpPreprocessedLexerFactory(defines) :> _ override x.GetPsiProperties(projectFile, sourceFile, isCompileService) = diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/LanguageService/FSharpQuickDefinitionService.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/LanguageService/FSharpQuickDefinitionService.fs index e8378a3e04..46d093239b 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/LanguageService/FSharpQuickDefinitionService.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/LanguageService/FSharpQuickDefinitionService.fs @@ -13,9 +13,9 @@ type FSharpQuickDefinitionService() = override x.GetPresentableTreeRange(node) = match node with - | :? ISynPat as pat -> - let pat = skipIntermediatePatParents pat - let binding = BindingNavigator.GetByHeadPattern(pat) - TreeRange(LetNavigator.GetByBinding(binding)) :> _ + | :? IFSharpPattern as fsPattern -> + let fsPattern = skipIntermediatePatParents fsPattern + let binding = BindingNavigator.GetByHeadPattern(fsPattern) + TreeRange(LetBindingsNavigator.GetByBinding(binding)) :> _ | _ -> base.GetPresentableTreeRange(node) diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/LanguageService/SandboxDocumentLanguageSupportFSharpScript.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/LanguageService/SandboxDocumentLanguageSupportFSharpScript.fs new file mode 100644 index 0000000000..94f223cf85 --- /dev/null +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/LanguageService/SandboxDocumentLanguageSupportFSharpScript.fs @@ -0,0 +1,16 @@ +namespace JetBrains.ReSharper.Plugins.FSharp.Psi.LanguageService + +open JetBrains.ProjectModel +open JetBrains.ReSharper.Host.Features.Documents +open JetBrains.ReSharper.Plugins.FSharp +open JetBrains.ReSharper.Plugins.FSharp.Psi +open JetBrains.ReSharper.Psi + + +[)>] +type SandboxDocumentLanguageSupportFSharpScript() = + interface ISandboxDocumentLanguageSupport with + member x.DocumentFileExtension = FSharpScriptProjectFileType.FsScriptExtension + member x.ProjectFileType = FSharpScriptProjectFileType.Instance :> ProjectFileType + member x.SetupSandboxFile(sandboxFile, sandboxInfo, lifetime) = () + member x.GetExtraInfos(sandboxDocumentInfo) = null diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Parsing/FSharpImplTreeBuilder.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Parsing/FSharpImplTreeBuilder.fs index b3bc19489e..3bb32335e3 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Parsing/FSharpImplTreeBuilder.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Parsing/FSharpImplTreeBuilder.fs @@ -413,8 +413,11 @@ type FSharpImplTreeBuilder(lexer, document, decls, lifetime, projectedOffset, li | lid -> x.ProcessReferenceName(lid) - x.ProcessPatternParams(args, isLocal || isTopLevelPat, false) - if isLocal then ElementType.LOCAL_PARAMETERS_OWNER_PAT else ElementType.TOP_PARAMETERS_OWNER_PAT + if args.IsEmpty then + if isLocal then ElementType.LOCAL_REFERENCE_PAT else ElementType.TOP_REFERENCE_PAT + else + x.ProcessPatternParams(args, isLocal || isTopLevelPat, false) + if isLocal then ElementType.LOCAL_PARAMETERS_OWNER_PAT else ElementType.TOP_PARAMETERS_OWNER_PAT | SynPat.Typed(pat, synType, _) -> x.ProcessPat(pat, isLocal, false) @@ -519,12 +522,12 @@ type FSharpImplTreeBuilder(lexer, document, decls, lifetime, projectedOffset, li let mark = x.Mark(range) x.ProcessPat(pat, isLocal, false) - x.Done(range, mark, ElementType.MEMBER_PARAM_DECLARATION) + x.Done(range, mark, ElementType.MEMBER_PARAMS_DECLARATION) member x.MarkOtherType(TypeRange range as typ) = let mark = x.Mark(range) x.ProcessType(typ) - x.Done(range, mark, ElementType.OTHER_TYPE) + x.Done(range, mark, ElementType.UNSUPPORTED_TYPE_USAGE) member x.SkipOuterAttrs(attrs: SynAttributeList list, outerRange: range) = match attrs with @@ -664,10 +667,13 @@ type FSharpExpressionTreeBuilder(lexer, document, lifetime, projectedOffset, lin x.ProcessExpressionList(exprs) | SynExpr.ArrayOrList(_, exprs, _) -> - x.ProcessListExpr(exprs, range, ElementType.ARRAY_OR_LIST_EXPR) + // SynExpr.ArrayOrList is currently only used for error recovery and empty lists in the parser. + // Non-empty SynExpr.ArrayOrList is created in the type checker only. + Assertion.Assert(List.isEmpty exprs, "Non-empty SynExpr.ArrayOrList: {0}", expr) + x.MarkAndDone(range, ElementType.ARRAY_OR_LIST_EXPR) | SynExpr.AnonRecd(_, copyInfo, fields, _) -> - x.PushRange(range, ElementType.ANON_RECD_EXPR) + x.PushRange(range, ElementType.ANON_RECORD_EXPR) x.PushStepList(fields, anonRecordFieldListProcessor) match copyInfo with | Some(expr, _) -> x.ProcessExpression(expr) @@ -714,7 +720,8 @@ type FSharpExpressionTreeBuilder(lexer, document, lifetime, projectedOffset, lin x.ProcessExpression(enumExpr) | SynExpr.ArrayOrListOfSeqExpr(_, expr, _) -> - x.PushRangeAndProcessExpression(expr, range, ElementType.ARRAY_OR_LIST_OF_SEQ_EXPR) + let expr = match expr with | SynExpr.CompExpr(expr = expr) -> expr | _ -> expr + x.PushRangeAndProcessExpression(expr, range, ElementType.ARRAY_OR_LIST_EXPR) | SynExpr.CompExpr(_, _, expr, _) -> x.PushRangeAndProcessExpression(expr, range, ElementType.COMPUTATION_EXPR) @@ -904,12 +911,20 @@ type FSharpExpressionTreeBuilder(lexer, document, lifetime, projectedOffset, lin | SynExpr.ImplicitZero _ -> () - | SynExpr.YieldOrReturn(_, expr, _) + | SynExpr.YieldOrReturn(_, expr, _) -> + x.AdvanceToStart(range) + if x.TokenType == FSharpTokenType.RARROW then + // Remove fake yield expressions in list comprehensions + // by replacing `-> a` with `a` in `[ for a in 1 .. 2 -> a ]`. + x.ProcessExpression(expr) + else + x.PushRangeAndProcessExpression(expr, range, ElementType.YIELD_OR_RETURN_EXPR) + | SynExpr.YieldOrReturnFrom(_, expr, _) -> x.PushRangeAndProcessExpression(expr, range, ElementType.YIELD_OR_RETURN_EXPR) | SynExpr.LetOrUseBang(_, _, _, pat, expr, ands, inExpr, range) -> - x.PushRange(range, ElementType.LET_OR_USE_BANG_EXPR) + x.PushRange(range, ElementType.LET_OR_USE_EXPR) x.PushExpression(inExpr) x.PushStepList(ands, andLocalBindingListProcessor) x.PushRangeForMark(expr.Range, x.Mark(pat.Range), ElementType.LOCAL_BINDING) @@ -930,10 +945,12 @@ type FSharpExpressionTreeBuilder(lexer, document, lifetime, projectedOffset, lin x.MarkAndDone(range, ElementType.LIBRARY_ONLY_EXPR) | SynExpr.ArbitraryAfterError _ - | SynExpr.FromParseError _ | SynExpr.DiscardAfterMissingQualificationAfterDot _ -> x.MarkAndDone(range, ElementType.FROM_ERROR_EXPR) + | SynExpr.FromParseError(expr, _) -> + x.PushRangeAndProcessExpression(expr, range, ElementType.FROM_ERROR_EXPR) + | SynExpr.Fixed(expr, _) -> x.PushRangeAndProcessExpression(expr, range, ElementType.FIXED_EXPR) @@ -970,10 +987,10 @@ type FSharpExpressionTreeBuilder(lexer, document, lifetime, projectedOffset, lin // Range sequence expr also contains braces in the fake app expr, mark it as a separate expr node. if appRange <> rangeSeqRange then - x.PushRange(appRange, ElementType.RANGE_SEQUENCE_EXPR) + x.PushRange(appRange, ElementType.COMPUTATION_EXPR) let seqMark = x.Mark(fromRange) - x.PushRangeForMark(toRange, seqMark, ElementType.RANGE_SEQUENCE) + x.PushRangeForMark(toRange, seqMark, ElementType.RANGE_SEQUENCE_EXPR) x.PushExpression(toExpr) match stepExpr with @@ -1129,7 +1146,7 @@ type FSharpExpressionTreeBuilder(lexer, document, lifetime, projectedOffset, lin member x.ProcessSynIndexerArg(arg) = match arg with - | SynIndexerArg.One(expr, _, range) -> + | SynIndexerArg.One(ExprRange range as expr, _, _) -> x.PushRange(range, ElementType.INDEXER_ARG_EXPR) x.PushExpression(getGeneratedAppArg expr) @@ -1197,7 +1214,7 @@ type FSharpExpressionTreeBuilder(lexer, document, lifetime, projectedOffset, lin let range = whenExpr.Range let mark = x.MarkTokenOrRange(FSharpTokenType.WHEN, range) - x.PushRangeForMark(range, mark, ElementType.WHEN_EXPR) + x.PushRangeForMark(range, mark, ElementType.WHEN_EXPR_CLAUSE) x.ProcessExpression(whenExpr) diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Parsing/FSharpParser.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Parsing/FSharpParser.fs index ee000b20d6..9936001e60 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Parsing/FSharpParser.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Parsing/FSharpParser.fs @@ -11,7 +11,6 @@ open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree open JetBrains.ReSharper.Plugins.FSharp.Psi.Parsing open JetBrains.ReSharper.Plugins.FSharp.Psi.Resolve open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -open JetBrains.ReSharper.Plugins.FSharp.Util open JetBrains.ReSharper.Psi open JetBrains.ReSharper.Psi.Parsing open JetBrains.ReSharper.Psi.Tree @@ -32,15 +31,15 @@ type FSharpParser(lexer: ILexer, document: IDocument, path: FileSystemPath, sour override x.CreateFSharpFile() = x.FinishFile(x.Mark(), ElementType.F_SHARP_IMPL_FILE) } - let parseFile () = + let parseFile (noCache: bool) = use lifetimeDefinition = Lifetime.Define() let lifetime = lifetimeDefinition.Lifetime - let parsingOptions = checkerService.OptionsProvider.GetParsingOptions(sourceFile) + let parsingOptions = checkerService.FcsProjectProvider.GetParsingOptions(sourceFile) let defines = parsingOptions.ConditionalCompilationDefines let lexer = FSharpPreprocessedLexerFactory(defines).CreateLexer(lexer).ToCachingLexer() - let parseResults = checkerService.ParseFile(path, document, parsingOptions) + let parseResults = checkerService.ParseFile(path, document, parsingOptions, noCache) let language = match sourceFile with @@ -67,8 +66,8 @@ type FSharpParser(lexer: ILexer, document: IDocument, path: FileSystemPath, sour static member val SandBoxPath = FileSystemPath.Parse("Sandbox.fs") interface IFSharpParser with - member this.ParseFSharpFile() = parseFile () - member this.ParseFile() = parseFile () :> _ + member this.ParseFSharpFile(noCache) = parseFile noCache + member this.ParseFile() = parseFile false :> _ member this.ParseExpression(chameleonExpr: IChameleonExpression, document) = let document = if isNotNull document then document else chameleonExpr.GetSourceFile().Document @@ -93,4 +92,4 @@ type FSharpParser(lexer: ILexer, document: IDocument, path: FileSystemPath, sour FSharpExpressionTreeBuilder(lexer, document, lifetime, projectedOffset, lineShift) treeBuilder.ProcessTopLevelExpression(chameleonExpr.SynExpr) - treeBuilder.GetTreeNode()) :?> ISynExpr + treeBuilder.GetTreeNode()) :?> IFSharpExpression diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Parsing/FSharpTreeBuilderBase.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Parsing/FSharpTreeBuilderBase.fs index ff963d83a3..9556869ec1 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Parsing/FSharpTreeBuilderBase.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Parsing/FSharpTreeBuilderBase.fs @@ -6,6 +6,7 @@ open FSharp.Compiler.SyntaxTree open FSharp.Compiler.Range open JetBrains.Diagnostics open JetBrains.DocumentModel +open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Parsing open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree open JetBrains.ReSharper.Plugins.FSharp.Psi.Parsing open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree @@ -83,6 +84,12 @@ type FSharpTreeBuilderBase(lexer, document: IDocument, lifetime, projectedOffset let mark = x.Mark(range) x.Done(range, mark, elementType) + member x.MarkAndDone(range: range, elementType1, elementType2) = + let mark1 = x.Mark(range) + let mark2 = x.Mark() + x.Done(range, mark2, elementType2) + x.Done(mark1, elementType1) + member x.MarkToken(elementType) = let caseMark = x.Mark() x.AdvanceLexer() @@ -313,16 +320,24 @@ type FSharpTreeBuilderBase(lexer, document: IDocument, lifetime, projectedOffset x.Done(range, mark, ElementType.RECORD_REPRESENTATION) ElementType.RECORD_DECLARATION - | SynTypeDefnSimpleRepr.Enum(enumCases, _) -> + | SynTypeDefnSimpleRepr.Enum(enumCases, range) -> + let casesListMark = x.Mark(range) for case in enumCases do x.ProcessEnumCase case + x.Done(range, casesListMark, ElementType.ENUM_REPRESENTATION) ElementType.ENUM_DECLARATION | SynTypeDefnSimpleRepr.Union(_, cases, range) -> - let casesListMark = x.Mark(range) + let representationMark = x.Mark(range) + if not cases.IsEmpty then + let firstCaseRange = cases.Head.Range + x.AdvanceToTokenOrRangeStart(FSharpTokenType.BAR, firstCaseRange) + + let caseListMark = x.Mark() for case in cases do x.ProcessUnionCase(case) - x.Done(range, casesListMark, ElementType.UNION_REPRESENTATION) + x.Done(range, caseListMark, ElementType.UNION_CASE_LIST) + x.Done(representationMark, ElementType.UNION_REPRESENTATION) ElementType.UNION_DECLARATION | SynTypeDefnSimpleRepr.TypeAbbrev(_, (TypeRange range as synType), _) -> @@ -414,34 +429,46 @@ type FSharpTreeBuilderBase(lexer, document: IDocument, lifetime, projectedOffset x.MarkAndDone(range, ElementType.LOCAL_DECLARATION) member x.ProcessImplicitCtorSimplePats(pats: SynSimplePats) = + let range = pats.Range + let paramMark = x.Mark(range) + let parenPatMark = x.Mark() + match pats with - | SynSimplePats.SimplePats(pats, range) -> - let mark = x.Mark(range) + | SynSimplePats.SimplePats([pat], _) -> + x.ProcessImplicitCtorParam(pat) + + | SynSimplePats.SimplePats(headPat :: _ as pats, _) -> + let tupleMark = x.Mark(headPat.Range) for pat in pats do x.ProcessImplicitCtorParam(pat) - x.Done(range, mark, ElementType.MEMBER_PARAM_DECLARATION_GROUP) + x.Done(tupleMark, ElementType.TUPLE_PAT) - | SynSimplePats.Typed(pats, synType, range) -> - let mark = x.Mark(range) + | SynSimplePats.Typed(pats, synType, _) -> + failwith "foo" x.ProcessImplicitCtorSimplePats(pats) x.ProcessType(synType) - x.Done(range, mark, ElementType.MEMBER_PARAM_DECLARATION_GROUP) + + | _ -> () + + x.Done(range, parenPatMark, ElementType.PAREN_PAT) + x.Done(range, paramMark, ElementType.MEMBER_PARAMS_DECLARATION) member x.ProcessImplicitCtorParam(pat: SynSimplePat) = match pat with - | SynSimplePat.Id(id, _, _, _, _, range) -> - let mark = x.Mark(range) - x.ProcessLocalId(id) - x.Done(range, mark,ElementType.MEMBER_PARAM_DECLARATION) + | SynSimplePat.Id(ident = IdentRange range) -> + x.MarkAndDone(range, ElementType.LOCAL_REFERENCE_PAT, ElementType.EXPRESSION_REFERENCE_NAME) - // todo: check isCompilerGenerated? - | SynSimplePat.Typed(SynSimplePat.Id(id, _, _, _, _, _), synType, range) -> + | SynSimplePat.Typed(pat, synType, range) -> let mark = x.Mark(range) - x.ProcessLocalId(id) + x.ProcessImplicitCtorParam(pat) x.ProcessType(synType) - x.Done(range, mark,ElementType.MEMBER_PARAM_DECLARATION) + x.Done(range, mark, ElementType.TYPED_PAT) - | _ -> () + | SynSimplePat.Attrib(pat, attrs, range) -> + let mark = x.Mark(range) + x.ProcessAttributeLists(attrs) + x.ProcessImplicitCtorParam(pat) + x.Done(range, mark, ElementType.ATTRIB_PAT) member x.ProcessTypeMemberTypeParams(SynValTyparDecls(typeParams, _, _)) = for param in typeParams do @@ -554,6 +581,10 @@ type FSharpTreeBuilderBase(lexer, document: IDocument, lifetime, projectedOffset | SynType.Var(typeParameter, _) -> x.ProcessTypeParameter(typeParameter) + | SynType.Anon _ -> + // Produced on error + () + | _ -> failwithf "unexpected type: %O" synType member x.ProcessType(TypeRange range as synType) = @@ -561,23 +592,23 @@ type FSharpTreeBuilderBase(lexer, document: IDocument, lifetime, projectedOffset | SynType.LongIdent(lid) -> let mark = x.Mark(range) x.ProcessNamedTypeReference(lid.Lid) - x.Done(range, mark, ElementType.NAMED_TYPE) + x.Done(range, mark, ElementType.NAMED_TYPE_USAGE) | SynType.App(_, _, _, _, _, _, _) -> let mark = x.Mark(range) x.ProcessTypeAsTypeReferenceName(synType) - x.Done(range, mark, ElementType.NAMED_TYPE) + x.Done(range, mark, ElementType.NAMED_TYPE_USAGE) | SynType.LongIdentApp(_, _, ltRange, typeArgs, _, gtRange, _) -> let mark = x.Mark(range) x.ProcessTypeAsTypeReferenceName(synType) - x.Done(range, mark, ElementType.NAMED_TYPE) + x.Done(range, mark, ElementType.NAMED_TYPE_USAGE) | SynType.Tuple (_, types, _) -> let mark = x.Mark(range) for _, synType in types do x.ProcessType(synType) - x.Done(range, mark, ElementType.TUPLE_TYPE) + x.Done(range, mark, ElementType.TUPLE_TYPE_USAGE) // todo: struct keyword? | SynType.AnonRecd(_, fields, _) -> @@ -587,51 +618,56 @@ type FSharpTreeBuilderBase(lexer, document: IDocument, lifetime, projectedOffset x.MarkAndDone(range, ElementType.EXPRESSION_REFERENCE_NAME) x.ProcessType(synType) x.Done(range, mark, ElementType.ANON_RECORD_FIELD) - x.Done(range, mark, ElementType.ANON_RECORD_TYPE) + x.Done(range, mark, ElementType.ANON_RECORD_TYPE_USAGE) | SynType.StaticConstantNamed(synType1, synType2, _) | SynType.MeasureDivide(synType1, synType2, _) -> let mark = x.Mark(range) x.ProcessType(synType1) x.ProcessType(synType2) - x.Done(range, mark, ElementType.OTHER_TYPE) + x.Done(range, mark, ElementType.UNSUPPORTED_TYPE_USAGE) | SynType.Fun(synType1, synType2, _) -> let mark = x.Mark(range) x.ProcessType(synType1) x.ProcessType(synType2) - x.Done(range, mark, ElementType.FUN_TYPE) + x.Done(range, mark, ElementType.FUNCTION_TYPE_USAGE) | SynType.WithGlobalConstraints(synType, constraints, _) -> let mark = x.Mark(range) x.ProcessType(synType) for typeConstraint in constraints do x.ProcessTypeConstraint(typeConstraint) - x.Done(range, mark, ElementType.OTHER_TYPE) + x.Done(range, mark, ElementType.UNSUPPORTED_TYPE_USAGE) | SynType.HashConstraint(synType, _) | SynType.MeasurePower(synType, _, _) -> let mark = x.Mark(range) x.ProcessType(synType) - x.Done(range, mark, ElementType.OTHER_TYPE) + x.Done(range, mark, ElementType.UNSUPPORTED_TYPE_USAGE) | SynType.Array(_, synType, _) -> let mark = x.Mark(range) x.ProcessType(synType) - x.Done(range, mark, ElementType.ARRAY_TYPE) + x.Done(range, mark, ElementType.ARRAY_TYPE_USAGE) | SynType.Var _ -> let mark = x.Mark(range) x.ProcessTypeAsTypeReferenceName(synType) - x.Done(range, mark, ElementType.NAMED_TYPE) + x.Done(range, mark, ElementType.NAMED_TYPE_USAGE) // todo: mark expressions | SynType.StaticConstantExpr _ | SynType.StaticConstant _ -> - x.MarkAndDone(range, ElementType.OTHER_TYPE) + x.MarkAndDone(range, ElementType.UNSUPPORTED_TYPE_USAGE) | SynType.Anon _ -> - x.MarkAndDone(range, ElementType.ANON_TYPE) + x.MarkAndDone(range, ElementType.ANON_TYPE_USAGE) + + | SynType.Paren(innerType, range) -> + let mark = x.Mark(range) + x.ProcessType(innerType) + x.Done(range, mark, ElementType.PAREN_TYPE_USAGE) member x.ProcessTypeConstraint(typeConstraint: SynTypeConstraint) = match typeConstraint with diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Parsing/ParseTreeUtil.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Parsing/FcsSyntaxTreeUtil.fs similarity index 93% rename from ReSharper.FSharp/src/FSharp.Psi.Features/src/Parsing/ParseTreeUtil.fs rename to ReSharper.FSharp/src/FSharp.Psi.Features/src/Parsing/FcsSyntaxTreeUtil.fs index fb68079254..8a3fd15468 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Parsing/ParseTreeUtil.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Parsing/FcsSyntaxTreeUtil.fs @@ -1,5 +1,5 @@ [] -module JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Parsing.ParseTreeUtil +module JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Parsing.FcsSyntaxTreeUtil open FSharp.Compiler open FSharp.Compiler.SyntaxTree @@ -101,3 +101,9 @@ let getGeneratedAppArg (expr: SynExpr) = match expr with | SynExpr.App(_, false, func, arg, _) when func.Range.IsSynthetic -> arg | _ -> expr + +type SynArgPats with + member x.IsEmpty = + match x with + | Pats pats -> pats.IsEmpty + | NamePatPairs(idsAndPats, _) -> idsAndPats.IsEmpty diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/PostfixTemplates/LetPostfixTemplate.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/PostfixTemplates/LetPostfixTemplate.fs index 260ec2a239..3f6e860766 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/PostfixTemplates/LetPostfixTemplate.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/PostfixTemplates/LetPostfixTemplate.fs @@ -48,7 +48,7 @@ and LetPostfixTemplateBehavior(info) = use disableFormatter = new DisableCodeFormatter() let refExpr = x.GetExpression(context) - if (FSharpIntroduceVariable.CanIntroduceVar(refExpr, true)) then refExpr :> ITreeNode else + if (FSharpIntroduceVariable.CanIntroduceVar(refExpr)) then refExpr :> ITreeNode else let letOrUseExpr = elementFactory.CreateLetBindingExpr("_") setBindingExpression refExpr refExpr.Indent letOrUseExpr diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/PostfixTemplates/PostfixTemplates.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/PostfixTemplates/PostfixTemplates.fs index 0c05b288da..eb777440ab 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/PostfixTemplates/PostfixTemplates.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/PostfixTemplates/PostfixTemplates.fs @@ -64,7 +64,7 @@ type FSharpPostfixTemplatesProvider(templatesManager, sessionExecutor, usageStat isNotNull identifier && let parent = identifier.Parent - (parent :? ISynExpr || parent :? IReferenceName) -> + (parent :? IFSharpExpression || parent :? IReferenceName) -> FSharpPostfixTemplateContext(identifier, executionContext) | _ -> null @@ -74,28 +74,28 @@ type FSharpPostfixTemplatesProvider(templatesManager, sessionExecutor, usageStat type FSharpPostfixTemplateBehaviorBase(info) = inherit PostfixTemplateBehavior(info) - let rec getContainingArgExpr (expr: ISynExpr) = + let rec getContainingArgExpr (expr: IFSharpExpression) = match PrefixAppExprNavigator.GetByArgumentExpression(expr) with | null -> expr | appExpr -> getContainingArgExpr appExpr let getContainingTypeExpression (typeName: IReferenceName) = - match NamedTypeNavigator.GetByReferenceName(typeName.As()) with + match NamedTypeUsageNavigator.GetByReferenceName(typeName.As()) with | null -> null - | namedType -> + | namedTypeUsage -> - let castExpr = CastExprNavigator.GetByTypeUsage(namedType) + let castExpr = CastExprNavigator.GetByTypeUsage(namedTypeUsage) if isNotNull castExpr then getContainingArgExpr castExpr else - let typedExpr = TypedExprNavigator.GetByType(namedType) + let typedExpr = TypedExprNavigator.GetByType(namedTypeUsage) if isNotNull typedExpr then getContainingArgExpr typedExpr else null - let getParentExpression (token: IFSharpTreeNode): ISynExpr = + let getParentExpression (token: IFSharpTreeNode): IFSharpExpression = match token with | TokenType FSharpTokenType.RESERVED_LITERAL_FORMATS _ -> match token.Parent.As() with diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/AddIgnoreFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/AddIgnoreFix.fs index 0eb6fa0948..033761391b 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/AddIgnoreFix.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/AddIgnoreFix.fs @@ -3,21 +3,21 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes open JetBrains.ProjectModel open JetBrains.ReSharper.Feature.Services.Navigation.CustomHighlighting open JetBrains.ReSharper.Feature.Services.Refactorings.WorkflowOccurrences +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Util open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Psi.ExtensionsAPI.Tree open JetBrains.ReSharper.Psi.ExtensionsAPI open JetBrains.ReSharper.Resources.Shell open JetBrains.UI.RichText -type AddIgnoreFix(expr: ISynExpr) = +type AddIgnoreFix(expr: IFSharpExpression) = inherit FSharpQuickFixBase() let mutable expr = expr - let shouldAddNewLine (expr: ISynExpr) = + let shouldAddNewLine (expr: IFSharpExpression) = if expr.IsSingleLine then false else if deindentsBody expr then false else @@ -26,7 +26,7 @@ type AddIgnoreFix(expr: ISynExpr) = | :? IDoExpr | :? IAssertExpr | :? ILazyExpr -> true | _ -> false - let suggestInnerExpression (expr: ISynExpr) = + let suggestInnerExpression (expr: IFSharpExpression) = match expr with | :? IIfThenElseExpr as ifExpr -> Some(ifExpr.ThenExpr, "Then branch") @@ -61,7 +61,7 @@ type AddIgnoreFix(expr: ISynExpr) = [| innerExpression, text expr, "Whole expression" |] |> Array.map (fun (expr, text) -> - let getRange (expr: ISynExpr) = [| expr.GetNavigationRange() |] + let getRange (expr: IFSharpExpression) = [| expr.GetNavigationRange() |] WorkflowPopupMenuOccurrence(RichText(text), RichText.Empty, expr, getRange)) let occurrence = diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/AddMatchAllClauseFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/AddMatchAllClauseFix.fs index fd18bb786b..c2ad481004 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/AddMatchAllClauseFix.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/AddMatchAllClauseFix.fs @@ -1,10 +1,10 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Psi.ExtensionsAPI open JetBrains.ReSharper.Resources.Shell diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/AddParensFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/AddParensFix.fs index e1dfd661d2..a449b313a1 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/AddParensFix.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/AddParensFix.fs @@ -1,8 +1,8 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Util -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Psi.ExtensionsAPI open JetBrains.ReSharper.Resources.Shell diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/AddUnderscorePrefixFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/AddUnderscorePrefixFix.fs index b0542db140..b644cea0d5 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/AddUnderscorePrefixFix.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/AddUnderscorePrefixFix.fs @@ -1,5 +1,6 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree open JetBrains.ReSharper.Plugins.FSharp.Psi.Util diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ConvertToUseFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ConvertToUseFix.fs index c507fdf4a0..e7a0ad04e5 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ConvertToUseFix.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ConvertToUseFix.fs @@ -1,9 +1,9 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings open JetBrains.ReSharper.Plugins.FSharp.Psi.Parsing open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Psi.ExtensionsAPI open JetBrains.ReSharper.Psi.ExtensionsAPI.Tree open JetBrains.ReSharper.Resources.Shell diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/GenerateMissingRecordFieldsFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/GenerateMissingRecordFieldsFix.fs index ffe6a4a598..ae1da19941 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/GenerateMissingRecordFieldsFix.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/GenerateMissingRecordFieldsFix.fs @@ -8,13 +8,13 @@ open JetBrains.ReSharper.Feature.Services.LiveTemplates.LiveTemplates open JetBrains.ReSharper.Feature.Services.LiveTemplates.Hotspots open JetBrains.ReSharper.Feature.Services.LiveTemplates.Templates open JetBrains.ReSharper.Feature.Services.QuickFixes +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Intentions open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree open JetBrains.ReSharper.Plugins.FSharp.Psi.Parsing open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util.PsiUtil open JetBrains.ReSharper.Psi open JetBrains.ReSharper.Psi.ExtensionsAPI open JetBrains.ReSharper.Psi.ExtensionsAPI.Tree @@ -72,7 +72,7 @@ type GenerateMissingRecordFieldsFix(recordExpr: IRecordExpr) = match existingBindings.LastOrDefault() with | null -> let lBrace = recordExpr.LeftBrace - let rBrace = recordExpr.RightBrace :> ITreeNode + let rBrace = recordExpr.RightBrace if lBrace.NextSibling == rBrace then // Empty braces: {} diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/IntroduceVarFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/IntroduceVarFix.fs index 9678ba08d8..1f9fc5e425 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/IntroduceVarFix.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/IntroduceVarFix.fs @@ -6,7 +6,7 @@ open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree open JetBrains.ReSharper.Psi.Tree open JetBrains.TextControl -type IntroduceVarFix(expr: ISynExpr) = +type IntroduceVarFix(expr: IFSharpExpression) = inherit FSharpQuickFixBase() new (warning: UnitTypeExpectedWarning) = @@ -15,10 +15,13 @@ type IntroduceVarFix(expr: ISynExpr) = new (warning: FunctionValueUnexpectedWarning) = IntroduceVarFix(warning.Expr) + new (error: UnitTypeExpectedError) = + IntroduceVarFix(error.Expr) + override x.Text = "Introduce 'let' binding" override x.IsAvailable _ = - FSharpIntroduceVariable.CanIntroduceVar(expr, true) + FSharpIntroduceVariable.CanIntroduceVar(expr) override x.Execute(solution, textControl) = base.Execute(solution, textControl) diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveInlineFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveInlineFix.fs index e46fdfa09d..cd16a58251 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveInlineFix.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveInlineFix.fs @@ -1,7 +1,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Psi.ExtensionsAPI type RemoveInlineFix(error: LocalClassBindingsCannotBeInlineError) = diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveNeverMatchingRuleFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveNeverMatchingRuleFix.fs index 5712e9325a..3591f16d83 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveNeverMatchingRuleFix.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveNeverMatchingRuleFix.fs @@ -1,8 +1,8 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings.CommonErrors open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Psi.ExtensionsAPI open JetBrains.ReSharper.Psi.Tree open JetBrains.ReSharper.Resources.Shell diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveRedundantAttributeParensFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveRedundantAttributeParensFix.fs index f9c400d425..538a574dfe 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveRedundantAttributeParensFix.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveRedundantAttributeParensFix.fs @@ -1,7 +1,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Psi.ExtensionsAPI open JetBrains.ReSharper.Resources.Shell diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveRedundantAttributeSuffixFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveRedundantAttributeSuffixFix.fs index b8eb5d3000..20ee01ddf7 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveRedundantAttributeSuffixFix.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveRedundantAttributeSuffixFix.fs @@ -1,7 +1,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Psi.ExtensionsAPI open JetBrains.ReSharper.Resources.Shell open JetBrains.Util diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveRedundantBackticksFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveRedundantBackticksFix.fs index 06c43350f3..7d25625146 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveRedundantBackticksFix.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveRedundantBackticksFix.fs @@ -1,6 +1,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes open JetBrains.ReSharper.Feature.Services.CodeCleanup.HighlightingModule +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree @@ -28,5 +29,6 @@ type RemoveRedundantBackticksFix(warning: RedundantBackticksWarning) = interface IHighlightingsCleanupItem with member x.IsAvailable _ = true member x.IsReanalysisRequired = false + member x.ReanalysisDependencyRoot = null member x.IsValid() = isValid identifier member x.Execute() = x.ExecutePsiTransaction() |> ignore diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveRedundantNewFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveRedundantNewFix.fs index 27f941aa3c..c4a237f23f 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveRedundantNewFix.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveRedundantNewFix.fs @@ -1,7 +1,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Psi.ExtensionsAPI open JetBrains.ReSharper.Psi.ExtensionsAPI.Tree open JetBrains.ReSharper.Resources.Shell diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveRedundantQualifierFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveRedundantQualifierFix.fs new file mode 100644 index 0000000000..e03aa76ab5 --- /dev/null +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveRedundantQualifierFix.fs @@ -0,0 +1,36 @@ +namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes + +open JetBrains.ReSharper.Plugins.FSharp.Psi +open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings +open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes +open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree +open JetBrains.ReSharper.Psi.ExtensionsAPI +open JetBrains.ReSharper.Psi.ExtensionsAPI.Tree +open JetBrains.ReSharper.Psi.Tree +open JetBrains.ReSharper.Resources.Shell + +type RemoveRedundantQualifierFix(warning: RedundantQualifierWarning) = + inherit FSharpQuickFixBase() + + let treeNode = warning.TreeNode + + override x.Text = "Remove redundant qualifier" + + override x.IsAvailable _ = + isValid treeNode + + override x.ExecutePsiTransaction _ = + use writeCookie = WriteLockCookie.Create(treeNode.IsPhysical()) + use disableFormatter = new DisableCodeFormatter() + + let (qualifier: ITreeNode), delimiter = + match treeNode with + | :? IReferenceExpr as referenceExpr -> referenceExpr.Qualifier :> _, referenceExpr.Delimiter + | :? IReferenceName as referenceName -> referenceName.Qualifier :> _, referenceName.Delimiter + + | :? ITypeExtensionDeclaration as typeExtension -> + typeExtension.QualifierReferenceName :> _, typeExtension.Delimiter + + | _ -> failwithf "Unexpected qualifier owner: %O" treeNode + + ModificationUtil.DeleteChildRange(qualifier, getLastMatchingNodeAfter isInlineSpace delimiter) diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveSubsequentFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveSubsequentFix.fs index e7dcdb1fba..b20009fa05 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveSubsequentFix.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveSubsequentFix.fs @@ -1,14 +1,14 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Psi.ExtensionsAPI open JetBrains.ReSharper.Psi.ExtensionsAPI.Tree open JetBrains.ReSharper.Psi.Util open JetBrains.ReSharper.Resources.Shell -type RemoveSubsequentFix(expr: ISynExpr) = +type RemoveSubsequentFix(expr: IFSharpExpression) = inherit FSharpQuickFixBase() new (warning: UnitTypeExpectedWarning) = diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveUnexpectedArgumentsFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveUnexpectedArgumentsFix.fs index d687741133..a72525edee 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveUnexpectedArgumentsFix.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveUnexpectedArgumentsFix.fs @@ -1,8 +1,8 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Psi.ExtensionsAPI open JetBrains.ReSharper.Psi.ExtensionsAPI.Tree open JetBrains.ReSharper.Resources.Shell @@ -18,7 +18,6 @@ type RemoveUnexpectedArgumentsFix(warning: NotAFunctionError) = inherit FSharpQuickFixBase() let expr = warning.Expr - let exprNode = expr :> ITreeNode let prefixApp = warning.PrefixApp override x.Text = @@ -33,5 +32,5 @@ type RemoveUnexpectedArgumentsFix(warning: NotAFunctionError) = let commentNodeCandidate = skipMatchingNodesBefore isWhitespace firstUnexpectedArg let updatedRoot = ModificationUtil.ReplaceChild(prefixApp, expr.Copy()) - if commentNodeCandidate != exprNode then + if commentNodeCandidate != expr then addNodesAfter updatedRoot (TreeRange(expr.NextSibling, commentNodeCandidate)) |> ignore diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveUnnecessaryUpcastFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveUnnecessaryUpcastFix.fs index d86836d403..3c75518ebc 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveUnnecessaryUpcastFix.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveUnnecessaryUpcastFix.fs @@ -1,7 +1,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Psi.ExtensionsAPI open JetBrains.ReSharper.Resources.Shell diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveUnusedLocalBindingFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveUnusedLocalBindingFix.fs index 120e9d2c21..9835e7f19a 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveUnusedLocalBindingFix.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveUnusedLocalBindingFix.fs @@ -3,10 +3,10 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes open System open JetBrains.Diagnostics open JetBrains.ReSharper.Feature.Services.QuickFixes +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Psi.ExtensionsAPI open JetBrains.ReSharper.Psi.ExtensionsAPI.Tree open JetBrains.ReSharper.Psi.Util @@ -22,9 +22,9 @@ type RemoveUnusedLocalBindingFix(warning: UnusedValueWarning) = // todo: we can also check that every top declaration pat is unused instead let binding = BindingNavigator.GetByHeadPattern(pat) - let letOrUse = LetNavigator.GetByBinding(binding) + let letOrUse = LetBindingsNavigator.GetByBinding(binding) - let getCopyRange (expr: ILetLikeExpr) = + let getCopyRange (expr: ILetOrUseExpr) = let inExpr = expr.InExpression let inKeyword = expr.InKeyword @@ -71,7 +71,7 @@ type RemoveUnusedLocalBindingFix(warning: UnusedValueWarning) = ModificationUtil.DeleteChildRange(TreeRange(first, last)) - | :? ILetLikeExpr as letExpr -> + | :? ILetOrUseExpr as letExpr -> let rangeToCopy = getCopyRange letExpr ModificationUtil.ReplaceChildRange(TreeRange(letExpr), rangeToCopy) |> ignore diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveUnusedNamedAsPatFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveUnusedNamedAsPatFix.fs index 9e291da277..f4538547de 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveUnusedNamedAsPatFix.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveUnusedNamedAsPatFix.fs @@ -1,8 +1,8 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util.PsiUtil open JetBrains.ReSharper.Psi.ExtensionsAPI open JetBrains.ReSharper.Resources.Shell diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveUnusedOpensFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveUnusedOpensFix.fs index fe713d5f2c..b6291846a2 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveUnusedOpensFix.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveUnusedOpensFix.fs @@ -3,8 +3,8 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes open JetBrains.ReSharper.Feature.Services.Intentions.Scoped open JetBrains.ReSharper.Feature.Services.Intentions.Scoped.Actions open JetBrains.ReSharper.Feature.Services.QuickFixes +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Psi.ExtensionsAPI open JetBrains.ReSharper.Resources.Shell diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveUnusedSelfIdVariableFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveUnusedSelfIdVariableFix.fs index cde826499d..0b5a435bdc 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveUnusedSelfIdVariableFix.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveUnusedSelfIdVariableFix.fs @@ -1,10 +1,10 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes open JetBrains.Diagnostics +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings.CommonErrors open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Psi.ExtensionsAPI open JetBrains.ReSharper.Psi.ExtensionsAPI.Tree open JetBrains.ReSharper.Resources.Shell diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveYieldFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveYieldFix.fs new file mode 100644 index 0000000000..bd589c2010 --- /dev/null +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/RemoveYieldFix.fs @@ -0,0 +1,37 @@ +namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes + +open JetBrains.ReSharper.Plugins.FSharp.Psi +open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings +open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes +open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree +open JetBrains.ReSharper.Psi.ExtensionsAPI +open JetBrains.ReSharper.Resources.Shell + +type RemoveYieldFix(yieldExpr: IYieldOrReturnExpr) = + inherit FSharpQuickFixBase() + + let yieldKeyword = yieldExpr.YieldKeyword + + new (error: ReturnRequiresComputationExpressionError) = + RemoveYieldFix(error.YieldExpr) + + new (error: YieldRequiresSeqExpressionError) = + RemoveYieldFix(error.YieldExpr) + + override x.Text = "Remove " + yieldKeyword.GetTokenType().TokenRepresentation + + override x.IsAvailable _ = + isValid yieldExpr && isValid yieldKeyword + + override x.ExecutePsiTransaction _ = + use writeCookie = WriteLockCookie.Create(yieldExpr.IsPhysical()) + use disableFormatter = new DisableCodeFormatter() + + let expr = yieldExpr.Expression + let shift = expr.Indent - yieldExpr.Indent + if shift > 0 then + // Parsing `return` currently doesn't support deindenting, + // but we do a defensive indent diff check in case it's supported in future. + shiftExpr -shift yieldExpr + + replaceWithCopy yieldExpr expr diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ReplaceLetWithExpressionFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ReplaceLetWithExpressionFix.fs index 90c3e15501..760778beed 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ReplaceLetWithExpressionFix.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ReplaceLetWithExpressionFix.fs @@ -1,8 +1,8 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings open JetBrains.ReSharper.Plugins.FSharp.Psi.Parsing -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Plugins.FSharp.Util open JetBrains.ReSharper.Psi.ExtensionsAPI open JetBrains.ReSharper.Psi.ExtensionsAPI.Tree diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ReplaceUseWithLetFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ReplaceUseWithLetFix.fs index 820ff59c26..34d7bd9150 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ReplaceUseWithLetFix.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ReplaceUseWithLetFix.fs @@ -1,14 +1,14 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes open JetBrains.Diagnostics +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings open JetBrains.ReSharper.Plugins.FSharp.Psi.Parsing open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Psi.ExtensionsAPI open JetBrains.ReSharper.Resources.Shell -type ReplaceUseWithLetFix(letNode: ILet) = +type ReplaceUseWithLetFix(letNode: ILetBindings) = inherit FSharpQuickFixBase() new (warning: UseBindingsIllegalInModulesWarning) = diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ReplaceWithAssignmentExpressionFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ReplaceWithAssignmentExpressionFix.fs index e94cb12fd2..c2d6567270 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ReplaceWithAssignmentExpressionFix.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ReplaceWithAssignmentExpressionFix.fs @@ -1,10 +1,10 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes open FSharp.Compiler.SourceCodeServices +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings.CommonErrors open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Util.FSharpExpressionUtil open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Psi.ExtensionsAPI open JetBrains.ReSharper.Psi open JetBrains.ReSharper.Resources.Shell diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ReplaceWithWildPatFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ReplaceWithWildPatFix.fs index 160a5f5a02..e8dcdea8d7 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ReplaceWithWildPatFix.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ReplaceWithWildPatFix.fs @@ -1,9 +1,9 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util.PsiUtil open JetBrains.ReSharper.Psi.ExtensionsAPI open JetBrains.ReSharper.Resources.Shell @@ -23,14 +23,19 @@ type ReplaceWithWildPatFix(pat: INamedPat) = override x.IsAvailable _ = isValid pat && - if pat.IgnoreParentParens().Parent :? IAttribPat then false else + let pat = pat.IgnoreParentParens() + if isNotNull (AttribPatNavigator.GetByPattern(pat)) then false else + + let typedPat = TypedPatNavigator.GetByPattern(pat).IgnoreParentParens() + if isNotNull (AttribPatNavigator.GetByPattern(typedPat)) then false else let node = skipIntermediatePatParents pat |> getParent node :? IBinding || node :? IMatchClause || - node :? IMemberParamDeclaration && node.Parent :? IMemberDeclaration // todo: check this check + node :? IMemberParamsDeclaration && + (node.Parent :? IMemberDeclaration || node.Parent :? IMemberConstructorDeclaration) override x.ExecutePsiTransaction _ = use writeLock = WriteLockCookie.Create(pat.IsPhysical()) use disableFormatter = new DisableCodeFormatter() - replace pat (pat.FSharpLanguageService.CreateElementFactory(pat.GetPsiModule()).CreateWildPat()) + replace pat (pat.GetFSharpLanguageService().CreateElementFactory(pat.GetPsiModule()).CreateWildPat()) diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ToAbstractFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ToAbstractFix.fs index 55e94cd4c5..be3585d1fb 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ToAbstractFix.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ToAbstractFix.fs @@ -1,10 +1,10 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Util open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Psi.ExtensionsAPI open JetBrains.ReSharper.Resources.Shell diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ToRecursiveFunctionFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ToRecursiveFunctionFix.fs index 40f7375ec6..bf047aaa6b 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ToRecursiveFunctionFix.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ToRecursiveFunctionFix.fs @@ -3,9 +3,9 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes open JetBrains.ProjectModel open JetBrains.ReSharper.Feature.Services.Navigation.CustomHighlighting open JetBrains.ReSharper.Feature.Services.Refactorings.WorkflowOccurrences +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Psi.Tree open JetBrains.ReSharper.Resources.Shell open JetBrains.UI.RichText diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ToRecursiveLetBindingsFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ToRecursiveLetBindingsFix.fs index 05577c942a..cf116ea6ca 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ToRecursiveLetBindingsFix.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ToRecursiveLetBindingsFix.fs @@ -1,7 +1,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util type ToRecursiveLetBindingsFix(error: LetAndForNonRecBindingsError) = inherit FSharpQuickFixBase() diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ToUpcastFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ToUpcastFix.fs index ad8dfde0f7..78a9c7a5fe 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ToUpcastFix.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ToUpcastFix.fs @@ -1,9 +1,9 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree open JetBrains.ReSharper.Plugins.FSharp.Psi.Parsing -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Psi.ExtensionsAPI open JetBrains.ReSharper.Psi.ExtensionsAPI.Tree open JetBrains.ReSharper.Psi.Tree diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Refactorings/FSharpNamingService.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Refactorings/FSharpNamingService.fs index 65085fdb34..b924388f46 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Refactorings/FSharpNamingService.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Refactorings/FSharpNamingService.fs @@ -23,17 +23,17 @@ module Traverse = | TupleItem of item: int let makeTuplePatPath pat = - let rec tryMakePatPath path (IgnoreParenPat pat: ISynPat) = - match pat.Parent with + let rec tryMakePatPath path (IgnoreParenPat fsPattern: IFSharpPattern) = + match fsPattern.Parent with | :? ITuplePat as tuplePat -> - let item = tuplePat.Patterns.IndexOf(pat) + let item = tuplePat.Patterns.IndexOf(fsPattern) Assertion.Assert(item <> -1, "item <> -1") tryMakePatPath (TupleItem(item) :: path) tuplePat - | _ -> pat, path + | _ -> fsPattern, path tryMakePatPath [] pat - let rec tryTraverseExprPath (path: TraverseStep list) (IgnoreInnerParenExpr expr: ISynExpr) = + let rec tryTraverseExprPath (path: TraverseStep list) (IgnoreInnerParenExpr expr: IFSharpExpression) = match path with | [] -> expr | step :: rest -> @@ -227,8 +227,8 @@ type FSharpNamingService(language: FSharpLanguage) = | _ -> EmptyList.Instance :> _ - member x.AddExtraNames(namesCollection: INamesCollection, declaredElementPat: ISynPat) = - let pat, path = makeTuplePatPath declaredElementPat + member x.AddExtraNames(namesCollection: INamesCollection, fsPattern: IFSharpPattern) = + let pat, path = makeTuplePatPath fsPattern let entryOptions = EntryOptions(subrootPolicy = SubrootPolicy.Decompose, emphasis = Emphasis.Good, @@ -255,9 +255,8 @@ type FSharpNamingService(language: FSharpLanguage) = | expr -> addNamesForExpr expr | :? IForEachExpr as forEachExpr when forEachExpr.Pattern == pat -> - match forEachExpr.InClause.As() with - | null -> () - | expr -> + let expr = forEachExpr.InExpression + if expr :? IRangeSequenceExpr then () else let naming = pat.GetPsiServices().Naming let collection = @@ -272,7 +271,7 @@ type FSharpNamingService(language: FSharpLanguage) = | _ -> () - match declaredElementPat with + match fsPattern with | :? INamedPat as namedPat -> let parametersOwner = ParametersOwnerPatNavigator.GetByParameter(namedPat.IgnoreParentParens()) if isNull parametersOwner || parametersOwner.Parameters.Count <> 1 then () else @@ -303,7 +302,7 @@ type FSharpNamingService(language: FSharpLanguage) = if isNotNull field && field.IsConstant then base.GetNamedElementKind(element) else let declarations = element.GetDeclarations() - if declarations |> Seq.exists (fun decl -> decl :? ISynPat) then + if declarations |> Seq.exists (fun decl -> decl :? IFSharpPattern) then NamedElementKinds.Locals else base.GetNamedElementKind(element) diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Refactorings/IntroduceVariable.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Refactorings/IntroduceVariable.fs index 3be6d49b04..9f2bf73abc 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Refactorings/IntroduceVariable.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Refactorings/IntroduceVariable.fs @@ -1,18 +1,22 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Refactorings +open System.Collections.Generic open JetBrains.Application.DataContext open JetBrains.Application.UI.Actions.ActionManager +open JetBrains.Diagnostics open JetBrains.DocumentModel.DataContext open JetBrains.Lifetimes open JetBrains.ProjectModel.DataContext open JetBrains.ReSharper.Feature.Services.LiveTemplates.Hotspots open JetBrains.ReSharper.Feature.Services.Refactorings open JetBrains.ReSharper.Feature.Services.Refactorings.Specific +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Util open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree +open JetBrains.ReSharper.Plugins.FSharp.Psi.Parsing open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util +open JetBrains.ReSharper.Plugins.FSharp.Util open JetBrains.ReSharper.Psi open JetBrains.ReSharper.Psi.DataContext open JetBrains.ReSharper.Psi.ExtensionsAPI @@ -33,7 +37,12 @@ open JetBrains.Util type FSharpIntroduceVariable(workflow, solution, driver) = inherit IntroduceVariableBase(workflow, solution, driver) - let getNames (expr: ISynExpr) = + /// Applies to case where source expression is the node to replace and is the last expression in a block, + /// i.e. it doesn't have any expression to put as InExpression in the new `let` binding expression. + /// Producing incomplete expression adds error but is easier to edit code immediately afterwards. + let alwaysGenerateCompleteBindingExpr = false + + let getNames (expr: IFSharpExpression) = let language = expr.Language let sourceFile = expr.GetSourceFile() @@ -53,13 +62,14 @@ type FSharpIntroduceVariable(workflow, solution, driver) = let suggestionOptions = SuggestionOptions(null, DefaultName = "foo") namesCollection.Prepare(namingRule, ScopeKind.Common, suggestionOptions).AllNames() - let getReplaceRanges (expr: ISynExpr) (parent: ISynExpr) = - let sequentialExpr = SequentialExprNavigator.GetByExpression(expr) - if expr == parent && isNotNull sequentialExpr then - let inRange = TreeRange(expr.NextSibling, sequentialExpr.LastChild) + let getReplaceRanges (contextExpr: IFSharpExpression) removeSourceExpr = + let sequentialExpr = SequentialExprNavigator.GetByExpression(contextExpr) + if isNotNull sequentialExpr then + let inRangeStart = if removeSourceExpr then contextExpr.NextSibling else contextExpr :> _ + let inRange = TreeRange(inRangeStart, sequentialExpr.LastChild) let seqExprs = sequentialExpr.Expressions - let index = seqExprs.IndexOf(expr) + let index = seqExprs.IndexOf(contextExpr) if seqExprs.Count - index > 2 then // Replace rest expressions with a sequential expr node. @@ -67,19 +77,23 @@ type FSharpIntroduceVariable(workflow, solution, driver) = let newSeqExpr = ModificationUtil.ReplaceChildRange(inRange, TreeRange(newSeqExpr)).First LowLevelModificationUtil.AddChild(newSeqExpr, Array.ofSeq inRange) - {| ReplaceRange = TreeRange(expr, newSeqExpr) + + let replaceRange = + if removeSourceExpr then TreeRange(contextExpr, newSeqExpr) else TreeRange(newSeqExpr) + + {| ReplaceRange = replaceRange InRange = TreeRange(newSeqExpr) - AddNewLine = false |} + AddNewLine = not removeSourceExpr |} else // The last expression can be moved as is. - {| ReplaceRange = TreeRange(expr, sequentialExpr.LastChild) + {| ReplaceRange = TreeRange(contextExpr, sequentialExpr.LastChild) InRange = inRange - AddNewLine = false |} + AddNewLine = not removeSourceExpr |} else - let range = TreeRange(parent) + let range = TreeRange(contextExpr) {| ReplaceRange = range; InRange = range; AddNewLine = true |} - let rec getExprToInsertBefore (expr: ISynExpr): ISynExpr = + let rec getExprToInsertBefore (expr: IFSharpExpression): IFSharpExpression = let expr = expr.IgnoreParentParens() let parent = expr.Parent @@ -91,54 +105,122 @@ type FSharpIntroduceVariable(workflow, solution, driver) = | :? ISequentialExpr | :? ILambdaExpr | :? ITryLikeExpr -> expr | :? IBinding as binding when - binding.Expression == expr && isNotNull (LetLikeExprNavigator.GetByBinding(binding)) && + binding.Expression == expr && isNotNull (LetOrUseExprNavigator.GetByBinding(binding)) && // Don't escape function declarations not (binding.HeadPattern :? IParametersOwnerPat) -> - LetLikeExprNavigator.GetByBinding(binding) :> _ + LetOrUseExprNavigator.GetByBinding(binding) :> _ + + | :? IRecordExprBinding as fieldBinding -> + let recordExpr = RecordLikeExprNavigator.GetByExprBinding(fieldBinding) + getExprToInsertBefore recordExpr + + | :? ILetOrUseExpr as letExpr -> + Assertion.Assert(letExpr.InExpression == expr, "letExpr.InExpression == expr") + expr + + | :? IBinaryAppExpr as binaryAppExpr when + binaryAppExpr.RightArgument == expr && isNotNull binaryAppExpr.LeftArgument -> + let leftArgument = binaryAppExpr.LeftArgument - | :? ISynExpr as parentExpr -> getExprToInsertBefore parentExpr + if leftArgument.Indent = expr.Indent && leftArgument.EndLine + docLine 1 < expr.StartLine then + // Don't move up from "blocks" after empty non-code line separators. + // todo: allow choosing scope? + expr + else + // Try going up from the left part instead. + match leftArgument.IgnoreInnerParens() with + | :? IBinaryAppExpr as binaryAppExpr when isNotNull binaryAppExpr.RightArgument -> + getExprToInsertBefore binaryAppExpr.RightArgument + | _ -> getExprToInsertBefore leftArgument + + | :? IFSharpExpression as parentExpr -> getExprToInsertBefore parentExpr | _ -> expr - let getContextDeclaration (contextExpr: ISynExpr): IModuleMember = - let letDecl = LetModuleDeclNavigator.GetByBinding(BindingNavigator.GetByExpression(contextExpr)) + let getCommonParentExpr (data: IntroduceVariableData) (sourceExpr: IFSharpExpression): IFSharpExpression = + let commonParent = data.Usages.FindLCA().As().NotNull("commonParentExpr is null") + + let seqExpr = commonParent.As() + if isNull seqExpr then commonParent else + + if sourceExpr.Parent == commonParent then sourceExpr else + + let contextExpr = sourceExpr.PathToRoot() |> Seq.find (fun n -> n.Parent == commonParent) + contextExpr :?> _ + + let getContextDeclaration (contextExpr: IFSharpExpression): IModuleMember = + let binding = BindingNavigator.GetByExpression(contextExpr) + if isNull binding || binding.HeadPattern :? IParametersOwnerPat then null else + + let letDecl = LetModuleDeclNavigator.GetByBinding(binding) if isNotNull letDecl then letDecl :> _ else let doDecl = DoNavigator.GetByExpression(contextExpr) if isNotNull doDecl && doDecl.IsImplicit then doDecl :> _ else null - let createBinding (context: ISynExpr) (contextDecl: IModuleMember) name: ILet = + let createBinding (context: IFSharpExpression) (contextDecl: IModuleMember) name: ILetBindings = let elementFactory = context.CreateElementFactory() if isNotNull contextDecl then elementFactory.CreateLetModuleDecl(name) :> _ else elementFactory.CreateLetBindingExpr(name) :> _ - let getMoveToNewLineInfo (contextExpr: ISynExpr) = - if not contextExpr.IsSingleLine then None else + let isSingleLineContext (context: ITreeNode): bool = + let contextParent = context.Parent + if not contextParent.IsSingleLine then false else - let parent = contextExpr.Parent - let prevToken = + match contextParent with + | :? IMatchClause as matchClause -> + let matchClauseOwner = MatchClauseListOwnerNavigator.GetByClause(matchClause) + if matchClauseOwner.IsSingleLine then true else + + let clauses = matchClauseOwner.Clauses + let index = clauses.IndexOf(matchClause) + if index = clauses.Count - 1 then false else + + clauses.[index + 1].StartLine = matchClause.StartLine + + | :? IIfThenElseExpr | :? ILambdaExpr | :? ITryLikeExpr | :? IWhenExprClause -> true + | _ -> false + + let getMoveToNewLineInfo (contextExpr: IFSharpExpression) = + let requiresMultilineExpr (parent: ITreeNode) = match parent with + | :? IMemberDeclaration | :? IAutoProperty -> false + | _ -> true + + let contextExprParent = contextExpr.Parent + let contextParent = contextExpr.IgnoreParentChameleonExpr() + + if not contextExpr.IsSingleLine && requiresMultilineExpr contextParent then None else + + let prevToken = + match contextParent with | :? IBinding as binding when isNotNull binding.Parent -> binding.EqualsToken + | :? IMemberDeclaration as memberDeclaration -> memberDeclaration.EqualsToken + | :? IAutoProperty as autoProperty -> autoProperty.EqualsToken | :? IMatchClause as matchClause -> matchClause.RArrow + | :? IWhenExprClause as whenExpr -> whenExpr.WhenKeyword | :? ILambdaExpr as lambdaExpr -> lambdaExpr.RArrow | :? ITryLikeExpr as tryExpr -> tryExpr.TryKeyword | _ -> null if isNull prevToken then None else + let contextExpr: IFSharpTreeNode = + if contextExprParent :? IChameleonExpression then contextExprParent :?> _ else contextExpr :> _ + let prevSignificant = skipMatchingNodesBefore isInlineSpaceOrComment contextExpr - if not (obj.ReferenceEquals(prevSignificant, prevToken)) then None else + if prevSignificant != prevToken then None else let indent = - match parent with - | :? IBinding -> parent.Parent.Indent - | _ -> parent.Indent + match contextParent with + | :? IBinding -> contextParent.Parent.Indent + | _ -> contextParent.Indent Some(indent + contextExpr.GetIndentSize()) - let moveToNewLine (contextExpr: ISynExpr) (indent: int) = + let moveToNewLine (contextExpr: IFSharpExpression) (indent: int) = let prevSibling = contextExpr.PrevSibling if isInlineSpace prevSibling then let first = getFirstMatchingNodeBefore isInlineSpace prevSibling @@ -149,16 +231,29 @@ type FSharpIntroduceVariable(workflow, solution, driver) = Whitespace(indent) ] |> ignore - static member val ExpressionToRemove = Key("FSharpIntroduceVariable.ExpressionToRemove") + static member val ExpressionToRemoveKey = Key("FSharpIntroduceVariable.ExpressionToRemove") override x.Process(data) = - let sourceExpr = data.SourceExpression.As() - let commonParentExpr = data.Usages.FindLCA().As() + // Replace the actual source expression with the outer-most expression among usages, + // since it's needed for calculating a common node to replace. + let sourceExpr = data.Usages |> Seq.minBy (fun u -> u.GetTreeStartOffset().Offset) :?> IFSharpExpression + let commonParentExpr = getCommonParentExpr data sourceExpr - // contextDecl is not null when expression is bound to a module/type let binding + // `contextDecl` is not null when expression is bound to a module/type let binding let contextExpr = getExprToInsertBefore commonParentExpr let contextDecl = getContextDeclaration contextExpr - let moveToNewLineInfo = if isNotNull contextDecl then None else getMoveToNewLineInfo contextExpr + + let contextIsSourceExpr = sourceExpr == contextExpr && isNull contextDecl + let isInSingleLineContext = isNull contextDecl && isSingleLineContext contextExpr + + let isInSeqExpr = + let seqExpr = SequentialExprNavigator.GetByExpression(sourceExpr) + isNotNull seqExpr && sourceExpr != seqExpr.Expressions.Last() + + let replaceSourceExprNode = contextIsSourceExpr && not isInSeqExpr + + let moveToNewLineInfo = + if isNotNull contextDecl || isInSingleLineContext then None else getMoveToNewLineInfo contextExpr let contextIndent = if isNotNull contextDecl then contextDecl.Indent else @@ -170,8 +265,18 @@ type FSharpIntroduceVariable(workflow, solution, driver) = let names = getNames sourceExpr let name = if names.Count > 0 then names.[0] else "x" - let removeSourceExpr = sourceExpr.UserData.HasKey(FSharpIntroduceVariable.ExpressionToRemove) - sourceExpr.UserData.RemoveKey(FSharpIntroduceVariable.ExpressionToRemove) + let removeSourceExpr = + if data.SourceExpression.UserData.HasKey(FSharpIntroduceVariable.ExpressionToRemoveKey) then true else + if not contextIsSourceExpr then false else + if data.Usages.Count = 1 then true else + + let seqExpr = SequentialExprNavigator.GetByExpression(sourceExpr) + if isNull seqExpr then false else + + let arrayOrListExpr = ArrayOrListExprNavigator.GetByExpression(seqExpr) + isNull arrayOrListExpr || data.Usages.Count = 1 + + sourceExpr.UserData.RemoveKey(FSharpIntroduceVariable.ExpressionToRemoveKey) use writeCookie = WriteLockCookie.Create(sourceExpr.IsPhysical()) use disableFormatter = new DisableCodeFormatter() @@ -185,33 +290,83 @@ type FSharpIntroduceVariable(workflow, solution, driver) = let letBindings = createBinding contextExpr contextDecl name setBindingExpression sourceExpr contextIndent letBindings - let replacedUsages = - data.Usages |> Seq.choose (fun usage -> - if not (isValid usage) then None else - if removeSourceExpr && obj.ReferenceEquals(usage, contextExpr) then None else + let replacedUsages, sourceExpr = + data.Usages |> Seq.fold (fun ((replacedUsages, sourceExpr) as acc) usage -> + if not (isValid usage) then acc else + + let usageIsSourceExpr = usage == sourceExpr + + if usageIsSourceExpr && (removeSourceExpr || replaceSourceExprNode) then + // Ignore this usage, it's going to be removed via replacing tree ranges later. + acc else + + let refExpr = elementFactory.CreateReferenceExpr(name) :> IFSharpExpression + let replacedUsage = ModificationUtil.ReplaceChild(usage, refExpr) - let ref = elementFactory.CreateReferenceExpr(name) - Some (ModificationUtil.ReplaceChild(usage, ref).As().CreateTreeElementPointer())) - |> Seq.toArray + let sourceExpr = + if usageIsSourceExpr && contextIsSourceExpr && isInSeqExpr then replacedUsage else sourceExpr + + let replacedUsagePointer = replacedUsage.As().CreateTreeElementPointer() + replacedUsagePointer :: replacedUsages, sourceExpr) ([], sourceExpr) + + let contextExpr = if contextIsSourceExpr then sourceExpr else contextExpr + let replacedUsages = List(Seq.rev replacedUsages) match moveToNewLineInfo with | Some indent -> moveToNewLine contextExpr indent | _ -> () - let letBindings: ILet = + let letBindings: ILetBindings = match letBindings with + | :? ILetOrUseExpr when replaceSourceExprNode -> + let letBindings = ModificationUtil.ReplaceChild(sourceExpr, letBindings) + + let createRefExpr () = + let refExpr = elementFactory.CreateReferenceExpr(name).As() + let nodePointer = refExpr.CreateTreeElementPointer() + replacedUsages.Add(nodePointer) + refExpr + + if alwaysGenerateCompleteBindingExpr then + addNodesAfter letBindings.LastChild [ + NewLine(lineEnding) + Whitespace(contextIndent) + + if removeSourceExpr then + elementFactory.CreateExpr("()") + else + createRefExpr () + ] |> ignore + + if isInSingleLineContext then + addNodesAfter letBindings.LastChild [ + Whitespace() + FSharpTokenType.IN.CreateLeafElement() + Whitespace() + createRefExpr () + ] |> ignore + + letBindings + | :? ILetOrUseExpr -> - let ranges = getReplaceRanges sourceExpr contextExpr - let replaced = ModificationUtil.ReplaceChildRange(ranges.ReplaceRange, TreeRange(letBindings)) - let letBindings = replaced.First :?> ILet + let ranges = getReplaceRanges contextExpr removeSourceExpr + let letBindings = ModificationUtil.AddChildBefore(ranges.ReplaceRange.First, letBindings) let binding = letBindings.Bindings.[0] let replaceRange = TreeRange(binding.NextSibling, letBindings.LastChild) let replaced = ModificationUtil.ReplaceChildRange(replaceRange, ranges.InRange) - if ranges.AddNewLine then + if isInSingleLineContext then + addNodesBefore replaced.First [ + Whitespace() + FSharpTokenType.IN.CreateLeafElement() + Whitespace() + ] |> ignore + elif ranges.AddNewLine then let anchor = ModificationUtil.AddChildBefore(replaced.First, NewLine(lineEnding)) ModificationUtil.AddChildAfter(anchor, Whitespace(contextIndent)) |> ignore + + ModificationUtil.DeleteChildRange(letBindings.NextSibling, letBindings.Parent.LastChild) letBindings | :? ILetModuleDecl -> @@ -227,19 +382,25 @@ type FSharpIntroduceVariable(workflow, solution, driver) = let nodes = let replacedNodes = replacedUsages - |> Array.choose (fun pointer -> pointer.GetTreeNode() |> Option.ofObj) + |> Seq.choose (fun pointer -> pointer.GetTreeNode() |> Option.ofObj) + |> Seq.toArray - [| letBindings.As().Bindings.[0].HeadPattern :> ITreeNode |] + [| letBindings.As().Bindings.[0].HeadPattern :> ITreeNode |] |> Array.append replacedNodes let nameExpression = NameSuggestionsExpression(names) let hotspotsRegistry = HotspotsRegistry(solution.GetPsiServices()) hotspotsRegistry.Register(nodes, nameExpression) - let expr = letBindings.Bindings.[0].Expression - IntroduceVariableResult(hotspotsRegistry, expr.As().CreateTreeElementPointer()) + let caretTarget = + if isInSingleLineContext && replaceSourceExprNode then + letBindings.LastChild + else + letBindings.Bindings.[0].Expression :> _ + + IntroduceVariableResult(hotspotsRegistry, caretTarget.CreateTreeElementPointer()) - static member IntroduceVar(expr: ISynExpr, textControl: ITextControl, ?removeSourceExpr) = + static member IntroduceVar(expr: IFSharpExpression, textControl: ITextControl, ?removeSourceExpr) = let removeSourceExpr = defaultArg removeSourceExpr false let name = "FSharpIntroduceVar" @@ -258,22 +419,17 @@ type FSharpIntroduceVariable(workflow, solution, driver) = let dataContext = actionManager.DataContexts.CreateWithDataRules(lifetime.Lifetime, rules) if removeSourceExpr then - expr.UserData.PutKey(FSharpIntroduceVariable.ExpressionToRemove) + expr.UserData.PutKey(FSharpIntroduceVariable.ExpressionToRemoveKey) let workflow = IntroduceVariableWorkflow(solution, null) RefactoringActionUtil.ExecuteRefactoring(dataContext, workflow) - static member CanIntroduceVar(expr: ISynExpr, allowInSeqExprOnly) = + static member CanIntroduceVar(expr: IFSharpExpression) = if not (isValid expr) then false else - let isInSeqExpr (expr: ISynExpr) = - let sequentialExpr = SequentialExprNavigator.GetByExpression(expr) - if isNull sequentialExpr then false else + let rec isValidExpr (expr: IFSharpExpression) = + if FSharpMethodInvocationUtil.isNamedArgReference expr then false else - let nextMeaningfulSibling = expr.GetNextMeaningfulSibling() - nextMeaningfulSibling :? ISynExpr && nextMeaningfulSibling.Indent = expr.Indent - - let rec isValidExpr (expr: ISynExpr) = match expr with | :? IReferenceExpr as refExpr -> let declaredElement = refExpr.Reference.Resolve().DeclaredElement @@ -282,15 +438,16 @@ type FSharpIntroduceVariable(workflow, solution, driver) = | :? IParenExpr as parenExpr -> isValidExpr parenExpr.InnerExpression + | :? IRangeSequenceExpr | :? IComputationExpr | :? IYieldOrReturnExpr -> false + | _ -> true - let isAllowedContext (expr: ISynExpr) = - let topLevelExpr = skipIntermediateParentsOfSameType(expr) + let isAllowedContext (expr: IFSharpExpression) = + let topLevelExpr = skipIntermediateParentsOfSameType(expr) if isNotNull (AttributeNavigator.GetByExpression(topLevelExpr)) then false else true - if allowInSeqExprOnly && not (isInSeqExpr expr) then false else if not (isAllowedContext expr) then false else isValidExpr expr @@ -299,18 +456,18 @@ type FSharpIntroduceVarHelper() = inherit IntroduceVariableHelper() let isExpressionToRemove (expr: ITreeNode) = - expr.UserData.HasKey(FSharpIntroduceVariable.ExpressionToRemove) + expr.UserData.HasKey(FSharpIntroduceVariable.ExpressionToRemoveKey) override x.IsLanguageSupported = true override x.CheckAvailability(node) = - let expr = node.As() + let expr = node.As() if isNull expr then false else - if expr.UserData.HasKey(FSharpIntroduceVariable.ExpressionToRemove) then true else + if expr.UserData.HasKey(FSharpIntroduceVariable.ExpressionToRemoveKey) then true else if not (expr.FSharpExperimentalFeaturesEnabled()) then false else - FSharpIntroduceVariable.CanIntroduceVar(expr, false) + FSharpIntroduceVariable.CanIntroduceVar(expr) override x.CheckOccurrence(expr, occurrence) = if isExpressionToRemove occurrence then true else diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Refactorings/Rename.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Refactorings/Rename.fs index 1ec72e70a8..083ffa2d9d 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Refactorings/Rename.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Refactorings/Rename.fs @@ -86,18 +86,22 @@ type FSharpRenameHelper(namingService: FSharpNamingService) = newDeclaredElement.PresentationLanguage.Is() override x.IsLocalRename(element: IDeclaredElement) = + if not (element :? IFSharpLocalDeclaration) then false else + match element with - | :? IParametersOwnerPat as longIdentPat -> longIdentPat.IsDeclaration - | _ -> element :? IFSharpLocalDeclaration + | :? INamedPat as namedPat -> namedPat.IsDeclaration + | _ -> true - override x.CheckLocalRenameSameDocument(element: IDeclaredElement) = x.IsLocalRename(element) + override x.CheckLocalRenameSameDocument(element: IDeclaredElement) = + x.IsLocalRename(element) override x.GetSecondaryElements(element: IDeclaredElement, newName) = match element with | :? ILocalReferencePat as localNamedPat -> - let mutable pat = localNamedPat :> ISynPat - while (pat.Parent :? ISynPat) && not (pat.Parent :? IParametersOwnerPat && (pat.Parent :?> ISynPat).IsDeclaration) do - pat <- pat.Parent :?> ISynPat + let mutable pat = localNamedPat :> IFSharpPattern + while pat.Parent :? IFSharpPattern && + not (pat.Parent :? IParametersOwnerPat && (pat.Parent :?> IFSharpPattern).IsDeclaration) do + pat <- pat.Parent :?> IFSharpPattern pat.Declarations |> Seq.cast @@ -109,7 +113,7 @@ type FSharpRenameHelper(namingService: FSharpNamingService) = | :? IGeneratedConstructorParameterOwner as parameterOwner -> [| parameterOwner.GetParameter() :> IDeclaredElement |] :> _ - | :? IModule -> EmptyArray.Instance :> _ + | :? IFSharpModule -> EmptyArray.Instance :> _ | :? IFSharpTypeElement as fsTypeElement -> match fsTypeElement.GetModuleToUpdateName(newName) with @@ -181,12 +185,12 @@ type FSharpAtomicRenamesFactory() = override x.CheckRenameAvailability(element: IDeclaredElement) = match element with | :? FSharpGeneratedMemberBase -> RenameAvailabilityCheckResult.CanNotBeRenamed - | :? IParametersOwnerPat as pat when not pat.IsDeclaration -> RenameAvailabilityCheckResult.CanNotBeRenamed + | :? INamedPat as pat when not pat.IsDeclaration -> RenameAvailabilityCheckResult.CanNotBeRenamed | :? IFSharpDeclaredElement as fsElement when fsElement.SourceName = SharedImplUtil.MISSING_DECLARATION_NAME -> RenameAvailabilityCheckResult.CanNotBeRenamed - | :? IModule as fsModule when fsModule.IsAnonymous -> + | :? IFSharpModule as fsModule when fsModule.IsAnonymous -> RenameAvailabilityCheckResult.CanNotBeRenamed // todo: needs a special implementation | _ -> diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Search/FSharpItemOccurrenceKind.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Search/FSharpItemOccurrenceKind.fs index 1605f0ba1b..b3806685e9 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Search/FSharpItemOccurrenceKind.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Search/FSharpItemOccurrenceKind.fs @@ -63,35 +63,35 @@ type FSharpItemOccurenceKindProvider() = if isNotNull (NewExprNavigator.GetByTypeName(typeReferenceName)) then [| OccurrenceKind.NewInstanceCreation |] :> _ else - let namedType = NamedTypeNavigator.GetByReferenceName(typeReferenceName) - if isNull namedType then EmptyList.Instance :> _ else + let namedTypeUsage = NamedTypeUsageNavigator.GetByReferenceName(typeReferenceName) + if isNull namedTypeUsage then EmptyList.Instance :> _ else // todo: return type in `a -> b` - if isNotNull (ReturnTypeInfoNavigator.GetByReturnType(namedType)) then + if isNotNull (ReturnTypeInfoNavigator.GetByReturnType(namedTypeUsage)) then [| FSharpOccurrenceKinds.typeSpecification |] :> _ else - if isNotNull (AnonRecordFieldNavigator.GetByType(namedType)) || - isNotNull (RecordFieldDeclarationNavigator.GetByType(namedType)) || - isNotNull (CaseFieldDeclarationNavigator.GetByType(namedType)) then + if isNotNull (AnonRecordFieldNavigator.GetByType(namedTypeUsage)) || + isNotNull (RecordFieldDeclarationNavigator.GetByType(namedTypeUsage)) || + isNotNull (CaseFieldDeclarationNavigator.GetByType(namedTypeUsage)) then [| OccurrenceKind.FieldTypeDeclaration |] :> _ else - if isNotNull (TypedPatNavigator.GetByType(namedType)) || - isNotNull (TypedExprNavigator.GetByType(namedType)) then + if isNotNull (TypedPatNavigator.GetByType(namedTypeUsage)) || + isNotNull (TypedExprNavigator.GetByType(namedTypeUsage)) then [| FSharpOccurrenceKinds.typeSpecification |] :> _ else - if isNotNull (IsInstPatNavigator.GetByType(namedType)) || - isNotNull (TypeTestExprNavigator.GetByTypeUsage(namedType)) then + if isNotNull (IsInstPatNavigator.GetByType(namedTypeUsage)) || + isNotNull (TypeTestExprNavigator.GetByTypeUsage(namedTypeUsage)) then [| CSharpSpecificOccurrenceKinds.TypeChecking |] :> _ else - if isNotNull (CastExprNavigator.GetByTypeUsage(namedType)) then + if isNotNull (CastExprNavigator.GetByTypeUsage(namedTypeUsage)) then [| CSharpSpecificOccurrenceKinds.TypeConversions |] :> _ else - if isNotNull (TypeAbbreviationDeclarationNavigator.GetByAbbreviatedType(namedType)) then + if isNotNull (TypeAbbreviationDeclarationNavigator.GetByAbbreviatedType(namedTypeUsage)) then [| FSharpOccurrenceKinds.typeAbbreviation |] :> _ else - if isNotNull (TypeArgumentListNavigator.GetByType(namedType)) || - isNotNull (TupleTypeNavigator.GetByItem(namedType)) || - isNotNull (ArrayTypeNavigator.GetByType(namedType)) then + if isNotNull (TypeArgumentListNavigator.GetByType(namedTypeUsage)) || + isNotNull (TupleTypeUsageNavigator.GetByItem(namedTypeUsage)) || + isNotNull (ArrayTypeUsageNavigator.GetByType(namedTypeUsage)) then [| CSharpSpecificOccurrenceKinds.TypeArgument |] :> _ else EmptyList.Instance :> _ diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Search/FSharpPathReference.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Search/FSharpPathReference.fs index a6ee0a5ec5..f0b2a728e3 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Search/FSharpPathReference.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Search/FSharpPathReference.fs @@ -48,7 +48,7 @@ type FSharpPathReference(owner, sourceFile) = let fsFile = owner.GetContainingFile() :?> IFSharpFile let document = sourceFile.Document let tokenStartOffset = owner.Parent.GetTreeStartOffset() - fsFile.CheckerService.OptionsProvider.GetProjectOptions(sourceFile) + fsFile.CheckerService.FcsProjectProvider.GetProjectOptions(sourceFile) |> Option.bind (fun options -> options.OriginalLoadReferences |> List.tryFind (fun (range, _, _) -> getTreeStartOffset document range = tokenStartOffset) diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Search/FSharpSearchGuru.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Search/FSharpSearchGuru.fs index d69afa7527..cd3b2c69cd 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Search/FSharpSearchGuru.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Search/FSharpSearchGuru.fs @@ -8,50 +8,55 @@ open JetBrains.ReSharper.Psi open JetBrains.ReSharper.Psi.ExtensionsAPI.Finder open JetBrains.ReSharper.Psi.Modules -type ElementDeclarationFileIndex = - { FileIndex: int - Module: IPsiModule } +type FSharpSearchGuruElementId = + { DeclaredElement: IDeclaredElement + PsiModule: IPsiModule + FileIndex: int } [] -type FSharpSearchGuru(fsProjectOptionsProvider: IFSharpProjectOptionsProvider) = +type FSharpSearchGuru(fsProjectOptionsProvider: IFcsProjectProvider) = let getTypeElement (fsElement: IFSharpDeclaredElement) = match fsElement with | :? ITypeElement as typeElement -> typeElement | fsElement -> fsElement.GetContainingType() interface ISearchGuru with - member x.IsAvailable(_) = true + member x.IsAvailable _ = true member x.BuzzWordFilter(_, words) = words member x.GetElementId(element) = - match element.As() with - | null -> null - | fsElement -> + let fsDeclaredElement = element.As() + if isNull fsDeclaredElement then null else - match getTypeElement fsElement with - | null -> null - | typeElement -> + let typeElement = getTypeElement fsDeclaredElement + if isNull typeElement then null else - let sourceFiles = typeElement.GetSourceFiles().ReadOnlyList() - if sourceFiles.Count = 0 then null else + let sourceFiles = typeElement.GetSourceFiles() + if sourceFiles.IsEmpty then null else let declarationFileIndex = - sourceFiles - |> Seq.map (fun sourceFile -> fsProjectOptionsProvider.GetFileIndex(sourceFile)) + sourceFiles.ReadOnlyList() + |> Seq.map fsProjectOptionsProvider.GetFileIndex |> Seq.min if declarationFileIndex = -1 then null else - { Module = typeElement.Module + { DeclaredElement = element + PsiModule = fsDeclaredElement.Module FileIndex = declarationFileIndex } :> _ member x.CanContainReferences(sourceFile, elementId) = - let fileIndex = elementId :?> ElementDeclarationFileIndex - if not (sourceFile.LanguageType.Is()) then true else - if sourceFile.PsiModule != fileIndex.Module then true else + + let fsElementId = elementId :?> FSharpSearchGuruElementId + + let typePrivateMember = fsElementId.DeclaredElement.As() + if isNotNull typePrivateMember then + typePrivateMember.GetSourceFiles().Contains(sourceFile) else + + if sourceFile.PsiModule != fsElementId.PsiModule then true else let sourceFileIndex = fsProjectOptionsProvider.GetFileIndex(sourceFile) - sourceFileIndex >= fileIndex.FileIndex + sourceFileIndex >= fsElementId.FileIndex diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/FSharpAttributesUtil.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/FSharpAttributesUtil.fs index e032de4a3c..fbd4de3dda 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/FSharpAttributesUtil.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/FSharpAttributesUtil.fs @@ -1,9 +1,9 @@ module JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Util.FSharpAttributesUtil +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree open JetBrains.ReSharper.Plugins.FSharp.Psi.Parsing open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Plugins.FSharp.Util open JetBrains.ReSharper.Psi.ExtensionsAPI.Tree diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/FSharpAutoOpenUtil.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/FSharpAutoOpenUtil.fs new file mode 100644 index 0000000000..3a2e5cded0 --- /dev/null +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/FSharpAutoOpenUtil.fs @@ -0,0 +1,39 @@ +[] +module JetBrains.ReSharper.Plugins.FSharp.Psi.Util.FSharpAutoOpenUtil + +open System.Collections.Generic +open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl +open JetBrains.ReSharper.Plugins.FSharp.Util +open JetBrains.ReSharper.Plugins.FSharp.Util.FSharpAssemblyUtil +open JetBrains.ReSharper.Psi +open JetBrains.ReSharper.Psi.Caches +open JetBrains.ReSharper.Psi.Impl.Reflection2 +open JetBrains.Util + +let rec getNestedAutoImportedModules (declaredElement: IClrDeclaredElement) (symbolScope: ISymbolScope) = seq { + for typeElement in getNestedTypes declaredElement symbolScope do + if typeElement.HasAutoOpenAttribute() then + yield typeElement + yield! getNestedAutoImportedModules typeElement symbolScope } + +let getAutoOpenModules (psiAssemblyFileLoader: IPsiAssemblyFileLoader) (assembly: IPsiAssembly) = + let result = List() + + psiAssemblyFileLoader.GetOrLoadAssembly(assembly, true, fun psiAssembly assemblyFile metadataAssembly -> + let attributesSet = assemblyFile.CreateAssemblyAttributes() + let attributes = getAutoOpenAttributes attributesSet + + if attributes.IsEmpty() then () else + + let psiServices = psiAssembly.PsiModule.GetPsiServices() + let symbolScope = psiServices.Symbols.GetSymbolScope(psiAssembly.PsiModule, false, true) + + for attribute in attributes do + let moduleString = attribute.PositionParameter(0).ConstantValue.Value.As() + if moduleString.IsNullOrEmpty() then () else + + for declaredElement in symbolScope.GetElementsByQualifiedName(moduleString) do + result.Add(declaredElement) + result.AddRange(getNestedAutoImportedModules declaredElement symbolScope)) |> ignore + + result diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/FSharpExpressionUtil.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/FSharpExpressionUtil.fs index b6a0421a29..c9e945ebf7 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/FSharpExpressionUtil.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/FSharpExpressionUtil.fs @@ -2,17 +2,17 @@ module JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Util.FSharpExpressionUtil open JetBrains.Diagnostics +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree open JetBrains.ReSharper.Plugins.FSharp.Psi.Parsing open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Plugins.FSharp.Util open JetBrains.ReSharper.Psi open JetBrains.ReSharper.Psi.ExtensionsAPI.Tree open JetBrains.ReSharper.Psi.Tree -let isPredefinedFunctionRef name (expr: ISynExpr) = +let isPredefinedFunctionRef name (expr: IFSharpExpression) = let refExpr = expr.IgnoreInnerParens().As() if isNull refExpr then false else @@ -31,7 +31,7 @@ let inline isPredefinedInfixOpApp name (binaryAppExpr: IBinaryAppExpr) = if isNull binaryAppExpr then false else isPredefinedFunctionRef name binaryAppExpr.Operator -let inline isPredefinedFunctionApp name (expr: ISynExpr) (arg: outref) = +let inline isPredefinedFunctionApp name (expr: IFSharpExpression) (arg: outref) = match expr with | :? IPrefixAppExpr as prefixApp when isPredefinedFunctionRef name prefixApp.FunctionExpression -> @@ -52,7 +52,7 @@ let inline isPredefinedFunctionApp name (expr: ISynExpr) (arg: outref) | _ -> false -let rec createLogicallyNegatedExpression (expr: ISynExpr): ISynExpr = +let rec createLogicallyNegatedExpression (expr: IFSharpExpression): IFSharpExpression = if isNull expr then null else let expr = expr.IgnoreInnerParens() @@ -65,7 +65,7 @@ let rec createLogicallyNegatedExpression (expr: ISynExpr): ISynExpr = let binaryApp = expr.As() - let replaceBinaryApp nameTo negateArgs: ISynExpr = + let replaceBinaryApp nameTo negateArgs: IFSharpExpression = let arg1 = binaryApp.LeftArgument let arg2 = binaryApp.RightArgument @@ -101,10 +101,25 @@ let rec createLogicallyNegatedExpression (expr: ISynExpr): ISynExpr = factory.CreateAppExpr("not", expr) :> _ -let setBindingExpression (expr: ISynExpr) contextIndent (letBindings: #ILet) = +let setBindingExpression (expr: IFSharpExpression) contextIndent (letBindings: #ILetBindings) = let newExpr = letBindings.Bindings.[0].SetExpression(expr.Copy()) if not expr.IsSingleLine then let indentSize = expr.GetIndentSize() ModificationUtil.AddChildBefore(newExpr, NewLine(expr.GetLineEnding())) |> ignore ModificationUtil.AddChildBefore(newExpr, Whitespace(contextIndent + indentSize)) |> ignore shiftExpr indentSize newExpr + +let rec isTypeEvident (expr: IFSharpExpression) = + match expr.IgnoreInnerParens() with + | :? IObjExpr + | :? ICastExpr + | :? ILambdaExpr + | :? ILiteralExpr -> true + | :? ITupleExpr as tupleExpr -> + tupleExpr.Expressions |> Seq.forall isTypeEvident + | :? IArrayOrListExpr as arrayOrListExpr -> + match arrayOrListExpr.Expression with + | :? ISequentialExpr as seqExpr -> + isTypeEvident (seqExpr.ExpressionsEnumerable.FirstOrDefault()) + | _ -> false + | _ -> false diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/FSharpMethodInvocationUtil.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/FSharpMethodInvocationUtil.fs index 35ef224c23..d2b6f19197 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/FSharpMethodInvocationUtil.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/FSharpMethodInvocationUtil.fs @@ -1,44 +1,88 @@ module JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Util.FSharpMethodInvocationUtil +open FSharp.Compiler.SourceCodeServices open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree open JetBrains.ReSharper.Psi -open JetBrains.ReSharper.Psi.Tree +open JetBrains.ReSharper.Psi.ExtensionsAPI -let tryGetNamedArg (expr: ISynExpr) = +let tryGetNamedArgRefExpr (expr: IFSharpExpression) = let binaryAppExpr = expr.As() if isNull binaryAppExpr then null else - if binaryAppExpr.Operator.Reference.GetName() <> "=" then null else - let refExpr = binaryAppExpr.LeftArgument.As() - if isNull refExpr then null else + binaryAppExpr.LeftArgument.As() + + +let isNamedArgReference (expr: IFSharpExpression) = + let refExpr = tryGetNamedArgRefExpr expr + if isNull refExpr then false else + + match refExpr.Reference.GetFSharpSymbol() with + | :? FSharpParameter -> true + | :? FSharpField as fsField -> fsField.IsUnionCaseField + | _ -> false + + +let tryGetNamedArg (expr: IFSharpExpression) = + match tryGetNamedArgRefExpr expr with + | null -> null + | refExpr -> refExpr.Reference.Resolve().DeclaredElement.As() + + +let getMatchingParameter (expr: IFSharpExpression) = + let argsOwner = + let tupleExpr = TupleExprNavigator.GetByExpression(expr.IgnoreParentParens()) + let exprContext = if isNull tupleExpr then expr else tupleExpr :> _ + FSharpArgumentOwnerNavigator.GetByArgumentExpression(exprContext.IgnoreParentParens()) + + if isNull argsOwner then null else + + let namedArgRefExpr = tryGetNamedArgRefExpr expr + + let namedParam = + match namedArgRefExpr with + | null -> null + | namedRef -> namedRef.Reference.Resolve().DeclaredElement.As() - refExpr.Reference.Resolve().DeclaredElement.As() + if isNotNull namedParam then namedParam else -let getMatchingParameter (initialExpr: ISynExpr) = - let expr = initialExpr.IgnoreInnerParens() - let tupleExpr = TupleExprNavigator.GetByExpression(expr) - let tupleExprContext = tupleExpr.IgnoreParentParens() + let symbolReference = argsOwner.Reference + if isNull symbolReference then null else - let appExpr = PrefixAppExprNavigator.GetByArgumentExpression(if isNull tupleExpr then expr else tupleExprContext) - if isNull appExpr then null else + let mfv = + symbolReference.TryGetFSharpSymbol() + |> Option.bind (function + | :? FSharpMemberOrFunctionOrValue as mfv -> Some mfv + | _ -> None) - let refExpr = appExpr.FunctionExpression.As() - if isNull refExpr then null else + match mfv with + | None -> null + | Some mfv -> - use compilationContextCookie = CompilationContextCookie.OverrideOrCreate(expr.GetResolveContext()) + let paramOwner = symbolReference.Resolve().DeclaredElement.As() + if isNull paramOwner then null else - let parameter = tryGetNamedArg initialExpr - if isNotNull parameter then parameter else + let param = + if isNotNull namedArgRefExpr then + // If this is a named argument, but FCS couldn't match it, try matching ourselves by name + paramOwner.Parameters + |> Seq.tryFind (fun param -> param.ShortName = namedArgRefExpr.Reference.GetName()) + else + let args = argsOwner.ParameterArguments + match args |> Seq.tryFindIndex (fun argExpr -> expr.Equals(argExpr)) with + | None -> None + | Some paramIndex -> - let method = refExpr.Reference.Resolve().DeclaredElement.As() - let parameters = method.Parameters - if parameters.Count = 1 then parameters.[0] else + let invokingExtensionMethod = mfv.IsExtensionMember && Some mfv.ApparentEnclosingEntity <> mfv.DeclaringEntity + let offset = if invokingExtensionMethod then 1 else 0 + Some paramOwner.Parameters.[paramIndex + offset] - let index = tupleExpr.Expressions.IndexOf(expr) - if index < parameters.Count then parameters.[index] else null + // Skip unnamed parameters + match param with + | Some param when param.ShortName <> SharedImplUtil.MISSING_DECLARATION_NAME -> param + | _ -> null [)>] type FSharpMethodInvocationUtil() = diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/FSharpParensUtil.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/FSharpParensUtil.fs index ef1dbf241e..376f0433b9 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/FSharpParensUtil.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/FSharpParensUtil.fs @@ -3,13 +3,13 @@ module JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Util.FSharpParensUtil open System open FSharp.Compiler +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl open JetBrains.ReSharper.Psi.ExtensionsAPI.Tree open JetBrains.ReSharper.Psi.Tree -let deindentsBody (expr: ISynExpr) = +let deindentsBody (expr: IFSharpExpression) = match expr with | :? IMatchClauseListOwner as matchExpr -> if expr.IsSingleLine then false else @@ -31,7 +31,7 @@ let deindentsBody (expr: ISynExpr) = let (|Prefix|_|) (other: string) (str: string) = if str.StartsWith(other, StringComparison.Ordinal) then someUnit else None -let precedence (expr: ISynExpr): int = +let precedence (expr: IFSharpExpression): int = match expr with | :? IBinaryAppExpr as binaryApp -> let refExpr = binaryApp.Operator @@ -71,9 +71,9 @@ let isHighPrecedenceApp (appExpr: IPrefixAppExpr) = let argStartOffset = argExpr.GetTreeStartOffset() funEndOffset = argStartOffset -let private canBeTopLevelArgInHighPrecedenceApp (expr: ISynExpr) = - expr :? IArrayOrListExpr || expr :? IArrayOrListOfSeqExpr || - expr :? IObjExpr || expr :? IRecordExpr +let private canBeTopLevelArgInHighPrecedenceApp (expr: IFSharpExpression) = + // todo: check `ignore{| Field = 1 + 1 |}.Field` vs `ignore[].Head` + expr :? IArrayOrListExpr || expr :? IObjExpr || expr :? IRecordLikeExpr let rec private isHighPrecedenceAppRequired (appExpr: IPrefixAppExpr) = let argExpr = appExpr.ArgumentExpression.IgnoreInnerParens() @@ -83,7 +83,7 @@ let rec private isHighPrecedenceAppRequired (appExpr: IPrefixAppExpr) = false -let rec needsParens (expr: ISynExpr) = +let rec needsParens (expr: IFSharpExpression) = if isNull expr then false else let context = expr.IgnoreParentParens() @@ -98,10 +98,8 @@ let rec needsParens (expr: ISynExpr) = | :? IParenExpr | :? IQuoteExpr | :? IConstExpr | :? INullExpr - | :? IRecordExpr | :? IAnonRecdExpr - | :? IArrayOrListExpr | :? IArrayOrListOfSeqExpr - | :? IObjExpr | :? IComputationLikeExpr - | :? IAddressOfExpr -> false + | :? IRecordLikeExpr | :? IArrayOrListExpr | :? IComputationExpr + | :? IObjExpr | :? IAddressOfExpr -> false | :? IBinaryAppExpr as binaryAppExpr when isNotNull (AppExprNavigator.GetByArgument(context)) -> @@ -140,7 +138,7 @@ let rec needsParens (expr: ISynExpr) = precedence binaryApp.LeftArgument < precedence binaryApp -let addParens (expr: ISynExpr) = +let addParens (expr: IFSharpExpression) = let exprCopy = expr.Copy() let factory = expr.CreateElementFactory() @@ -152,6 +150,6 @@ let addParens (expr: ISynExpr) = expr -let addParensIfNeeded (expr: ISynExpr) = +let addParensIfNeeded (expr: IFSharpExpression) = if not (needsParens expr) then expr else addParens expr diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/FSharpResolveUtil.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/FSharpResolveUtil.fs new file mode 100644 index 0000000000..721846bc50 --- /dev/null +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/FSharpResolveUtil.fs @@ -0,0 +1,34 @@ +module JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Util.FSharpResolveUtil + +open JetBrains.ReSharper.Plugins.FSharp.Psi.Resolve +open JetBrains.ReSharper.Plugins.FSharp.Psi.Util +open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl +open JetBrains.ReSharper.Plugins.FSharp.Util +open JetBrains.ReSharper.Psi +open JetBrains.ReSharper.Psi.Impl.Reflection2 + +let private resolvesTo (declaredElement: IDeclaredElement) (reference: FSharpSymbolReference) qualified opName = + match reference.ResolveWithFcs(opName, qualified) with + | None -> false + | Some symbolUse -> + + let referenceOwner = reference.GetElement() + let unqualifiedElement = symbolUse.Symbol.GetDeclaredElement(referenceOwner.GetPsiModule(), referenceOwner) + if declaredElement.Equals(unqualifiedElement) then true else + + // Workaround for case where unqualified resolve may return module with implicit suffix instead of type. + let compiledTypeElement = unqualifiedElement.As() + if isNull compiledTypeElement then false else + + let shortName = reference.GetName() + if not (unqualifiedElement.ShortName.HasModuleSuffix() && not (shortName.HasModuleSuffix())) then false else + if not (isCompiledModule compiledTypeElement) then false else + + let typeElement = FSharpImplUtil.TryGetAssociatedType(compiledTypeElement, shortName) + declaredElement.Equals(typeElement) + +let resolvesToUnqualified (declaredElement: IDeclaredElement) (reference: FSharpSymbolReference) opName = + resolvesTo declaredElement reference false opName + +let resolvesToQualified (declaredElement: IDeclaredElement) (reference: FSharpSymbolReference) opName = + resolvesTo declaredElement reference true opName diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/IFSharpElementFactory.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/IFSharpElementFactory.fs deleted file mode 100644 index 830b1fde76..0000000000 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/IFSharpElementFactory.fs +++ /dev/null @@ -1,46 +0,0 @@ -namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Util - -open JetBrains.DocumentModel -open JetBrains.ReSharper.Plugins.FSharp.Psi.Parsing -open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -open JetBrains.ReSharper.Psi.Modules - -type IFSharpElementFactory = - abstract CreateOpenStatement: ns: string -> IOpenStatement - abstract CreateWildPat: unit -> IWildPat - - abstract CreateParenExpr: unit -> IParenExpr - abstract CreateParenExpr: ISynExpr -> IParenExpr - - abstract CreateConstExpr: text: string -> IConstExpr - - abstract CreateAppExpr: addSpace: bool -> IPrefixAppExpr - abstract CreateAppExpr: funcName: string * arg: ISynExpr -> IPrefixAppExpr - abstract CreateAppExpr: funExpr: ISynExpr * argExpr: ISynExpr * addSpace: bool -> IPrefixAppExpr - abstract CreateBinaryAppExpr: string * left: ISynExpr * right: ISynExpr -> ISynExpr - abstract CreateSetExpr: left: ISynExpr * right: ISynExpr -> ISynExpr - - abstract CreateExpr: string -> ISynExpr - abstract CreateReferenceExpr: string -> ISynExpr - - abstract CreateLetBindingExpr: bindingName: string -> ILetOrUseExpr - abstract CreateLetModuleDecl: bindingName: string -> ILetModuleDecl - - abstract CreateIgnoreApp: ISynExpr * newLine: bool -> IBinaryAppExpr - abstract CreateRecordExprBinding: fieldName: string * addSemicolon: bool -> IRecordExprBinding - - abstract CreateMatchExpr: ISynExpr -> IMatchExpr - abstract CreateMatchClause: unit -> IMatchClause - - abstract CreateForEachExpr: ISynExpr -> IForEachExpr - - abstract AsReferenceExpr: typeReference: ITypeReferenceName -> IReferenceExpr - - abstract CreateEmptyAttributeList: unit -> IAttributeList - abstract CreateAttribute: attrName: string -> IAttribute - - -[] -type IFSharpLanguageService = - abstract CreateParser: IDocument -> IFSharpParser - abstract CreateElementFactory: IPsiModule -> IFSharpElementFactory diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/OpensUtil.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/OpensUtil.fs index 28cf24cb8c..ec7f8c3747 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/OpensUtil.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/OpensUtil.fs @@ -1,12 +1,14 @@ [] module JetBrains.ReSharper.Plugins.FSharp.Psi.Util.OpensUtil +open System.Collections.Generic open JetBrains.Application.Settings open JetBrains.DocumentModel open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree +open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Plugins.FSharp.Settings open JetBrains.ReSharper.Plugins.FSharp.Util open JetBrains.ReSharper.Psi @@ -140,3 +142,47 @@ let addOpen (offset: DocumentOffset) (fsFile: IFSharpFile) (settings: IContextBo | _ -> failwithf "Unexpected module: %O" moduleDecl insertAfterAnchor anchor indent + +let isInOpen (referenceName: IReferenceName) = + match skipIntermediateParentsOfSameType referenceName with + | null -> false + | node -> node.Parent :? IOpenStatement + +type OpenedModulesProvider(fsFile: IFSharpFile) = + let map = HashSet() + + let psiModule = fsFile.GetPsiModule() + let symbolScope = getModuleOnlySymbolScope psiModule + +// let getQualifiedName (element: IClrDeclaredElement) = +// match toQualifiedList element with +// | [] -> "global" +// | names -> names |> List.map (fun el -> el.GetSourceName()) |> String.concat "." + + let import (element: IClrDeclaredElement) = + map.Add(element.GetSourceName()) |> ignore + for autoImportedModule in getNestedAutoImportedModules element symbolScope do + map.Add(autoImportedModule.GetSourceName()) |> ignore + + do + import symbolScope.GlobalNamespace + + for moduleDecl in fsFile.ModuleDeclarationsEnumerable do + let topLevelModuleDecl = moduleDecl.As() + if isNotNull topLevelModuleDecl then + match topLevelModuleDecl.DeclaredElement with + | :? INamespace as ns -> import ns + | :? ITypeElement as ty -> import (ty.GetContainingNamespace()) + | _ -> () + + match fsFile.GetParseAndCheckResults(true, "OpenedModulesProvider") with + | None -> () + | Some results -> + + for fcsOpenDecl in results.CheckResults.OpenDeclarations do + for fcsEntity in fcsOpenDecl.Modules do + let declaredElement = fcsEntity.GetDeclaredElement(psiModule).As() + if isNotNull declaredElement then + import declaredElement + + member x.GetOpenedModuleNames = map diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/PsiUtil.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/PsiUtil.fs index 10cb8cbc99..70c70ebe56 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/PsiUtil.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/PsiUtil.fs @@ -1,5 +1,5 @@ [] -module JetBrains.ReSharper.Plugins.FSharp.Psi.Util.PsiUtil +module JetBrains.ReSharper.Plugins.FSharp.Psi.PsiUtil open FSharp.Compiler.Range open JetBrains.Application.Settings @@ -60,15 +60,6 @@ type IFile with x.GetNode<'T>(documentRange.StartOffset) type IFSharpTreeNode with - member x.FSharpLanguageService = - x.Language.LanguageService().As() - - member x.CreateElementFactory() = - x.FSharpLanguageService.CreateElementFactory(x.GetPsiModule()) - - member x.CheckerService = - x.FSharpFile.CheckerService - member x.GetLineEnding() = let fsFile = x.FSharpFile fsFile.DetectLineEnding(fsFile.GetPsiServices()).GetPresentation() @@ -131,9 +122,10 @@ let (|TokenType|_|) tokenType (treeNode: ITreeNode) = let (|Whitespace|_|) (treeNode: ITreeNode) = if getTokenType treeNode == FSharpTokenType.WHITESPACE then Some treeNode else None -let inline (|IgnoreParenPat|) (pat: ISynPat) = pat.IgnoreParentParens() +let inline (|IgnoreParenPat|) (fsPattern: IFSharpPattern) = + fsPattern.IgnoreParentParens() -let inline (|IgnoreInnerParenExpr|) (expr: ISynExpr) = +let inline (|IgnoreInnerParenExpr|) (expr: IFSharpExpression) = expr.IgnoreInnerParens() let isInlineSpaceOrComment (node: ITreeNode) = @@ -328,8 +320,8 @@ let rec skipIntermediateParentsOfSameType<'T when 'T :> ITreeNode> (node: 'T) = | :? 'T as pat -> skipIntermediateParentsOfSameType pat | _ -> node -let rec skipIntermediatePatParents (pat: ISynPat) = - skipIntermediateParentsOfSameType pat +let rec skipIntermediatePatParents (fsPattern: IFSharpPattern) = + skipIntermediateParentsOfSameType fsPattern let inline isValid (node: ^T) = @@ -338,7 +330,7 @@ let inline isValid (node: ^T) = [)>] type FSharpExpressionSelectionProvider() = - inherit ExpressionSelectionProviderBase() + inherit ExpressionSelectionProviderBase() override x.IsTokenSkipped(token) = // todo: also ;; ? @@ -357,7 +349,7 @@ let shouldEraseSemicolon (node: ITreeNode) = not (settingsStore.GetValue(fun (key: FSharpFormatSettingsKey) -> key.SemicolonAtEndOfLine)) -let shiftExpr shift (expr: ISynExpr) = +let shiftExpr shift (expr: IFSharpExpression) = if shift = 0 then () else for child in List.ofSeq (expr.Tokens()) do @@ -382,13 +374,13 @@ let shiftExpr shift (expr: ISynExpr) = ModificationUtil.AddChildAfter(child, Whitespace(shift)) |> ignore -let rec tryFindRootPrefixAppWhereExpressionIsFunc (expr: ISynExpr) = +let rec tryFindRootPrefixAppWhereExpressionIsFunc (expr: IFSharpExpression) = let prefixApp = PrefixAppExprNavigator.GetByFunctionExpression(expr.IgnoreParentParens()) if isNotNull prefixApp && isNotNull prefixApp.ArgumentExpression then tryFindRootPrefixAppWhereExpressionIsFunc(prefixApp) else expr -let rec getAllExpressionArgs (expr: ISynExpr) = +let rec getAllExpressionArgs (expr: IFSharpExpression) = let mutable currentExpr = expr seq { while isNotNull currentExpr do diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/CodeFormatter/FSharpCodeFormatter.cs b/ReSharper.FSharp/src/FSharp.Psi/src/CodeFormatter/FSharpCodeFormatter.cs index 07a7231e4a..e2a065010b 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/CodeFormatter/FSharpCodeFormatter.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/CodeFormatter/FSharpCodeFormatter.cs @@ -73,7 +73,7 @@ public override ITreeRange Format(ITreeNode firstElement, ITreeNode lastElement, if (!firstElement.FSharpFormatterEnabled()) return new TreeRange(firstElement, lastElement); - var formatterSettings = GetFormattingSettings(task.FirstElement, parameters); + var formatterSettings = GetFormattingSettings(task.FirstElement, parameters, myFormatterInfoProvider); DoDeclarativeFormat(formatterSettings, myFormatterInfoProvider, null, new[] {task}, parameters, null, null, null, false); diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/CodeFormatter/FSharpCodeFormatterInfoProvider.cs b/ReSharper.FSharp/src/FSharp.Psi/src/CodeFormatter/FSharpCodeFormatterInfoProvider.cs index 9de08498cf..6ae0c3b30a 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/CodeFormatter/FSharpCodeFormatterInfoProvider.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/CodeFormatter/FSharpCodeFormatterInfoProvider.cs @@ -1,9 +1,11 @@ using System.Linq; using JetBrains.Application.Settings; +using JetBrains.Application.Settings.Calculated.Interface; +using JetBrains.Application.Threading; +using JetBrains.Lifetimes; using JetBrains.ProjectModel; using JetBrains.ReSharper.Plugins.FSharp.Psi; using JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree; -using JetBrains.ReSharper.Plugins.FSharp.Psi.Parsing; using JetBrains.ReSharper.Plugins.FSharp.Psi.Tree; using JetBrains.ReSharper.Psi; using JetBrains.ReSharper.Psi.ExtensionsAPI.Tree; @@ -16,8 +18,16 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Services.Formatter public class FSharpFormatterInfoProvider : FormatterInfoProviderWithFluentApi { - public FSharpFormatterInfoProvider(ISettingsSchema settingsSchema) : base(settingsSchema) + public FSharpFormatterInfoProvider(ISettingsSchema settingsSchema, + ICalculatedSettingsSchema calculatedSettingsSchema, IThreading threading, Lifetime lifetime) + : base(settingsSchema, calculatedSettingsSchema, threading, lifetime) { + } + + protected override void Initialize() + { + base.Initialize(); + var bindingAndModuleDeclIndentingRulesParameters = new[] { ("NestedModuleDeclaration", ElementType.NESTED_MODULE_DECLARATION, NestedModuleDeclaration.MODULE_MEMBER), @@ -29,7 +39,7 @@ public FSharpFormatterInfoProvider(ISettingsSchema settingsSchema) : base(settin ("NamedModuleDeclName", ElementType.NAMED_MODULE_DECLARATION, NamedModuleDeclaration.IDENTIFIER), }; - var synExprIndentingRulesParameters = new[] + var fsExprIndentingRulesParameters = new[] { ("ForExpr", ElementType.FOR_EXPR, ForExpr.DO_EXPR), ("ForEachExpr", ElementType.FOR_EACH_EXPR, ForEachExpr.DO_EXPR), @@ -45,29 +55,45 @@ public FSharpFormatterInfoProvider(ISettingsSchema settingsSchema) : base(settin ("IfThenExpr", ElementType.IF_THEN_ELSE_EXPR, IfThenElseExpr.THEN_EXPR), ("ElifThenExpr", ElementType.ELIF_EXPR, ElifExpr.THEN_EXPR), ("LambdaExprBody", ElementType.LAMBDA_EXPR, LambdaExpr.EXPR), + ("MatchExpr_Expr", ElementType.MATCH_EXPR, MatchExpr.EXPR), + ("MatchExpr_With", ElementType.MATCH_EXPR, MatchExpr.WITH), }; var typeDeclarationIndentingRulesParameters = new[] { - ("EnumDeclaration", ElementType.ENUM_DECLARATION, EnumDeclaration.ENUM_MEMBER), + ("EnumDeclaration", ElementType.ENUM_DECLARATION, EnumDeclaration.ENUM_REPR), ("UnionDeclarationCases", ElementType.UNION_DECLARATION, UnionDeclaration.UNION_REPR), ("TypeAbbreviation", ElementType.TYPE_ABBREVIATION_DECLARATION, TypeAbbreviationDeclaration.TYPE_OR_UNION_CASE), ("ModuleAbbreviation", ElementType.MODULE_ABBREVIATION, ModuleAbbreviation.TYPE_REFERENCE), }; + var alignmentRulesParameters = new[] + { + ("MatchClauses", ElementType.MATCH_EXPR), + ("UnionCases", ElementType.UNION_CASE_LIST), + ("UnionRepresentation", ElementType.UNION_REPRESENTATION), + ("EnumCases", ElementType.ENUM_REPRESENTATION), + ("SequentialExpr", ElementType.SEQUENTIAL_EXPR), + ("BinaryExpr", ElementType.BINARY_APP_EXPR), + }; + lock (this) { bindingAndModuleDeclIndentingRulesParameters - .Union(synExprIndentingRulesParameters) + .Union(fsExprIndentingRulesParameters) .Union(typeDeclarationIndentingRulesParameters) .ToList() .ForEach(DescribeSimpleIndentingRule); + alignmentRulesParameters + .ToList() + .ForEach(DescribeSimpleAlignmentRule); + Describe() .Name("TryWith_WithClauseIndent") .Where( Parent().HasType(ElementType.TRY_WITH_EXPR), - Node().HasRole(TryWithExpr.CLAUSE)) + Node().HasRole(TryWithExpr.MATCH_CLAUSE)) .Switch( settings => settings.IndentOnTryWith, When(true).Return(IndentType.External), @@ -81,7 +107,7 @@ public FSharpFormatterInfoProvider(ISettingsSchema settingsSchema) : base(settin Node() .HasRole(PrefixAppExpr.ARG_EXPR) .Satisfies((node, context) => - !(node is IComputationLikeExpr) || + !(node is IComputationExpr) || !node.ContainsLineBreak(context.CodeFormatter))) .Return(IndentType.External) .Build(); @@ -126,6 +152,20 @@ public FSharpFormatterInfoProvider(ISettingsSchema settingsSchema) : base(settin Node().HasRole(Do.CHAMELEON_EXPR)) .Return(IndentType.External) .Build(); + + Describe() + .Name("UnionRepresentationCasesIndent") + .Where( + Parent() + .HasType(ElementType.UNION_REPRESENTATION) + .Satisfies((node, context) => + { + var modifier = ((IUnionRepresentation) node).AccessModifier; + return modifier != null && modifier.HasNewLineAfter(context.CodeFormatter); + }), + Node().HasRole(UnionRepresentation.UNION_CASE_LIST)) + .Return(IndentType.External) + .Build(); } } @@ -142,6 +182,15 @@ private void DescribeSimpleIndentingRule((string name, CompositeNodeType parentT .Build(); } + private void DescribeSimpleAlignmentRule((string name, CompositeNodeType nodeType) parameters) + { + Describe() + .Name(parameters.name + "Alignment") + .Where(Node().HasType(parameters.nodeType)) + .Return(IndentType.AlignThrough) + .Build(); + } + private static bool IndentElseExpr(ITreeNode elseExpr, CodeFormattingContext context) => elseExpr.GetPreviousMeaningfulSibling().IsFirstOnLine(context.CodeFormatter) && !(elseExpr is IElifExpr); diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/FSharp.psi b/ReSharper.FSharp/src/FSharp.Psi/src/FSharp.psi index 8a9f116bd5..e761637ca0 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/FSharp.psi +++ b/ReSharper.FSharp/src/FSharp.Psi/src/FSharp.psi @@ -98,7 +98,7 @@ namedNamespaceDeclaration options { stubBase="FSharpDeclarationBase"; }: REC? ( referenceName - DOT + DOT )? fSharpIdentifier moduleMember*; @@ -118,7 +118,7 @@ namedModuleDeclaration options { stubBase="FSharpTypeElementDeclarationBase"; } accessModifier{ACCESS_MODIFIER, AccessModifier}? ( referenceName - DOT + DOT )? fSharpIdentifier moduleMember*; @@ -149,20 +149,10 @@ letModuleDecl options { stubBase="DummyDeclaration"; } extras { REC? LIST binding SEP AND; - -interface let: - letBindings | - letOrUseBangExpr; - interface letBindings: letModuleDecl | letOrUseExpr; -interface letLikeExpr: - letOrUseExpr | - letOrUseBangExpr; - - interface binding: topBinding | localBinding; @@ -174,7 +164,7 @@ topBinding extras { attributeList* INLINE? MUTABLE? - synPat + fSharpPattern returnTypeInfo? EQUALS chameleonExpression; @@ -185,19 +175,19 @@ localBinding extras { attributeList* INLINE? MUTABLE? - synPat + fSharpPattern returnTypeInfo? EQUALS - synExpr; + fSharpExpression; returnTypeInfo extras { get { methodName="Attributes" path= }; }: COLON attributeList* - synType; + typeUsage; -interface synPat: +interface fSharpPattern: namedPat | typedPat | attribPat | @@ -248,21 +238,21 @@ localParametersOwnerPat options { stubBase="LocalPatternDeclarationBase"; } extr get { methodName="Identifier" path= }; }: expressionReferenceName - synPat*; + fSharpPattern*; topParametersOwnerPat options { stubBase="TopPatternDeclarationBase"; } extras { get { methodName="Identifier" path= }; }: expressionReferenceName - synPat*; + fSharpPattern*; localAsPat options { stubBase="LocalPatternDeclarationBase"; }: - synPat + fSharpPattern AS fSharpIdentifier; topAsPat options { stubBase="TopPatternDeclarationBase"; }: - synPat + fSharpPattern AS fSharpIdentifier; @@ -272,42 +262,42 @@ interface arrayOrListPat: listPat; typedPat options { stubBase="SynPatternBase"; }: - synPat + fSharpPattern COLON - synType; + typeUsage; attribPat options { stubBase="SynPatternBase"; } extras { get { methodName="Attributes" path= }; }: attributeList* - synPat; + fSharpPattern; orPat options { stubBase="SynPatternBase"; }: - synPat + fSharpPattern BAR - synPat; + fSharpPattern; andsPat options { stubBase="SynPatternBase"; }: - synPat + fSharpPattern AMP - synPat; + fSharpPattern; arrayPat options { stubBase="SynPatternBase"; }: LBRACK_BAR - synPat* + fSharpPattern* LBRACK_BAR; listPat options { stubBase="SynPatternBase"; }: LBRACK - synPat* + fSharpPattern* RBRACK; tuplePat options { stubBase="SynPatternBase"; }: - LIST synPat SEP COMMA; + LIST fSharpPattern SEP COMMA; parenPat options { stubBase="SynPatternBase"; }: LPAREN - synPat + fSharpPattern RPAREN; recordPat options { stubBase="SynPatternBase"; }: @@ -317,21 +307,21 @@ recordPat options { stubBase="SynPatternBase"; }: fieldPat options { stubBase="SynPatternBase"; }: expressionReferenceName - EQUALS - synPat; + EQUALS + fSharpPattern; optionalValPat options { stubBase="SynPatternBase"; }: QMARK - synPat; + fSharpPattern; isInstPat options { stubBase="SynPatternBase"; }: COLON_QMARK - synType; + typeUsage; consPat options { stubBase="SynPatternBase"; }: - synPat + fSharpPattern COLON_COLON - synPat; + fSharpPattern; wildPat options { stubBase="SynPatternBase"; }: UNDERSCORE; @@ -348,25 +338,24 @@ otherPat options { stubBase="SynPatternBase"; }: fakeSeparator; -interface synExpr: +interface fSharpExpression: parenExpr | quoteExpr | constExpr | typedLikeExpr | tupleExpr | - anonRecdExpr | + recordLikeExpr | arrayOrListExpr | - recordExpr | objExpr | forLikeExpr | - arrayOrListOfSeqExpr | - computationLikeExpr | + rangeSequenceExpr | + computationExpr | lambdaExpr | matchLikeExpr | doLikeExpr | appLikeExpr | binaryAppExpr | - letLikeExpr | + letOrUseExpr | tryLikeExpr | sequentialExpr | conditionOwnerExpr | @@ -420,9 +409,9 @@ interface conditionOwnerExpr: whileExpr; setExpr options { stubBase="UnitExpressionBase"; }: - synExpr + fSharpExpression LARROW - synExpr; + fSharpExpression; interface indexerExpr: itemIndexerExpr | @@ -431,8 +420,8 @@ interface indexerExpr: itemIndexerExpr options { stubBase="FSharpExpressionBase"; } extras { get { methodName="Args" path= }; }: - synExpr - DOT + fSharpExpression + DOT indexerArgList; namedIndexerExpr options { stubBase="FSharpExpressionBase"; } extras { @@ -440,7 +429,7 @@ namedIndexerExpr options { stubBase="FSharpExpressionBase"; } extras { get { methodName="Args" path= }; }: // todo: maybe: refExpr? - synExpr + fSharpExpression indexerArg; indexerArgList: @@ -455,12 +444,12 @@ interface indexerArg: indexerArgExpr extras { get { methodName="Expressions" path= }; }: - synExpr; + fSharpExpression; indexerArgRange: - synExpr + fSharpExpression DOT_DOT - synExpr; + fSharpExpression; interface castExpr: upcastExpr | @@ -468,18 +457,18 @@ interface castExpr: parenExpr options { stubBase="FSharpExpressionBase"; }: LPAREN - synExpr? + fSharpExpression? RPAREN; quoteExpr options { stubBase="FSharpExpressionBase"; }: ( LQUOTE_TYPED - synExpr? + fSharpExpression? RQUOTE_TYPED? ) | ( LQUOTE_UNTYPED - synExpr? + fSharpExpression? RQUOTE_UNTYPED? ); @@ -518,43 +507,40 @@ literalExpr options { stubBase="FSharpExpressionBase"; }: BYTECHAR; typedExpr options { stubBase="FSharpExpressionBase"; }: - synExpr + fSharpExpression COLON - synType; + typeUsage; tupleExpr options { stubBase="FSharpExpressionBase"; }: ( LPAREN STRUCT )? - LIST synExpr SEP COMMA; + LIST fSharpExpression SEP COMMA; -anonRecdExpr options { stubBase="FSharpExpressionBase"; }: +interface recordLikeExpr: + anonRecordExpr | + recordExpr; + +anonRecordExpr options { stubBase="FSharpExpressionBase"; }: STRUCT? LBRACE_BAR ( - synExpr + fSharpExpression WITH )? recordExprBinding* BAR_RBRACE; arrayOrListExpr options { stubBase="FSharpExpressionBase"; }: - ( - LBRACK - synExpr* - RBRACK - ) | - ( - LBRACK_BAR - synExpr* - BAR_RBRACK - ); + (LBRACK | LBRACK_BAR) + fSharpExpression + (RBRACK | BAR_RBRACK); recordExpr options { stubBase="FSharpExpressionBase"; }: LBRACE ( - synExpr + fSharpExpression WITH )? recordExprBinding* @@ -562,51 +548,42 @@ recordExpr options { stubBase="FSharpExpressionBase"; }: recordExprBinding: expressionReferenceName - EQUALS - synExpr + EQUALS + fSharpExpression SEMICOLON?; newExpr options { stubBase="FSharpExpressionBase"; }: NEW typeReferenceName - synExpr; + fSharpExpression; forExpr options { stubBase="UnitExpressionBase"; }: FOR localDeclaration - EQUALS - synExpr + EQUALS + fSharpExpression TO - synExpr + fSharpExpression DO - synExpr; + fSharpExpression; forEachExpr options { stubBase="UnitExpressionBase"; }: FOR - synPat + fSharpPattern IN - forEachInClause{IN_CLAUSE, InClause} - DO - synExpr; + fSharpExpression + forEachBodySeparator{BODY_SEPARATOR, BodySeparator} + fSharpExpression; -private forEachInClause{ROLE, Getter}: - synExpr<@ROLE, @Getter> | - rangeSequence<@ROLE, @Getter>; - -arrayOrListOfSeqExpr options { stubBase="FSharpExpressionBase"; }: - (LBRACK - synExpr - RBRACK) | - - (LBRACK_BAR - synExpr - BAR_RBRACK); +private forEachBodySeparator{ROLE, Getter}: + DO<@ROLE, @Getter> | + RARROW<@ROLE, @Getter>; whileExpr options { stubBase="UnitExpressionBase"; }: WHILE - synExpr + fSharpExpression DO - synExpr; + fSharpExpression; objExpr options { stubBase="FSharpTypeElementDeclarationBase"; } extras { get { methodName="InterfaceMembers" path= }; @@ -614,29 +591,26 @@ objExpr options { stubBase="FSharpTypeElementDeclarationBase"; } extras { LBRACE NEW typeReferenceName - synExpr + fSharpExpression WITH memberDeclaration* interfaceImplementation* RBRACE; -interface computationLikeExpr: - computationExpr | - rangeSequenceExpr; - computationExpr options { stubBase="FSharpExpressionBase"; }: LBRACE - synExpr + fSharpExpression RBRACE; lambdaExpr options { stubBase="FSharpExpressionBase"; }: FUN - synPat* + fSharpPattern* RARROW - synExpr; + fSharpExpression; interface matchClauseListOwner: - matchLikeExpr | + matchExpr | + matchLambdaExpr | tryWithExpr; interface matchLikeExpr: @@ -650,35 +624,35 @@ matchLambdaExpr options { stubBase="FSharpExpressionBase"; }: // todo: separate nodes for bang exprs? matchExpr options { stubBase="FSharpExpressionBase"; }: MATCH - synExpr + fSharpExpression WITH matchClause*; doExpr options { stubBase="UnitExpressionBase"; }: DO - synExpr; + fSharpExpression; assertExpr options { stubBase="FSharpExpressionBase"; }: ASSERT - synExpr; + fSharpExpression; prefixAppExpr options { stubBase="FSharpExpressionBase"; }: - synExpr - synExpr; + fSharpExpression + fSharpExpression; binaryAppExpr options { stubBase="FSharpExpressionBase"; } extras { get { methodName="FunctionExpression" path= }; }: - synExpr + fSharpExpression referenceExpr - synExpr; + fSharpExpression; letOrUseExpr options { stubBase="FSharpExpressionBase"; }: letOrUse{LET, LetOrUseToken} REC? LIST binding SEP AND IN? - synExpr; + fSharpExpression; interface tryLikeExpr: tryWithExpr | @@ -686,41 +660,41 @@ interface tryLikeExpr: tryWithExpr options { stubBase="FSharpExpressionBase"; }: TRY - synExpr + fSharpExpression WITH - matchClause*; + matchClause*; tryFinallyExpr options { stubBase="FSharpExpressionBase"; }: TRY - synExpr + fSharpExpression FINALLY - synExpr; + fSharpExpression; lazyExpr options { stubBase="FSharpExpressionBase"; }: LAZY - synExpr; + fSharpExpression; sequentialExpr options { stubBase="FSharpExpressionBase"; }: - LIST synExpr SEP SEMICOLON; + LIST fSharpExpression SEP SEMICOLON; ifThenElseExpr options { stubBase="FSharpExpressionBase"; }: IF - synExpr + fSharpExpression THEN - synExpr + fSharpExpression elseClause{ELSE_CLAUSE, ElseExpr}?; elifExpr options { stubBase="FSharpExpressionBase"; }: ELIF - synExpr + fSharpExpression THEN - synExpr + fSharpExpression elseClause{ELSE_CLAUSE, ElseExpr}?; private elseClause{ROLE, Getter}: ( ELSE - synExpr<@ROLE, @Getter>) + fSharpExpression<@ROLE, @Getter>) | ( elifExpr<@ROLE, @Getter> @@ -730,37 +704,37 @@ referenceExpr options { stubBase="FSharpExpressionBase"; } extras { get { methodName="TypeArguments" path= }; }: ( - synExpr - DOT + fSharpExpression + DOT )? fSharpIdentifier prefixAppTypeArgumentList?; matchClause: BAR? - synPat - whenExpr? + fSharpPattern + whenExprClause? RARROW - synExpr; + fSharpExpression; -whenExpr: +whenExprClause: WHEN - synExpr; + fSharpExpression; typeTestExpr options { stubBase="FSharpExpressionBase"; }: - synExpr + fSharpExpression COLON_QMARK - synType; + typeUsage; upcastExpr options { stubBase="FSharpExpressionBase"; }: - synExpr + fSharpExpression COLON_GREATER - synType; + typeUsage; downcastExpr options { stubBase="FSharpExpressionBase"; }: - synExpr + fSharpExpression COLON_QMARK_GREATER - synType; + typeUsage; interface inferredCastExpr: inferredUpcastExpr | @@ -768,11 +742,11 @@ interface inferredCastExpr: inferredUpcastExpr options { stubBase="FSharpExpressionBase"; }: UPCAST - synExpr; + fSharpExpression; inferredDowncastExpr options { stubBase="FSharpExpressionBase"; }: DOWNCAST - synExpr; + fSharpExpression; // todo: maybe replace with SynExpr.Const in FCS? nullExpr options { stubBase="FSharpExpressionBase"; }: @@ -780,7 +754,7 @@ nullExpr options { stubBase="FSharpExpressionBase"; }: addressOfExpr options { stubBase="FSharpExpressionBase"; }: (AMP | AMP_AMP) - synExpr; + fSharpExpression; traitCallExpr options { stubBase="FSharpExpressionBase"; }: fakeSeparator; @@ -792,43 +766,35 @@ implicitZeroExpr options { stubBase="FSharpExpressionBase"; }: fakeSeparator; yieldOrReturnExpr options { stubBase="FSharpExpressionBase"; }: - (YIELD | YIELD_BANG | RETURN | RETURN_BANG) - synExpr; - -letOrUseBangExpr options { stubBase="FSharpExpressionBase"; } extras { - get { methodName="Bindings" path= }; -}: - letOrUseBang{LET, LetOrUseToken} - LIST binding SEP AND_BANG - IN? - synExpr; + ( + YIELD | + YIELD_BANG | + RETURN | + RETURN_BANG + ) + fSharpExpression; libraryOnlyExpr options { stubBase="FSharpExpressionBase"; }: fakeSeparator; fromErrorExpr options { stubBase="FSharpExpressionBase"; }: - fakeSeparator; + fSharpExpression; fixedExpr options { stubBase="FSharpExpressionBase"; }: FIXED - synExpr; + fSharpExpression; -rangeSequence: - synExpr +rangeSequenceExpr options { stubBase="FSharpExpressionBase"; }: + fSharpExpression ( DOT_DOT - synExpr + fSharpExpression )? DOT_DOT - synExpr; - -rangeSequenceExpr options { stubBase="FSharpExpressionBase"; }: - LBRACE - rangeSequence - RBRACE; + fSharpExpression; chameleonExpression: - synExpr; + fSharpExpression; typeDeclarationGroup extras { @@ -885,7 +851,7 @@ typeExtensionDeclaration options { stubBase="FSharpTypeElementDeclarationBase"; accessModifier{ACCESS_MODIFIER, AccessModifier}? ( referenceName - DOT + DOT )? fSharpIdentifier typeParameterOfTypeList? @@ -896,14 +862,18 @@ typeExtensionDeclaration options { stubBase="FSharpTypeElementDeclarationBase"; enumDeclaration options { stubBase="FSharpTypeElementDeclarationBase"; } extras { get { methodName="TypeParameters" path= }; get { methodName="Attributes" path= }; + get {methodName="EnumMembers" path= }; }: attributeList* accessModifier{ACCESS_MODIFIER, AccessModifier}? fSharpIdentifier typeParameterOfTypeList? - enumMemberDeclaration* + enumRepresentation* fSharpTypeMemberDeclaration*; +enumRepresentation: + enumMemberDeclaration*; + enumMemberDeclaration options { stubBase="FSharpProperTypeMemberDeclarationBase"; } extras { get { methodName="Attributes" path= }; }: @@ -939,7 +909,7 @@ recordFieldDeclaration options { stubBase="FSharpProperTypeMemberDeclarationBase MUTABLE? IDENTIFIER COLON - synType; + typeUsage; @@ -947,11 +917,14 @@ recordFieldDeclaration options { stubBase="FSharpProperTypeMemberDeclarationBase unionRepresentation: accessModifier{ACCESS_MODIFIER, AccessModifier}? + unionCaseList; + +unionCaseList: unionCaseDeclaration*; unionDeclaration options { stubBase="FSharpTypeElementDeclarationBase"; } extras { get { methodName="TypeParameters" path= }; - get { methodName="UnionCases" path= }; + get { methodName="UnionCases" path= }; get { methodName="Attributes" path= }; }: attributeList* @@ -992,11 +965,11 @@ interface caseFieldDeclaration: unionCaseFieldDeclaration options { stubBase="UnionCaseFieldDeclarationBase"; }: IDENTIFIER? - synType; + typeUsage; exceptionFieldDeclaration options { stubBase="UnionCaseFieldDeclarationBase"; }: IDENTIFIER? - synType; + typeUsage; // Other members @@ -1021,12 +994,12 @@ typeAbbreviationDeclaration options { stubBase="FSharpTypeElementDeclarationBase accessModifier{ACCESS_MODIFIER, AccessModifier}? fSharpIdentifier typeParameterOfTypeList? - EQUALS + EQUALS abbreviatedTypeOrUnionCaseDeclaration fSharpTypeMemberDeclaration*; abbreviatedTypeOrUnionCaseDeclaration options { stubBase="FSharpProperTypeMemberDeclarationBase"; }: - synType; + typeUsage; moduleAbbreviation options { stubBase="FSharpTypeElementDeclarationBase"; } extras { get { methodName="TypeParameters" path= }; @@ -1036,7 +1009,7 @@ moduleAbbreviation options { stubBase="FSharpTypeElementDeclarationBase"; } extr MODULE accessModifier{ACCESS_MODIFIER, AccessModifier}? fSharpIdentifier - EQUALS + EQUALS typeReferenceName // todo: remove rules below typeParameterOfTypeList? @@ -1131,7 +1104,7 @@ delegateDeclaration options { stubBase="FSharpTypeElementDeclarationBase"; } ext accessModifier{ACCESS_MODIFIER, AccessModifier}? fSharpIdentifier typeParameterOfTypeList? - EQUALS + EQUALS delegateRepresentation // todo: remove members fSharpTypeMemberDeclaration*; @@ -1139,7 +1112,7 @@ delegateDeclaration options { stubBase="FSharpTypeElementDeclarationBase"; } ext delegateRepresentation: DELEGATE OF - synType; + typeUsage; interface fSharpTypeMemberDeclaration: constructorDeclaration | @@ -1147,7 +1120,6 @@ interface fSharpTypeMemberDeclaration: interfaceImplementation | abstractSlot | memberDeclaration | - typeLetBindings | valField | autoProperty | letModuleDecl | @@ -1183,12 +1155,11 @@ interfaceImplementation: otherTypeMember: fakeSeparator; -typeLetBindings: fakeSeparator; -implicitConstructorDeclaration options { stubBase="FSharpProperTypeMemberDeclarationBase"; } extras { - get { methodName="Parameters" path= }; -}: - memberParamDeclarationGroup +implicitConstructorDeclaration options { stubBase="FSharpProperTypeMemberDeclarationBase"; }: + attributeList* + accessModifier{ACCESS_MODIFIER, AccessModifier}? + memberParamsDeclaration ctorSelfId?; interface selfId: @@ -1202,10 +1173,16 @@ ctorSelfId options { stubBase="LocalDeclarationBase"; }: memberSelfId options { stubBase="LocalDeclarationBase"; }: IDENTIFIER; -memberConstructorDeclaration options { stubBase="FSharpProperTypeMemberDeclarationBase"; }: +memberConstructorDeclaration options { stubBase="FSharpProperTypeMemberDeclarationBase"; } extras { + get { methodName="Expression" path= }; +}: + attributeList* + accessModifier{ACCESS_MODIFIER, AccessModifier}? NEW - localDeclaration* fakeSeparator - ctorSelfId?; + memberParamsDeclaration + ctorSelfId? + EQUALS + chameleonExpression; @@ -1213,8 +1190,8 @@ memberConstructorDeclaration options { stubBase="FSharpProperTypeMemberDeclarati memberDeclaration options { stubBase="FSharpProperTypeMemberDeclarationBase"; } extras { get { methodName="TypeParameters" path= }; - get { methodName="Parameters" path= }; get { methodName="Attributes" path= }; + get { methodName="Expression" path= }; }: attributeList* ( @@ -1223,15 +1200,14 @@ memberDeclaration options { stubBase="FSharpProperTypeMemberDeclarationBase"; } | memberKeyword{MEMBER_KEYWORD, MemberKeyword} ) - MEMBER accessModifier{ACCESS_MODIFIER, AccessModifier}? memberSelfId? identOrOpName{IDENTIFIER, Identifier} typeParameterOfMethodList? ( - memberParamDeclarationGroup* - EQUALS - chameleonExpression + memberParamsDeclaration + EQUALS + chameleonExpression | WITH accessorDeclaration @@ -1253,7 +1229,7 @@ abstractSlot options { stubBase="FSharpProperTypeMemberDeclarationBase"; } extra attributeList* IDENTIFIER typeParameterOfMethodList? - memberParamDeclaration*; + memberParamsDeclaration; valField options { stubBase="FSharpProperTypeMemberDeclarationBase"; } extras { get { methodName="Attributes" path= }; @@ -1267,7 +1243,7 @@ autoProperty options { stubBase="FSharpProperTypeMemberDeclarationBase"; } extr }: attributeList* IDENTIFIER - EQUALS + EQUALS chameleonExpression accessorsNamesClause?; @@ -1277,31 +1253,18 @@ accessorsNamesClause: IDENTIFIER | IDENTIFIER - COMMA + COMMA IDENTIFIER ); accessorDeclaration: IDENTIFIER - memberParamDeclaration* - EQUALS + memberParamsDeclaration + EQUALS chameleonExpression; - -memberParamDeclarationGroup: - ( - memberParamDeclarationList - | - LPAREN - memberParamDeclarationList - RPAREN - ); - -private memberParamDeclarationList: - LIST memberParamDeclaration SEP COMMA; - -memberParamDeclaration: - synPat; +memberParamsDeclaration: + fSharpPattern; // module statements @@ -1351,9 +1314,7 @@ do options { stubBase="DummyDeclaration"; } extras { private letOrUse{ROLE, Getter}: LET<@ROLE, @Getter> | - USE<@ROLE, @Getter>; - -private letOrUseBang{ROLE, Getter}: + USE<@ROLE, @Getter> | LET_BANG<@ROLE, @Getter> | USE_BANG<@ROLE, @Getter>; @@ -1383,7 +1344,8 @@ interface fSharpIdentifier: symbolicOp | ampAmp | activePatternId | - typeParameterId; + typeParameterId | + global; abstract identifier options { interfaceName="IFSharpIdentifier"; }: IDENTIFIER; @@ -1394,6 +1356,9 @@ abstract symbolicOp options { interfaceName="IFSharpIdentifier"; }: abstract ampAmp options { interfaceName="IFSharpIdentifier"; }: ampAmp; +abstract global options { interfaceName="IFSharpIdentifier"; }: + GLOBAL; + // Type parameters typeParameterOfTypeList: @@ -1469,23 +1434,23 @@ interface typeArgumentList: postfixAppTypeArgumentList: ( - synType + typeUsage | LPAREN - LIST synType SEP COMMA + LIST typeUsage SEP COMMA RPAREN ); prefixAppTypeArgumentList: LESS - LIST synType SEP COMMA + LIST typeUsage SEP COMMA GREATER; expressionReferenceName options { stubBase="ReferenceOwnerBase"; }: ( expressionReferenceName - DOT + DOT )? fSharpIdentifier prefixAppTypeArgumentList; @@ -1496,40 +1461,41 @@ typeReferenceName options { stubBase="TypeReferenceOwnerBase"; }: postfixAppTypeArgumentList ( typeReferenceName - DOT + DOT )? fSharpIdentifier | ( typeReferenceName - DOT + DOT )? fSharpIdentifier prefixAppTypeArgumentList ); -interface synType: - namedType | - tupleType | - anonRecordType | - arrayType | - funType | - anonType | - otherType; +interface typeUsage: + namedTypeUsage | + tupleTypeUsage | + anonRecordTypeUsage | + arrayTypeUsage | + functionTypeUsage | + anonTypeUsage | + parenTypeUsage | + unsupportedTypeUsage; -namedType: +namedTypeUsage: typeReferenceName; -tupleType: - synType +tupleTypeUsage: + typeUsage ( STAR - synType + typeUsage )*; -anonRecordType: +anonRecordTypeUsage: LBRACE_BAR anonRecordField* BAR_RBRACE; @@ -1537,20 +1503,25 @@ anonRecordType: anonRecordField: expressionReferenceName COLON - synType; + typeUsage; -arrayType: - synType +arrayTypeUsage: + typeUsage LBRACK RBRACK; -funType: - synType +functionTypeUsage: + typeUsage RARROW - synType; + typeUsage; -anonType: +anonTypeUsage: UNDERSCORE; -otherType: +parenTypeUsage: + LPAREN + typeUsage + RPAREN; + +unsupportedTypeUsage: fakeSeparator; diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/FSharpTreeNodeExtensions.cs b/ReSharper.FSharp/src/FSharp.Psi/src/FSharpTreeNodeExtensions.cs new file mode 100644 index 0000000000..d65bdd0048 --- /dev/null +++ b/ReSharper.FSharp/src/FSharp.Psi/src/FSharpTreeNodeExtensions.cs @@ -0,0 +1,22 @@ +using JetBrains.Annotations; +using JetBrains.ReSharper.Plugins.FSharp.Checker; +using JetBrains.ReSharper.Plugins.FSharp.Psi.Tree; +using JetBrains.ReSharper.Psi; + +namespace JetBrains.ReSharper.Plugins.FSharp.Psi +{ + public static class FSharpTreeNodeExtensions + { + [NotNull] + public static IFSharpLanguageService GetFSharpLanguageService([NotNull] this IFSharpTreeNode treeNode) => + treeNode.GetPsiServices().GetComponent().GetService(treeNode.Language); + + [NotNull] + public static IFSharpElementFactory CreateElementFactory([NotNull] this IFSharpTreeNode treeNode) => + treeNode.GetFSharpLanguageService().CreateElementFactory(treeNode.GetPsiModule()); + + [NotNull] + public static FSharpCheckerService GetFcsCheckerService([NotNull] this IFSharpTreeNode treeNode) => + treeNode.FSharpFile.CheckerService; + } +} diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/IFSharpElementFactory.cs b/ReSharper.FSharp/src/FSharp.Psi/src/IFSharpElementFactory.cs new file mode 100644 index 0000000000..53649a4239 --- /dev/null +++ b/ReSharper.FSharp/src/FSharp.Psi/src/IFSharpElementFactory.cs @@ -0,0 +1,40 @@ +using JetBrains.ReSharper.Plugins.FSharp.Psi.Tree; + +namespace JetBrains.ReSharper.Plugins.FSharp.Psi +{ + public interface IFSharpElementFactory + { + IOpenStatement CreateOpenStatement(string ns); + IWildPat CreateWildPat(); + + IParenExpr CreateParenExpr(); + IConstExpr CreateConstExpr(string text); + + IPrefixAppExpr CreateAppExpr(string funcName, IFSharpExpression arg); + IPrefixAppExpr CreateAppExpr(IFSharpExpression funExpr, IFSharpExpression argExpr, bool addSpace); + IFSharpExpression CreateBinaryAppExpr(string opName, IFSharpExpression left, IFSharpExpression right); + IFSharpExpression CreateSetExpr(IFSharpExpression left, IFSharpExpression right); + + IFSharpExpression CreateExpr(string expr); + IReferenceExpr CreateReferenceExpr(string expr); + + ILetOrUseExpr CreateLetBindingExpr(string bindingName); + ILetModuleDecl CreateLetModuleDecl(string bindingName); + + IBinaryAppExpr CreateIgnoreApp(IFSharpExpression expr, bool newLine); + IRecordExprBinding CreateRecordExprBinding(string fieldName, bool addSemicolon); + + IMatchExpr CreateMatchExpr(IFSharpExpression expr); + IMatchClause CreateMatchClause(); + + IForEachExpr CreateForEachExpr(IFSharpExpression expr); + + IReferenceExpr AsReferenceExpr(ITypeReferenceName typeReference); + + IExpressionReferenceName CreateExpressionReferenceName(string referenceName); + ITypeReferenceName CreateTypeReferenceName(string referenceName); + + IAttributeList CreateEmptyAttributeList(); + IAttribute CreateAttribute(string attrName); + } +} diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/IFSharpLanguageService.cs b/ReSharper.FSharp/src/FSharp.Psi/src/IFSharpLanguageService.cs index 2bdca72732..0737cb6b7e 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/IFSharpLanguageService.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/IFSharpLanguageService.cs @@ -1,11 +1,12 @@ -using JetBrains.ReSharper.Plugins.FSharp.Psi.Tree; -using JetBrains.ReSharper.Psi; +using JetBrains.DocumentModel; +using JetBrains.ReSharper.Plugins.FSharp.Psi.Parsing; +using JetBrains.ReSharper.Psi.Modules; namespace JetBrains.ReSharper.Plugins.FSharp.Psi { - public interface IFSharpMethodInvocationUtil + public interface IFSharpLanguageService { - IParameter GetMatchingParameter(ISynExpr synExpr); - IParameter GetNamedArg(ISynExpr synExpr); + IFSharpParser CreateParser(IDocument document); + IFSharpElementFactory CreateElementFactory(IPsiModule psiModule); } } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/IFSharpMethodInvocationUtil.cs b/ReSharper.FSharp/src/FSharp.Psi/src/IFSharpMethodInvocationUtil.cs new file mode 100644 index 0000000000..1c9b846ad1 --- /dev/null +++ b/ReSharper.FSharp/src/FSharp.Psi/src/IFSharpMethodInvocationUtil.cs @@ -0,0 +1,11 @@ +using JetBrains.ReSharper.Plugins.FSharp.Psi.Tree; +using JetBrains.ReSharper.Psi; + +namespace JetBrains.ReSharper.Plugins.FSharp.Psi +{ + public interface IFSharpMethodInvocationUtil + { + IParameter GetMatchingParameter(IFSharpExpression fsExpr); + IParameter GetNamedArg(IFSharpExpression fsExpr); + } +} diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/IModule.cs b/ReSharper.FSharp/src/FSharp.Psi/src/IFSharpModule.cs similarity index 89% rename from ReSharper.FSharp/src/FSharp.Psi/src/IModule.cs rename to ReSharper.FSharp/src/FSharp.Psi/src/IFSharpModule.cs index 1e4b54401f..166a1c9fa4 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/IModule.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/IFSharpModule.cs @@ -10,7 +10,7 @@ public enum ModuleMembersAccessKind : byte AutoOpen = 2, } - public interface IModule : IFSharpTypeElement + public interface IFSharpModule : IFSharpTypeElement { bool IsAnonymous { get; } bool IsAutoOpen { get; } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/ITypePrivateMember.cs b/ReSharper.FSharp/src/FSharp.Psi/src/ITypePrivateMember.cs new file mode 100644 index 0000000000..3c6b3dbb9a --- /dev/null +++ b/ReSharper.FSharp/src/FSharp.Psi/src/ITypePrivateMember.cs @@ -0,0 +1,8 @@ +using JetBrains.ReSharper.Psi; + +namespace JetBrains.ReSharper.Plugins.FSharp.Psi +{ + public interface ITypePrivateMember : IFSharpDeclaredElement, ITypeMember + { + } +} diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Cache2/FSharpCacheProvider.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Cache2/FSharpCacheProvider.cs index 33e50d6691..6f56043a6a 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Cache2/FSharpCacheProvider.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Cache2/FSharpCacheProvider.cs @@ -30,7 +30,7 @@ public void BuildCache(IFile file, ICacheBuilder builder) public ProjectFilePart LoadProjectFilePart(IPsiSourceFile sourceFile, ProjectFilePartsTree tree, IReader reader) => new FSharpProjectFilePart(sourceFile, reader, sourceFile.GetFSharpFileKind(), - sourceFile != null && myCheckerService.OptionsProvider.HasPairFile(sourceFile)); + sourceFile != null && myCheckerService.FcsProjectProvider.HasPairFile(sourceFile)); public Part ReadPart(byte tag, IReader reader) => (FSharpPartKind) tag switch diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Cache2/FSharpDeclarationProcessor.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Cache2/FSharpDeclarationProcessor.cs index d35aae3ee9..85e2e1c493 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Cache2/FSharpDeclarationProcessor.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Cache2/FSharpDeclarationProcessor.cs @@ -40,7 +40,7 @@ public override void VisitFSharpFile(IFSharpFile fsFile) return; var fileKind = GetFSharpFileKind(fsFile); - var hasPairFile = myCheckerService.OptionsProvider.HasPairFile(sourceFile); + var hasPairFile = myCheckerService.FcsProjectProvider.HasPairFile(sourceFile); Builder.CreateProjectFilePart(new FSharpProjectFilePart(sourceFile, fileKind, hasPairFile)); diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Cache2/FSharpModule.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Cache2/FSharpModule.cs index d2cbe03bd9..517558c6e6 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Cache2/FSharpModule.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Cache2/FSharpModule.cs @@ -9,7 +9,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Cache2 { - internal class FSharpModule : FSharpClass, IModule + internal class FSharpModule : FSharpClass, IFSharpModule { public FSharpModule([NotNull] IModulePart part) : base(part) { diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Cache2/Parts/FSharpTypePart.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Cache2/Parts/FSharpTypePart.cs index fc6fa87b2d..368e3ad293 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Cache2/Parts/FSharpTypePart.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Cache2/Parts/FSharpTypePart.cs @@ -2,6 +2,7 @@ using FSharp.Compiler.SourceCodeServices; using JetBrains.Annotations; using JetBrains.Metadata.Reader.API; +using JetBrains.Metadata.Reader.Impl; using JetBrains.ReSharper.Plugins.FSharp.Psi.Tree; using JetBrains.ReSharper.Plugins.FSharp.Util; using JetBrains.ReSharper.Psi; @@ -10,6 +11,7 @@ using JetBrains.ReSharper.Psi.ExtensionsAPI.Caches2.ExtensionMethods; using JetBrains.ReSharper.Psi.Tree; using JetBrains.Util; +using JetBrains.Util.dataStructures; using JetBrains.Util.DataStructures; namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Cache2.Parts @@ -114,16 +116,21 @@ public override IList GetAttributeInstances(IClrTypeName clr if (AttributeClassNames.IsEmpty()) return EmptyList.Instance; - if (!((GetDeclaration() as IFSharpTypeDeclaration)?.GetFSharpSymbol() is FSharpEntity entity)) + if (!(GetDeclaration()?.GetFSharpSymbol() is FSharpEntity entity)) return EmptyList.Instance; var psiModule = GetPsiModule(); var entityAttrs = entity.Attributes; - var attrs = new IAttributeInstance[entityAttrs.Count]; - for (var i = 0; i < attrs.Length; i++) - attrs[i] = new FSharpAttributeInstance(entityAttrs[i], psiModule); + + if (entityAttrs.Count == 0) + return EmptyList.Instance; + + var result = new FrugalLocalList(); + foreach (var fcsAttribute in entityAttrs) + if (new ClrTypeName(fcsAttribute.AttributeType.QualifiedBaseName).Equals(clrName)) + result.Add(new FSharpAttributeInstance(fcsAttribute, psiModule)); - return attrs; + return result.ResultingList(); } public override bool HasAttributeInstance(IClrTypeName clrTypeName) diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/FSharpCliEvent.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/FSharpCliEvent.cs index 39efc1e858..a70788fc9b 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/FSharpCliEvent.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/FSharpCliEvent.cs @@ -12,8 +12,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.DeclaredElement internal class FSharpCliEvent : FSharpMemberBase, IEvent where TDeclaration : IFSharpDeclaration, IModifiersOwnerDeclaration, ITypeMemberDeclaration { - public FSharpCliEvent([NotNull] ITypeMemberDeclaration declaration, FSharpMemberOrFunctionOrValue mfv) - : base(declaration) + public FSharpCliEvent([NotNull] ITypeMemberDeclaration declaration) : base(declaration) { } @@ -37,8 +36,7 @@ public override DeclaredElementType GetElementType() => internal class AbstractFSharpCliEvent : FSharpCliEvent { - public AbstractFSharpCliEvent([NotNull] ITypeMemberDeclaration declaration, FSharpMemberOrFunctionOrValue mfv) - : base(declaration, mfv) + public AbstractFSharpCliEvent([NotNull] ITypeMemberDeclaration declaration) : base(declaration) { } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/FSharpConstructorBase.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/FSharpConstructorBase.cs index ca4ac39a0b..5a780f0005 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/FSharpConstructorBase.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/FSharpConstructorBase.cs @@ -12,8 +12,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.DeclaredElement internal abstract class FSharpConstructorBase : FSharpFunctionBase, IConstructor where TDeclaration : IFSharpDeclaration, IModifiersOwnerDeclaration, ITypeMemberDeclaration { - protected FSharpConstructorBase([NotNull] ITypeMemberDeclaration declaration, - [NotNull] FSharpMemberOrFunctionOrValue mfv) : base(declaration, mfv) + protected FSharpConstructorBase([NotNull] ITypeMemberDeclaration declaration) : base(declaration) { } @@ -35,8 +34,7 @@ public override DeclaredElementType GetElementType() => internal class FSharpConstructor : FSharpConstructorBase { - public FSharpConstructor([NotNull] ITypeMemberDeclaration declaration, - [NotNull] FSharpMemberOrFunctionOrValue mfv) : base(declaration, mfv) + public FSharpConstructor([NotNull] ITypeMemberDeclaration declaration) : base(declaration) { } @@ -45,8 +43,7 @@ public FSharpConstructor([NotNull] ITypeMemberDeclaration declaration, internal class FSharpImplicitConstructor : FSharpConstructorBase { - public FSharpImplicitConstructor([NotNull] ITypeMemberDeclaration declaration, - [NotNull] FSharpMemberOrFunctionOrValue mfv) : base(declaration, mfv) + public FSharpImplicitConstructor([NotNull] ITypeMemberDeclaration declaration) : base(declaration) { } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/FSharpFieldBase.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/FSharpFieldBase.cs index bc668e28a3..e69c5a2424 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/FSharpFieldBase.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/FSharpFieldBase.cs @@ -32,7 +32,7 @@ public override DeclaredElementType GetElementType() => public override bool IsFSharpMember => false; } - internal class FSharpTypePrivateField : FSharpFieldBase, IMutableModifierOwner + internal class FSharpTypePrivateField : FSharpFieldBase, IMutableModifierOwner, ITypePrivateMember { public FSharpTypePrivateField([NotNull] TopPatternDeclarationBase declaration) : base(declaration) { diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/FSharpFieldProperty.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/FSharpFieldProperty.cs index a3e43a2292..e3dfb3e3e9 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/FSharpFieldProperty.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/FSharpFieldProperty.cs @@ -26,9 +26,8 @@ internal class FSharpRecordField : FSharpFieldProperty, { private readonly bool myIsMutable; - internal FSharpRecordField([NotNull] IRecordFieldDeclaration declaration, [NotNull] FSharpField field) : - base(declaration) => - myIsMutable = field.IsMutable; + internal FSharpRecordField([NotNull] IRecordFieldDeclaration declaration) : base(declaration) => + myIsMutable = declaration.IsMutable; public bool IsMutable => myIsMutable || GetContainingType().IsCliMutableRecord(); diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/FSharpFunctionBase.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/FSharpFunctionBase.cs index 4c17ecd1b0..30b044ff26 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/FSharpFunctionBase.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/FSharpFunctionBase.cs @@ -13,8 +13,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.DeclaredElement internal abstract class FSharpFunctionBase : FSharpMemberBase, IFunction where TDeclaration : IFSharpDeclaration, IModifiersOwnerDeclaration, ITypeMemberDeclaration { - protected FSharpFunctionBase([NotNull] ITypeMemberDeclaration declaration, - [NotNull] FSharpMemberOrFunctionOrValue mfv) : base(declaration) + protected FSharpFunctionBase([NotNull] ITypeMemberDeclaration declaration) : base(declaration) { } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/FSharpMethod.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/FSharpMethod.cs index 1fa80446a0..2e670049cd 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/FSharpMethod.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/FSharpMethod.cs @@ -1,5 +1,4 @@ -using FSharp.Compiler.SourceCodeServices; -using JetBrains.Annotations; +using JetBrains.Annotations; using JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree; using JetBrains.ReSharper.Plugins.FSharp.Psi.Tree; using JetBrains.ReSharper.Psi; @@ -10,16 +9,14 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.DeclaredElement internal class FSharpMethod : FSharpMethodBase where TDeclaration : FSharpDeclarationBase, IFSharpDeclaration, IModifiersOwnerDeclaration, ITypeMemberDeclaration { - public FSharpMethod([NotNull] ITypeMemberDeclaration declaration, [NotNull] FSharpMemberOrFunctionOrValue mfv) - : base(declaration, mfv) + public FSharpMethod([NotNull] ITypeMemberDeclaration declaration) : base(declaration) { } } - internal class FSharpTypePrivateMethod : FSharpMethodBase + internal class FSharpTypePrivateMethod : FSharpMethodBase, ITypePrivateMember { - public FSharpTypePrivateMethod([NotNull] ITypeMemberDeclaration declaration, - [NotNull] FSharpMemberOrFunctionOrValue mfv) : base(declaration, mfv) + public FSharpTypePrivateMethod([NotNull] ITypeMemberDeclaration declaration) : base(declaration) { } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/FSharpMethodBase.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/FSharpMethodBase.cs index 35be6b130c..e5119acafa 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/FSharpMethodBase.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/FSharpMethodBase.cs @@ -1,4 +1,3 @@ -using FSharp.Compiler.SourceCodeServices; using JetBrains.Annotations; using JetBrains.ReSharper.Plugins.FSharp.Psi.Tree; using JetBrains.ReSharper.Plugins.FSharp.Util; @@ -12,8 +11,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.DeclaredElement internal abstract class FSharpMethodBase : FSharpTypeParametersOwnerBase, IMethod where TDeclaration : IFSharpDeclaration, IModifiersOwnerDeclaration, ITypeMemberDeclaration { - protected FSharpMethodBase([NotNull] ITypeMemberDeclaration declaration, - [NotNull] FSharpMemberOrFunctionOrValue mfv) : base(declaration, mfv) + protected FSharpMethodBase([NotNull] ITypeMemberDeclaration declaration) : base(declaration) { } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/FSharpOperator.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/FSharpOperator.cs index 2fbbaa5c50..b9a019b90e 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/FSharpOperator.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/FSharpOperator.cs @@ -1,5 +1,4 @@ -using FSharp.Compiler.SourceCodeServices; -using JetBrains.Annotations; +using JetBrains.Annotations; using JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree; using JetBrains.ReSharper.Plugins.FSharp.Psi.Tree; using JetBrains.ReSharper.Psi; @@ -10,8 +9,8 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.DeclaredElement internal class FSharpConversionOperator : FSharpOperatorBase, IConversionOperator where TDeclaration : IFSharpDeclaration, IModifiersOwnerDeclaration, ITypeMemberDeclaration { - internal FSharpConversionOperator([NotNull] ITypeMemberDeclaration declaration, - [NotNull] FSharpMemberOrFunctionOrValue mfv, bool isExplicitCast) : base(declaration, mfv) => + internal FSharpConversionOperator([NotNull] ITypeMemberDeclaration declaration, bool isExplicitCast) : + base(declaration) => IsExplicitCast = isExplicitCast; public override DeclaredElementType GetElementType() => @@ -24,8 +23,7 @@ public override DeclaredElementType GetElementType() => internal class FSharpSignOperator : FSharpOperatorBase, ISignOperator where TDeclaration : FSharpDeclarationBase, IFSharpDeclaration, IModifiersOwnerDeclaration, ITypeMemberDeclaration { - internal FSharpSignOperator([NotNull] ITypeMemberDeclaration declaration, - [NotNull] FSharpMemberOrFunctionOrValue mfv) : base(declaration, mfv) + internal FSharpSignOperator([NotNull] ITypeMemberDeclaration declaration) : base(declaration) { } @@ -36,8 +34,7 @@ public override DeclaredElementType GetElementType() => internal abstract class FSharpOperatorBase : FSharpTypeParametersOwnerBase, IOperator where TDeclaration : IFSharpDeclaration, IModifiersOwnerDeclaration, ITypeMemberDeclaration { - internal FSharpOperatorBase([NotNull] ITypeMemberDeclaration declaration, - [NotNull] FSharpMemberOrFunctionOrValue mfv) : base(declaration, mfv) + internal FSharpOperatorBase([NotNull] ITypeMemberDeclaration declaration) : base(declaration) { } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/FSharpTypeParametersOwnerBase.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/FSharpTypeParametersOwnerBase.cs index 31befc076b..d81d4687d9 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/FSharpTypeParametersOwnerBase.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/FSharpTypeParametersOwnerBase.cs @@ -11,8 +11,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.DeclaredElement internal abstract class FSharpTypeParametersOwnerBase : FSharpFunctionBase where TDeclaration : IFSharpDeclaration, IModifiersOwnerDeclaration, ITypeMemberDeclaration { - protected FSharpTypeParametersOwnerBase([NotNull] ITypeMemberDeclaration declaration, - [NotNull] FSharpMemberOrFunctionOrValue mfv) : base(declaration, mfv) + protected FSharpTypeParametersOwnerBase([NotNull] ITypeMemberDeclaration declaration) : base(declaration) { } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/ModuleFunction.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/ModuleFunction.cs index 86322f8b58..1757ef7dbb 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/ModuleFunction.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/DeclaredElement/ModuleFunction.cs @@ -1,5 +1,4 @@ -using FSharp.Compiler.SourceCodeServices; -using JetBrains.Annotations; +using JetBrains.Annotations; using JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree; using JetBrains.ReSharper.Psi.Tree; @@ -7,8 +6,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.DeclaredElement { internal class ModuleFunction : FSharpMethodBase { - public ModuleFunction([NotNull] ITypeMemberDeclaration declaration, [NotNull] FSharpMemberOrFunctionOrValue mfv) - : base(declaration, mfv) + public ModuleFunction([NotNull] ITypeMemberDeclaration declaration) : base(declaration) { } } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/FSharpArgumentsOwnerUtil.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/FSharpArgumentsOwnerUtil.cs new file mode 100644 index 0000000000..fa84c3fdee --- /dev/null +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/FSharpArgumentsOwnerUtil.cs @@ -0,0 +1,46 @@ +using System.Collections.Generic; +using System.Linq; +using FSharp.Compiler.SourceCodeServices; +using JetBrains.ReSharper.Plugins.FSharp.Psi.Tree; +using JetBrains.ReSharper.Psi.Tree; +using JetBrains.Util; + +namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl +{ + public static class FSharpArgumentsOwnerUtil + { + public static IList CalculateParameterArguments(IFSharpReferenceOwner referenceOwner, + IEnumerable appliedExpressions) + { + if (!(referenceOwner.Reference?.GetFSharpSymbol() is FSharpMemberOrFunctionOrValue mfv)) + return EmptyList.Instance; + + var paramGroups = mfv.CurriedParameterGroups; + var isVoidReturn = paramGroups.Count == 1 && paramGroups[0].Count == 1 && paramGroups[0][0].Type.IsUnit; + + if (isVoidReturn) + return EmptyArray.Instance; + + return paramGroups + .Zip(appliedExpressions, (paramGroup, argExpr) => (paramGroup, argExpr.IgnoreInnerParens())) + .SelectMany(pair => + { + var (paramGroup, argExpr) = pair; + + // e.g. F# extension methods with 0 parameters + if (paramGroup.Count == 0) + return EmptyList.Instance; + + if (paramGroup.Count == 1) + return new[] {argExpr as IArgument}; + + var tupleExprs = argExpr is ITupleExpr tupleExpr + ? (IReadOnlyList) tupleExpr.Expressions + : EmptyList.Instance; + + return Enumerable.Range(0, paramGroup.Count) + .Select(i => i < tupleExprs.Count ? tupleExprs[i] as IArgument : null); + }).ToList(); + } + } +} diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/FSharpImplUtil.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/FSharpImplUtil.cs index c0ea3a1503..f63db1c1c3 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/FSharpImplUtil.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/FSharpImplUtil.cs @@ -18,6 +18,7 @@ using JetBrains.ReSharper.Psi.ExtensionsAPI; using JetBrains.ReSharper.Psi.ExtensionsAPI.Caches2; using JetBrains.ReSharper.Psi.ExtensionsAPI.Tree; +using JetBrains.ReSharper.Psi.Impl.Reflection2; using JetBrains.ReSharper.Psi.Modules; using JetBrains.ReSharper.Psi.Naming; using JetBrains.ReSharper.Psi.Parsing; @@ -34,14 +35,16 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl public static class FSharpImplUtil { public const string CompiledNameAttrName = "Microsoft.FSharp.Core.CompiledNameAttribute"; - public const string ModuleSuffix = "CompilationRepresentationFlags.ModuleSuffix"; + public const string ModuleSuffixFlag = "CompilationRepresentationFlags.ModuleSuffix"; public const string CompiledName = "CompiledName"; public const string AttributeSuffix = "Attribute"; + public const string ModuleSuffix = "Module"; public const string Interface = "Interface"; public const string AbstractClass = "AbstractClass"; public const string Class = "Class"; public const string Sealed = "Sealed"; public const string Struct = "Struct"; + public const string AutoOpen = "AutoOpen"; [NotNull] public static string GetShortName([NotNull] this IAttribute attr) => attr.ReferenceName?.ShortName.GetAttributeShortName() ?? SharedImplUtil.MISSING_DECLARATION_NAME; @@ -50,7 +53,7 @@ public static bool ShortNameEquals([NotNull] this IAttribute attr, [NotNull] str attr.GetShortName() == shortName; [CanBeNull] - private static FSharpString GetStringConst([CanBeNull] ISynExpr expr) + private static FSharpString GetStringConst([CanBeNull] IFSharpExpression expr) { switch (expr) { @@ -85,14 +88,14 @@ private static bool GetCompiledNameValue(IAttribute attr, out string compiledNam return true; } - private static bool IsModuleSuffixExpr([CanBeNull] ISynExpr expr) + private static bool IsModuleSuffixExpr([CanBeNull] IFSharpExpression expr) { switch (expr) { case ParenExpr parenExpr: return IsModuleSuffixExpr(parenExpr.InnerExpression); case IReferenceExpr referenceExpr: - return referenceExpr.QualifiedName == ModuleSuffix; + return referenceExpr.QualifiedName == ModuleSuffixFlag; } return false; @@ -278,8 +281,8 @@ public static TreeNodeCollection GetAttributes([NotNull] this IDecla return typeDeclaration.AllAttributes; case IMemberDeclaration memberDeclaration: return memberDeclaration.Attributes; - case ISynPat pat: - return pat.Attributes; + case IFSharpPattern fsPattern: + return fsPattern.Attributes; case IDeclaredModuleDeclaration moduleDeclaration: return moduleDeclaration.Attributes; default: return TreeNodeCollection.Empty; @@ -378,10 +381,55 @@ public static string GetSourceName([NotNull] this TypeElement typeElement) return typeElement.ShortName; } + public static bool HasModuleSuffix([NotNull] this string shortName) => + shortName.EndsWith(ModuleSuffix, StringComparison.Ordinal); + + public static ITypeElement TryGetAssociatedType([NotNull] this CompiledTypeElement moduleTypeElement, string sourceName) + { + Assertion.Assert(moduleTypeElement.IsCompiledModule(), "moduleTypeElement.IsCompiledModule()"); + + bool IsAssociatedType(ITypeElement t) => + !t.Equals(moduleTypeElement) && t.TypeParameters.Count == 0 && + !t.IsCompiledModule() && t.GetSourceName() == sourceName; + + var containingType = moduleTypeElement.GetContainingType(); + if (containingType != null) + return containingType.NestedTypes.FirstOrDefault(IsAssociatedType); + + var ns = moduleTypeElement.GetContainingNamespace(); + var symbolScope = moduleTypeElement.Module.GetModuleOnlySymbolScope(); + return ns.GetNestedTypeElements(symbolScope).FirstOrDefault(IsAssociatedType); + } + + public static string GetSourceName([NotNull] this CompiledTypeElement typeElement) + { + if (typeElement.GetAttributeFirstArgValue(FSharpPredefinedType.SourceNameAttrTypeName) is string sourceName && + sourceName != SharedImplUtil.MISSING_DECLARATION_NAME) + return sourceName; + + var shortName = typeElement.ShortName; + if (shortName.HasModuleSuffix() && typeElement.IsCompiledModule()) + { + var shortNameWithoutSuffix = shortName.SubstringBeforeLast(ModuleSuffix); + var flags = typeElement.GetAttributeFirstArgValue(FSharpPredefinedType.CompilationRepresentationAttrTypeName); + if (flags != null && (CompilationRepresentationFlags) flags == CompilationRepresentationFlags.ModuleSuffix) + return shortNameWithoutSuffix; + + if (typeElement.TryGetAssociatedType(shortNameWithoutSuffix) != null) + return shortNameWithoutSuffix; + } + + return shortName; + } + public static string GetSourceName([NotNull] this IDeclaredElement declaredElement) => - declaredElement is IFSharpDeclaredElement fsElement - ? fsElement.SourceName - : declaredElement.ShortName; + declaredElement switch + { + INamespace ns => ns.IsRootNamespace ? "global" : ns.ShortName, + IFSharpDeclaredElement fsElement => fsElement.SourceName, + CompiledTypeElement compiledTypeElement => GetSourceName(compiledTypeElement), + _ => declaredElement.ShortName + }; public static AccessRights GetFSharpRepresentationAccessRights([CanBeNull] this ITypeElement type) { @@ -577,6 +625,22 @@ public static IDeclaredElement GetModuleToUpdateName([NotNull] this IFSharpTypeE return null; } + public static bool HasAttribute([NotNull] this TypeElement typeElement, string attrShortName) + { + foreach (var part in typeElement.EnumerateParts()) + if (part.AttributeClassNames.Contains(attrShortName)) + return true; + return false; + } + + public static bool HasAutoOpenAttribute([NotNull] this ITypeElement typeElement) => + typeElement switch + { + FSharpModule fsModule => HasAttribute(fsModule, AutoOpen), + IFSharpTypeElement _ => false, + _ => typeElement.HasAttributeInstance(FSharpPredefinedType.AutoOpenAttrTypeName, false) + }; + public static bool IsRecord([NotNull] this ITypeElement typeElement) => typeElement switch { @@ -603,7 +667,7 @@ public static ICollection GetRecordFieldNames([NotNull] this ITypeElemen } public static bool IsModule(this ITypeElement typeElement) => - typeElement is IModule || + typeElement is IFSharpModule || typeElement is ICompiledElement compiledElement && compiledElement.IsCompiledModule(); public static ModuleMembersAccessKind GetAccessType([NotNull] this ITypeElement typeElement) @@ -611,7 +675,7 @@ public static ModuleMembersAccessKind GetAccessType([NotNull] this ITypeElement Assertion.Assert(typeElement.IsModule(), "typeElement.IsModule()"); return typeElement switch { - IModule module => module.AccessKind, + IFSharpModule module => module.AccessKind, ICompiledElement _ => typeElement.HasRequireQualifiedAccessAttribute() ? ModuleMembersAccessKind.RequiresQualifiedAccess @@ -620,42 +684,50 @@ public static ModuleMembersAccessKind GetAccessType([NotNull] this ITypeElement }; } - public static ISynExpr IgnoreParentParens([NotNull] this ISynExpr synExpr) + public static bool RequiresQualifiedAccess([NotNull] this ITypeElement typeElement) => + typeElement.GetAccessType() == ModuleMembersAccessKind.RequiresQualifiedAccess; + + public static IFSharpExpression IgnoreParentParens([NotNull] this IFSharpExpression fsExpr) { - while (synExpr.Parent is IParenExpr parenExpr) - synExpr = parenExpr; - return synExpr; + while (fsExpr.Parent is IParenExpr parenExpr) + fsExpr = parenExpr; + return fsExpr; } - + + public static ITreeNode IgnoreParentChameleonExpr([NotNull] this ITreeNode treeNode) => + treeNode.Parent is IChameleonExpression parenExpr + ? parenExpr.Parent + : treeNode.Parent; + [CanBeNull] - public static ISynExpr IgnoreInnerParens([CanBeNull] this ISynExpr synExpr) + public static IFSharpExpression IgnoreInnerParens([CanBeNull] this IFSharpExpression fsExpr) { - if (synExpr == null) + if (fsExpr == null) return null; - while (synExpr is IParenExpr parenExpr && parenExpr.InnerExpression != null) - synExpr = parenExpr.InnerExpression; - return synExpr; + while (fsExpr is IParenExpr parenExpr && parenExpr.InnerExpression != null) + fsExpr = parenExpr.InnerExpression; + return fsExpr; } - public static ISynPat IgnoreParentParens([CanBeNull] this ISynPat synPat) + public static IFSharpPattern IgnoreParentParens([CanBeNull] this IFSharpPattern fsPattern) { - if (synPat == null) + if (fsPattern == null) return null; - while (synPat.Parent is IParenPat parenPat) - synPat = parenPat; - return synPat; + while (fsPattern.Parent is IParenPat parenPat) + fsPattern = parenPat; + return fsPattern; } - public static ISynPat IgnoreInnerParens([CanBeNull] this ISynPat synPat) + public static IFSharpPattern IgnoreInnerParens([CanBeNull] this IFSharpPattern fsPattern) { - if (synPat == null) + if (fsPattern == null) return null; - while (synPat is IParenPat parenPat && parenPat.Pattern != null) - synPat = parenPat.Pattern; - return synPat; + while (fsPattern is IParenPat parenPat && parenPat.Pattern != null) + fsPattern = parenPat.Pattern; + return fsPattern; } [NotNull] @@ -668,17 +740,6 @@ public static IFSharpReferenceOwner SetName([NotNull] this IFSharpReferenceOwner return referenceOwner; } - [NotNull] - public static string GetQualifiedName([NotNull] this IReferenceName referenceName) - { - var qualifier = referenceName.Qualifier; - var shortName = referenceName.ShortName; - - return qualifier == null - ? shortName - : qualifier.QualifiedName + "." + shortName; - } - [NotNull] public static string GetQualifiedName([CanBeNull] IReferenceName qualifier, [CanBeNull] IFSharpIdentifier identifier) @@ -694,22 +755,23 @@ public static string GetQualifiedName([CanBeNull] IReferenceName qualifier, : qualifier.QualifiedName; } - public static IList GetNames([CanBeNull] this IReferenceName referenceName) + public static IList GetNames([CanBeNull] this IReferenceExpr referenceExpr) { var result = new List(); - while (referenceName != null) + while (referenceExpr != null) { - var shortName = referenceName.ShortName; + var shortName = referenceExpr.ShortName; if (shortName.IsEmpty() || shortName == SharedImplUtil.MISSING_DECLARATION_NAME) break; result.Insert(0, shortName); - referenceName = referenceName.Qualifier; + referenceExpr = referenceExpr.Qualifier as IReferenceExpr; } return result; } + public static ModuleMembersAccessKind GetAccessType([NotNull] this IDeclaredModuleDeclaration moduleDeclaration) { var autoOpen = false; @@ -729,25 +791,6 @@ public static ModuleMembersAccessKind GetAccessType([NotNull] this IDeclaredModu : ModuleMembersAccessKind.Normal; } - [CanBeNull] - public static IReferenceName GetFirstQualifier([NotNull] this IReferenceName referenceName) - { - var qualifier = referenceName.Qualifier; - while (qualifier != null) - { - referenceName = qualifier; - qualifier = referenceName.Qualifier; - } - - return referenceName; - } - - public static IReferenceName GetFirstName([NotNull] this IReferenceName referenceName) - { - var firstQualifier = referenceName.GetFirstQualifier(); - return firstQualifier ?? referenceName; - } - public static IList GetAllTypeParametersReversed(this ITypeElement typeElement) => typeElement.GetAllTypeParameters().ResultingList().Reverse(); } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/FSharpBindingUtil.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/FSharpReferenceBindingUtil.cs similarity index 50% rename from ReSharper.FSharp/src/FSharp.Psi/src/Impl/FSharpBindingUtil.cs rename to ReSharper.FSharp/src/FSharp.Psi/src/Impl/FSharpReferenceBindingUtil.cs index a089907172..6b16c33f6a 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/FSharpBindingUtil.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/FSharpReferenceBindingUtil.cs @@ -1,5 +1,6 @@ using System; using JetBrains.Annotations; +using JetBrains.ReSharper.Plugins.FSharp.Psi.Resolve; using JetBrains.ReSharper.Plugins.FSharp.Psi.Tree; using JetBrains.ReSharper.Psi; using JetBrains.ReSharper.Psi.Naming; @@ -8,7 +9,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl { - public static class FSharpBindingUtil + public static class FSharpReferenceBindingUtil { [NotNull] public static string SuggestShortReferenceName([NotNull] IReference reference, @@ -28,7 +29,26 @@ public static string SuggestShortReferenceName([NotNull] IReference reference, } } - return NamingManager.GetNamingLanguageService(treeNode.Language).MangleNameIfNecessary(sourceName); + return SuggestShortReferenceName(sourceName, treeNode.Language); + } + + public static string SuggestShortReferenceName(IDeclaredElement declaredElement, PsiLanguageType language) => + SuggestShortReferenceName(declaredElement.GetSourceName(), language); + + public static string SuggestShortReferenceName(string sourceName, PsiLanguageType language) => + NamingManager.GetNamingLanguageService(language).MangleNameIfNecessary(sourceName); + + public static void SetRequiredQualifiers([NotNull] FSharpSymbolReference reference, + [NotNull] IClrDeclaredElement declaredElement) + { + var containingType = declaredElement.GetContainingType(); + if (containingType == null) + return; + + if (containingType.IsModule() && !containingType.RequiresQualifiedAccess()) + return; + + reference.SetQualifier(containingType); } } } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/AbbreviatedTypeOrUnionCase.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/AbbreviatedTypeOrUnionCase.cs index d0f9afa92e..57c7d90ed1 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/AbbreviatedTypeOrUnionCase.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/AbbreviatedTypeOrUnionCase.cs @@ -7,7 +7,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree internal partial class AbbreviatedTypeOrUnionCaseDeclaration { private ITypeReferenceName NamedTypeReferenceName => - AbbreviatedType is INamedType namedType ? namedType.ReferenceName : null; + AbbreviatedType is INamedTypeUsage namedTypeUsage ? namedTypeUsage.ReferenceName : null; public override IFSharpIdentifierLikeNode NameIdentifier => NamedTypeReferenceName is var referenceName && TypeReferenceCanBeUnionCaseDeclaration(referenceName) @@ -17,7 +17,7 @@ internal partial class AbbreviatedTypeOrUnionCaseDeclaration protected override string DeclaredElementName => NameIdentifier.GetSourceName(); protected override IDeclaredElement CreateDeclaredElement() => - AbbreviatedType is INamedType namedType && namedType.ReferenceName is var referenceName && + AbbreviatedType is INamedTypeUsage namedTypeUsage && namedTypeUsage.ReferenceName is var referenceName && referenceName.Reference.Resolve().DeclaredElement == null ? new FSharpUnionCaseProperty(this) : null; diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/AbstractSlot.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/AbstractSlot.cs index f11afb40d0..d13b63cfb9 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/AbstractSlot.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/AbstractSlot.cs @@ -32,7 +32,7 @@ protected override IDeclaredElement CreateDeclaredElement() logicalName.StartsWith("remove_", StringComparison.Ordinal)) { if (mfv.Attributes.HasAttributeInstance(FSharpPredefinedType.CLIEventAttribute)) - return new AbstractFSharpCliEvent(this, mfv); + return new AbstractFSharpCliEvent(this); } if (mfv.IsProperty) @@ -42,7 +42,7 @@ protected override IDeclaredElement CreateDeclaredElement() if (property != null) return new FSharpProperty(this, property.Value); - return new FSharpMethod(this, mfv); + return new FSharpMethod(this); } } } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/Attribute.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/Attribute.cs index 88a7df94f5..76c8f0d96f 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/Attribute.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/Attribute.cs @@ -1,14 +1,25 @@ +using System.Collections.Generic; +using System.Linq; using JetBrains.ReSharper.Plugins.FSharp.Psi.Resolve; using JetBrains.ReSharper.Plugins.FSharp.Psi.Tree; +using JetBrains.ReSharper.Psi; using JetBrains.ReSharper.Psi.Tree; +using JetBrains.Util; namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree { internal partial class Attribute { + private readonly CachedPsiValue> myParameterArguments = new FileCachedPsiValue>(); + protected override FSharpSymbolReference CreateReference() => new CtorReference(this); public override IFSharpIdentifier FSharpIdentifier => ReferenceName?.Identifier; + + public IList ParameterArguments => myParameterArguments.GetValue(this, () => + FSharpArgumentsOwnerUtil.CalculateParameterArguments(this, new[] {ArgExpression?.Expression})); + + public IList Arguments => ParameterArguments.WhereNotNull().ToList(); } } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/ChildRole.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/ChildRole.cs index 7bf0f60a5f..8a9da018a6 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/ChildRole.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/ChildRole.cs @@ -8,6 +8,7 @@ public static class ChildRole public const short FSHARP_AND = 2; public const short FSHARP_SEMI = 3; public const short FSHARP_EQUALS = 4; + public const short FSHARP_DELIMITER = 5; public const short LAST = 100; } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/FSharpExpressionBase.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/FSharpExpressionBase.cs index d32e2a8805..ef826a0c04 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/FSharpExpressionBase.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/FSharpExpressionBase.cs @@ -7,7 +7,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree { - public abstract class FSharpExpressionBase : FSharpCompositeElement, ISynExpr, IArgument + public abstract class FSharpExpressionBase : FSharpCompositeElement, IFSharpExpression, IArgument { public virtual ConstantValue ConstantValue => ConstantValue.BAD_VALUE; public virtual bool IsConstantValue() => false; diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/ForEachExpr.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/ForEachExpr.cs new file mode 100644 index 0000000000..3eed21bda5 --- /dev/null +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/ForEachExpr.cs @@ -0,0 +1,10 @@ +using JetBrains.ReSharper.Plugins.FSharp.Psi.Parsing; + +namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree +{ + internal partial class ForEachExpr + { + public bool IsYieldExpression => + BodySeparator?.GetTokenType() == FSharpTokenType.RARROW; + } +} diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/ImplicitConstructorDeclaration.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/ImplicitConstructorDeclaration.cs index 296d6c91ee..032d644373 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/ImplicitConstructorDeclaration.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/ImplicitConstructorDeclaration.cs @@ -1,5 +1,4 @@ -using FSharp.Compiler.SourceCodeServices; -using JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.DeclaredElement; +using JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.DeclaredElement; using JetBrains.ReSharper.Plugins.FSharp.Psi.Tree; using JetBrains.ReSharper.Psi; using JetBrains.ReSharper.Psi.ExtensionsAPI; @@ -18,9 +17,7 @@ public override TreeTextRange GetNameRange() => GetContainingTypeDeclaration()?.GetNameRange() ?? TreeTextRange.InvalidRange; protected override IDeclaredElement CreateDeclaredElement() => - GetFSharpSymbol() is FSharpMemberOrFunctionOrValue ctor - ? new FSharpImplicitConstructor(this, ctor) - : null; + new FSharpImplicitConstructor(this); public override IFSharpIdentifierLikeNode NameIdentifier => null; public override TreeTextRange GetNameIdentifierRange() => GetNameRange(); diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/LetOrUseBangExpr.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/LetOrUseBangExpr.cs deleted file mode 100644 index 371c8e8885..0000000000 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/LetOrUseBangExpr.cs +++ /dev/null @@ -1,11 +0,0 @@ -using JetBrains.ReSharper.Plugins.FSharp.Psi.Parsing; -using JetBrains.ReSharper.Plugins.FSharp.Psi.Tree; -using JetBrains.ReSharper.Psi.Tree; - -namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree -{ - internal partial class LetOrUseBangExpr - { - public bool IsUse => LetOrUseToken?.GetTokenType() == FSharpTokenType.USE_BANG; - } -} diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/LetOrUseExpr.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/LetOrUseExpr.cs index 0266000b7f..4a7345bb61 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/LetOrUseExpr.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/LetOrUseExpr.cs @@ -1,13 +1,15 @@ using JetBrains.Diagnostics; using JetBrains.ReSharper.Plugins.FSharp.Psi.Parsing; -using JetBrains.ReSharper.Resources.Shell; namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree { internal partial class LetOrUseExpr { public bool IsRecursive => RecKeyword != null; - public bool IsUse => LetOrUseToken?.GetTokenType() == FSharpTokenType.USE; + + public bool IsUse => + LetOrUseToken?.GetTokenType() is var tokenType && + (tokenType == FSharpTokenType.USE || tokenType == FSharpTokenType.USE_BANG); public void SetIsRecursive(bool value) { diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/MemberConstructorDeclaration.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/MemberConstructorDeclaration.cs index a566506862..d5ef73fe89 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/MemberConstructorDeclaration.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/MemberConstructorDeclaration.cs @@ -1,5 +1,4 @@ -using FSharp.Compiler.SourceCodeServices; -using JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.DeclaredElement; +using JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.DeclaredElement; using JetBrains.ReSharper.Plugins.FSharp.Psi.Tree; using JetBrains.ReSharper.Psi; using JetBrains.ReSharper.Psi.ExtensionsAPI; @@ -17,11 +16,10 @@ internal partial class MemberConstructorDeclaration public override TreeTextRange GetNameRange() => NewKeyword.GetTreeTextRange(); public override IFSharpIdentifierLikeNode NameIdentifier => null; - public override TreeTextRange GetNameIdentifierRange() => this.GetTreeTextRange(); + + public override TreeTextRange GetNameIdentifierRange() => GetNameRange(); protected override IDeclaredElement CreateDeclaredElement() => - GetFSharpSymbol() is FSharpMemberOrFunctionOrValue ctor - ? new FSharpConstructor(this, ctor) - : null; + new FSharpConstructor(this); } } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/MemberDeclaration.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/MemberDeclaration.cs index ef541c0bf6..a5b7bc7cb3 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/MemberDeclaration.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/MemberDeclaration.cs @@ -1,4 +1,4 @@ -using System; +using System; using FSharp.Compiler.SourceCodeServices; using JetBrains.Metadata.Reader.API; using JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.DeclaredElement; @@ -33,7 +33,7 @@ protected override IDeclaredElement CreateDeclaredElement() { var cliEvent = property.EventForFSharpProperty?.Value; return cliEvent != null - ? (ITypeMember) new FSharpCliEvent(this, cliEvent) + ? (ITypeMember) new FSharpCliEvent(this) : new FSharpProperty(this, property); } @@ -43,15 +43,15 @@ protected override IDeclaredElement CreateDeclaredElement() switch (compiledName) { case StandardOperatorNames.Explicit: - return new FSharpConversionOperator(this, mfv, true); + return new FSharpConversionOperator(this, true); case StandardOperatorNames.Implicit: - return new FSharpConversionOperator(this, mfv, false); + return new FSharpConversionOperator(this, false); } - return new FSharpSignOperator(this, mfv); + return new FSharpSignOperator(this); } - return new FSharpMethod(this, mfv); + return new FSharpMethod(this); } public bool IsExplicitImplementation => diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/NewExpr.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/NewExpr.cs new file mode 100644 index 0000000000..a38c2efa78 --- /dev/null +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/NewExpr.cs @@ -0,0 +1,34 @@ +using System.Collections.Generic; +using System.Linq; +using JetBrains.ReSharper.Plugins.FSharp.Psi.Resolve; +using JetBrains.ReSharper.Plugins.FSharp.Psi.Tree; +using JetBrains.ReSharper.Psi; +using JetBrains.ReSharper.Psi.Tree; +using JetBrains.Util; + +namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree +{ + internal partial class NewExpr + { + private readonly CachedPsiValue> myParameterArguments = new FileCachedPsiValue>(); + public FSharpSymbolReference Reference { get; private set; } + + protected override void PreInit() + { + base.PreInit(); + Reference = new CtorReference(this); + } + + public IFSharpIdentifier FSharpIdentifier => TypeName?.Identifier; + + public IFSharpReferenceOwner SetName(string name) => this; + + public override ReferenceCollection GetFirstClassReferences() => + new ReferenceCollection(Reference); + + public IList ParameterArguments => myParameterArguments.GetValue(this, + () => FSharpArgumentsOwnerUtil.CalculateParameterArguments(this, new[] {ArgumentExpression})); + + public IList Arguments => ParameterArguments.WhereNotNull().ToList(); + } +} diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/PrefixAppExpr.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/PrefixAppExpr.cs index 2640e2ccb7..f79d63329e 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/PrefixAppExpr.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/PrefixAppExpr.cs @@ -1,31 +1,51 @@ using System.Collections.Generic; +using System.Linq; using FSharp.Compiler.SourceCodeServices; using JetBrains.ReSharper.Plugins.FSharp.Psi.Resolve; using JetBrains.ReSharper.Plugins.FSharp.Psi.Tree; using JetBrains.ReSharper.Plugins.FSharp.Psi.Util; using JetBrains.ReSharper.Psi; using JetBrains.ReSharper.Psi.Tree; +using JetBrains.Util; namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree { internal partial class PrefixAppExpr { - public FSharpSymbolReference InvokedFunctionReference + private readonly CachedPsiValue> myParameterArguments = new FileCachedPsiValue>(); + + public FSharpSymbolReference Reference => InvokedReferenceExpression?.Reference; + + public IReferenceExpr InvokedReferenceExpression { get { - var argsCount = 0; var funExpr = (IPrefixAppExpr) this; while (funExpr.FunctionExpression.IgnoreInnerParens() is IPrefixAppExpr appExpr) { funExpr = appExpr; - argsCount++; } if (!(funExpr.FunctionExpression.IgnoreInnerParens() is IReferenceExpr referenceExpr)) + { return null; + } + + return referenceExpr; + } + } + + public IFSharpIdentifier FSharpIdentifier => InvokedReferenceExpression?.Identifier; - argsCount++; + public IFSharpReferenceOwner SetName(string name) => this; + + public FSharpSymbolReference InvokedFunctionReference + { + get + { + var referenceExpr = InvokedReferenceExpression; + if (referenceExpr == null) + return null; var reference = referenceExpr.Reference; var fsSymbol = reference.GetFSharpSymbol(); @@ -35,15 +55,15 @@ public FSharpSymbolReference InvokedFunctionReference return null; var paramGroups = mfv.CurriedParameterGroups; - return paramGroups.Count >= argsCount ? reference : null; + return paramGroups.Count >= AppliedExpressions.Count ? reference : null; } } - public IList Arguments + public IList AppliedExpressions { get { - var args = new List(); + var args = new List(); var funExpr = (IPrefixAppExpr) this; while (funExpr.FunctionExpression.IgnoreInnerParens() is IPrefixAppExpr appExpr) { @@ -57,6 +77,11 @@ public IList Arguments } } + public IList Arguments => ParameterArguments.Where(arg => arg != null).ToList(); + + public IList ParameterArguments => myParameterArguments.GetValue(this, + () => FSharpArgumentsOwnerUtil.CalculateParameterArguments(this, AppliedExpressions)); + public override IType Type() { var reference = InvokedFunctionReference; diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/RecordFieldDeclaration.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/RecordFieldDeclaration.cs index 456436c42b..fa39a47b25 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/RecordFieldDeclaration.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/RecordFieldDeclaration.cs @@ -1,5 +1,4 @@ -using FSharp.Compiler.SourceCodeServices; -using JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.DeclaredElement; +using JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.DeclaredElement; using JetBrains.ReSharper.Plugins.FSharp.Psi.Parsing; using JetBrains.ReSharper.Plugins.FSharp.Psi.Tree; using JetBrains.ReSharper.Psi; @@ -12,7 +11,7 @@ internal partial class RecordFieldDeclaration public override IFSharpIdentifierLikeNode NameIdentifier => (IFSharpIdentifierLikeNode) Identifier; protected override IDeclaredElement CreateDeclaredElement() => - GetFSharpSymbol() is FSharpField field ? new FSharpRecordField(this, field) : null; + new FSharpRecordField(this); public bool IsMutable => MutableKeyword != null; diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/ReferenceExpr.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/ReferenceExpr.cs index b18030f0e3..aeb274fe69 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/ReferenceExpr.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/ReferenceExpr.cs @@ -1,5 +1,7 @@ +using System.Collections.Generic; using FSharp.Compiler.SourceCodeServices; using JetBrains.Annotations; +using JetBrains.Diagnostics; using JetBrains.ReSharper.Plugins.FSharp.Psi.Resolve; using JetBrains.ReSharper.Plugins.FSharp.Psi.Tree; using JetBrains.ReSharper.Psi; @@ -72,10 +74,8 @@ public FSharpSymbolReference Reference return SymbolReference; lock (this) - { - if (SymbolReference == null) - SymbolReference = new FSharpSymbolReference(this); - } + SymbolReference ??= new FSharpSymbolReference(this); + return SymbolReference; } } @@ -86,6 +86,20 @@ public IFSharpReferenceOwner SetName(string name) => FSharpImplUtil.SetName(this, name); ITypeArgumentList ITypeArgumentOwner.TypeArgumentList => TypeArgumentList; + + public bool IsQualified => Qualifier != null; + + public FSharpSymbolReference QualifierReference => + Qualifier is IReferenceExpr refExpr ? refExpr.Reference : null; + + public void SetQualifier(IClrDeclaredElement declaredElement) + { + // todo: implement for existing qualifiers + Assertion.Assert(Qualifier == null, "Qualifier == null"); + this.SetQualifier(this.CreateElementFactory().CreateReferenceExpr, declaredElement); + } + + public IList Names => this.GetNames(); } public class ReferenceExpressionTypeReference : FSharpSymbolReference @@ -94,12 +108,12 @@ public ReferenceExpressionTypeReference([NotNull] IFSharpReferenceOwner owner) : { } - public override FSharpSymbol GetFSharpSymbol() - { - if (base.GetFSharpSymbol() is FSharpMemberOrFunctionOrValue mfv && mfv.IsConstructor) - return mfv.DeclaringEntity?.Value; - - return null; - } + public override FSharpSymbol GetFSharpSymbol() => + base.GetFSharpSymbol() switch + { + FSharpMemberOrFunctionOrValue mfv when mfv.IsConstructor => mfv.DeclaringEntity?.Value, + // FSharpUnionCase unionCase => unionCase.ReturnType.TypeDefinition, + _ => null + }; } } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/ReferenceName.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/ReferenceName.cs index e4d3367890..8f00f334db 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/ReferenceName.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/ReferenceName.cs @@ -1,7 +1,14 @@ +using System; using System.Collections.Generic; +using JetBrains.Annotations; +using JetBrains.Diagnostics; +using JetBrains.ReSharper.Plugins.FSharp.Psi.Parsing; using JetBrains.ReSharper.Plugins.FSharp.Psi.Resolve; using JetBrains.ReSharper.Plugins.FSharp.Psi.Tree; +using JetBrains.ReSharper.Psi; using JetBrains.ReSharper.Psi.ExtensionsAPI; +using JetBrains.ReSharper.Psi.ExtensionsAPI.Tree; +using JetBrains.Util; namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree { @@ -11,6 +18,12 @@ internal partial class TypeReferenceName public string ShortName => FSharpIdentifier?.Name ?? SharedImplUtil.MISSING_DECLARATION_NAME; public string QualifiedName => this.GetQualifiedName(); public IList Names => this.GetNames(); + + public bool IsQualified => Qualifier != null; + public FSharpSymbolReference QualifierReference => Qualifier?.Reference; + + public void SetQualifier(IClrDeclaredElement declaredElement) => + this.SetQualifier(this.CreateElementFactory().CreateTypeReferenceName, declaredElement); } internal partial class ExpressionReferenceName @@ -23,5 +36,57 @@ protected override FSharpSymbolReference CreateReference() => public string ShortName => FSharpIdentifier?.Name ?? SharedImplUtil.MISSING_DECLARATION_NAME; public string QualifiedName => this.GetQualifiedName(); public IList Names => this.GetNames(); + + public bool IsQualified => Qualifier != null; + public FSharpSymbolReference QualifierReference => Qualifier?.Reference; + + public void SetQualifier(IClrDeclaredElement declaredElement) => + this.SetQualifier(this.CreateElementFactory().CreateExpressionReferenceName, declaredElement); + } + + public static class ReferenceNameExtensions + { + [NotNull] + public static string GetQualifiedName([NotNull] this IReferenceName referenceName) + { + var qualifier = referenceName.Qualifier; + var shortName = referenceName.ShortName; + + return qualifier == null + ? shortName + : qualifier.QualifiedName + "." + shortName; + } + + [CanBeNull] + public static IReferenceName GetFirstQualifier([NotNull] this IReferenceName referenceName) + { + var qualifier = referenceName.Qualifier; + while (qualifier != null) + { + referenceName = qualifier; + qualifier = referenceName.Qualifier; + } + + return referenceName; + } + + public static IReferenceName GetFirstName([NotNull] this IReferenceName referenceName) => + referenceName.GetFirstQualifier() ?? referenceName; + + public static IList GetNames([CanBeNull] this IReferenceName referenceName) + { + var result = new List(); + while (referenceName != null) + { + var shortName = referenceName.ShortName; + if (shortName.IsEmpty() || shortName == SharedImplUtil.MISSING_DECLARATION_NAME) + break; + + result.Insert(0, shortName); + referenceName = referenceName.Qualifier; + } + + return result; + } } } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/SynPatBase.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/SynPatBase.cs index ede609eb5d..2db3743784 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/SynPatBase.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/SynPatBase.cs @@ -31,7 +31,31 @@ public void SetIsMutable(bool value) internal partial class LocalReferencePat { public override IFSharpIdentifierLikeNode NameIdentifier => ReferenceName?.Identifier; - public bool IsDeclaration => true; + + public bool IsDeclaration + { + get + { + // todo: check other parents: e.g. parameters? + if (Parent is IBinding) + return true; + + var referenceName = ReferenceName; + if (referenceName == null) + return false; + + if (referenceName.Qualifier != null) + return false; + + var name = referenceName.ShortName; + if (!name.IsEmpty() && name[0].IsLowerFast()) + return true; + + var idOffset = GetNameIdentifierRange().StartOffset.Offset; + return FSharpFile.GetSymbolUse(idOffset) == null; + } + } + public IEnumerable Declarations => new[] {this}; public override TreeTextRange GetNameIdentifierRange() => diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/TopPatternDeclarationBase.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/TopPatternDeclarationBase.cs index 95e6dcb730..6f777a77a8 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/TopPatternDeclarationBase.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/TopPatternDeclarationBase.cs @@ -59,7 +59,7 @@ protected override IDeclaredElement CreateDeclaredElement() if (typeDeclaration is IFSharpTypeDeclaration) { if ((!mfv.CurriedParameterGroups.IsEmpty() || !mfv.GenericParameters.IsEmpty()) && !mfv.IsMutable) - return new FSharpTypePrivateMethod(this, mfv); + return new FSharpTypePrivateMethod(this); if (mfv.LiteralValue != null) return new FSharpLiteral(this); @@ -74,8 +74,8 @@ protected override IDeclaredElement CreateDeclaredElement() return new ModuleValue(this, mfv); return !mfv.IsInstanceMember && mfv.CompiledName.StartsWith("op_", StringComparison.Ordinal) - ? (IDeclaredElement) new FSharpSignOperator(this, mfv) - : new ModuleFunction(this, mfv); + ? (IDeclaredElement) new FSharpSignOperator(this) + : new ModuleFunction(this); } } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/TypeExtensionDeclaration.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/TypeExtensionDeclaration.cs index eab8c09e89..b5d6680355 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/TypeExtensionDeclaration.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/TypeExtensionDeclaration.cs @@ -1,8 +1,11 @@ +using System.Collections.Generic; using JetBrains.Annotations; using JetBrains.ReSharper.Plugins.FSharp.Psi.Resolve; using JetBrains.ReSharper.Plugins.FSharp.Psi.Tree; using JetBrains.ReSharper.Plugins.FSharp.Util; +using JetBrains.ReSharper.Psi; using JetBrains.ReSharper.Psi.Tree; +using JetBrains.Util; namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree { @@ -54,5 +57,25 @@ private TypeAugmentation TypeAugmentation IFSharpReferenceOwner IFSharpReferenceOwner.SetName(string name) => FSharpImplUtil.SetName(this, name); + + public bool IsQualified => QualifierReferenceName != null; + public FSharpSymbolReference QualifierReference => QualifierReferenceName?.Reference; + + public IList Names + { + get + { + var qualifierReferenceName = QualifierReferenceName; + if (qualifierReferenceName == null) + return new[] {SourceName}; + + var names = qualifierReferenceName.Names.AsList(); + names.Add(SourceName); + return names; + } + } + + public void SetQualifier(IClrDeclaredElement declaredElement) => + this.SetQualifier(this.CreateElementFactory().CreateTypeReferenceName, declaredElement); } } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Parsing/FSharpTokenType.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Parsing/FSharpTokenType.cs index d0ae6e9450..6798e99b8e 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Parsing/FSharpTokenType.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Parsing/FSharpTokenType.cs @@ -17,9 +17,15 @@ public FSharpTokenNodeType(string name, int index) : base(name, index) TokenRepresentation = name; } + public FSharpTokenNodeType(string name, int index, string representation) : base(name, index) + { + FSharpNodeTypeIndexer.Instance.Add(this, index); + TokenRepresentation = representation; + } + public override LeafElementBase Create(string text) { - if (Identifiers[this]) + if (CreateIdentifierTokenTypes[this]) return new FSharpIdentifierToken(this, text); if (IsComment) @@ -126,6 +132,7 @@ public BlockCommentNodeType(int nodeTypeIndex) : base("BLOCK_COMMENT", nodeTypeI public static readonly NodeTypeSet Identifiers; public static readonly NodeTypeSet Strings; public static readonly NodeTypeSet Literals; + public static readonly NodeTypeSet CreateIdentifierTokenTypes; static FSharpTokenType() { @@ -253,6 +260,17 @@ static FSharpTokenType() BIGNUM, NATIVEINT, UNATIVEINT); + + CreateIdentifierTokenTypes = new NodeTypeSet( + IDENTIFIER, + SYMBOLIC_OP, + AMP_AMP, + GREATER, + PLUS, + MINUS, + LESS, + LPAREN_STAR_RPAREN, + GLOBAL); } } } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Parsing/FSharpTokens.xml b/ReSharper.FSharp/src/FSharp.Psi/src/Parsing/FSharpTokens.xml index 5c0c22a825..41200047f5 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Parsing/FSharpTokens.xml +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Parsing/FSharpTokens.xml @@ -31,7 +31,6 @@ - @@ -155,6 +154,7 @@ + diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Parsing/IFSharpParser.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Parsing/IFSharpParser.cs index 65fcbcbedd..f72b5ef596 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Parsing/IFSharpParser.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Parsing/IFSharpParser.cs @@ -6,7 +6,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Parsing { public interface IFSharpParser : IParser { - IFSharpFile ParseFSharpFile(); - ISynExpr ParseExpression(IChameleonExpression chameleonExpression, IDocument document = null); + IFSharpFile ParseFSharpFile(bool noCache); + IFSharpExpression ParseExpression(IChameleonExpression chameleonExpression, IDocument document = null); } } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Parsing/Lexing/fsharpLexer.lex b/ReSharper.FSharp/src/FSharp.Psi/src/Parsing/Lexing/fsharpLexer.lex index ed8909c12b..dd19991c4d 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Parsing/Lexing/fsharpLexer.lex +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Parsing/Lexing/fsharpLexer.lex @@ -92,7 +92,7 @@ HEXGRAPH_SHORT=\\x{HEXDIGIT}{HEXDIGIT} UNICODEGRAPH_SHORT=\\u{HEXDIGIT}{HEXDIGIT}{HEXDIGIT}{HEXDIGIT} UNICODEGRAPH_LONG=\\U{HEXDIGIT}{HEXDIGIT}{HEXDIGIT}{HEXDIGIT}{HEXDIGIT}{HEXDIGIT}{HEXDIGIT}{HEXDIGIT} TRIGRAPH=\\{DIGIT}{DIGIT}{DIGIT} -CHARACTER=({SIMPLE_CHARACTER}|{ESCAPE_CHAR}|{TRIGRAPH}|{UNICODEGRAPH_SHORT}|{HEXGRAPH_SHORT}|{UNICODEGRAPH_LONG}|\") +CHARACTER=({SIMPLE_CHARACTER}|{ESCAPE_CHAR}|{TRIGRAPH}|{UNICODEGRAPH_SHORT}|{HEXGRAPH_SHORT}|{UNICODEGRAPH_LONG}|\"|\') STRING_CHAR=({SIMPLE_STRING_CHAR}|{ESCAPE_CHAR}|{NON_ESCAPE_CHARS}|{TRIGRAPH}|{UNICODEGRAPH_SHORT}|{UNICODEGRAPH_LONG}|\') CHARACTER_LITERAL=(\'{CHARACTER}\') UNFINISHED_STRING=(\"({STRING_CHAR})*) diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Parsing/ParserMessages.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Parsing/ParserMessages.cs index 54697f3b60..cc9085a6c3 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Parsing/ParserMessages.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Parsing/ParserMessages.cs @@ -22,14 +22,14 @@ public class ParserMessages public const string IDS_OBJECT_MODEL_TYPE_DECLARATION = ""; public const string IDS_INHERIT_MEMBER = ""; public const string IDS_CONSTRUCTOR_DECLARATION = ""; - public const string IDS_MEMBER_PARAM_DECLARATION_GROUP = ""; + public const string IDS_MEMBER_PARAMS_DECLARATION = ""; public const string IDS_MEMBER_KEYWORD = ""; public const string IDS_SELF_ID = ""; public const string IDS_MODIFIER = ""; public const string IDS_NOT_COMPILED_TYPE_DECLARATION = ""; public const string IDS_SIMPLE_TYPE_DECLARATION = ""; public const string IDS_HASH_DIRECTIVE = ""; - public const string IDS_SYN_PAT = ""; + public const string IDS_F_SHARP_PATTERN = ""; public const string IDS_CONST_PAT = ""; public const string IDS_F_SHARP_IDENTIFIER = ""; public const string IDS_REFERENCE_PAT = ""; @@ -43,7 +43,7 @@ public class ParserMessages public const string IDS_IDENT_OR_OP_NAME = ""; public const string IDS_ACTIVE_PATTERN_CASE_DECLARATION = ""; public const string IDS_ACTIVE_PATTERN_NAMED_CASE_DECLARATION = ""; - public const string IDS_SYN_EXPR = ""; + public const string IDS_F_SHARP_EXPRESSION = ""; public const string IDS_CONST_EXPR = ""; public const string IDS_DO_LIKE_EXPR = ""; public const string IDS_FOR_LIKE_EXPR = ""; @@ -51,7 +51,9 @@ public class ParserMessages public const string IDS_APP_LIKE_EXPR = ""; public const string IDS_TYPED_LIKE_EXPR = ""; public const string IDS_LITERAL_EXPR = ""; + public const string IDS_ARRAY_OR_LIST_LIKE_EXPR = ""; public const string IDS_ARRAY_OR_LIST_EXPR = ""; + public const string IDS_ARRAY_OR_LIST_COMPREHENSION_EXPR_CLAUSE = ""; public const string IDS_QUALIFIED_EXPR = ""; public const string IDS_INDEXER_EXPR = ""; public const string IDS_INDEXER_ARG_LIST = ""; @@ -65,7 +67,7 @@ public class ParserMessages public const string IDS_TRY_LIKE_EXPR = ""; public const string IDS_SET_EXPR = ""; public const string IDS_CAST_EXPR = ""; - public const string IDS_SYN_TYPE = ""; + public const string IDS_TYPE_USAGE = ""; public const string IDS_LET_OR_USE = ""; public const string IDS_LET_OR_USE_BANG = ""; public const string IDS_REFERENCE_NAME = ""; @@ -75,9 +77,11 @@ public class ParserMessages public const string IDS_PREFIX_APP_TYPE_ARGUMENT_LIST = ""; public const string IDS_POSTFIX_APP_TYPE_ARGUMENT_LIST = ""; public const string IDS_FOR_EACH_IN_CLAUSE = ""; + public const string IDS_FOR_EACH_BODY_SEPARATOR = ""; public const string IDS_CONDITION_OWNER_EXPR = ""; public const string IDS_IF_EXPR = ""; public const string IDS_ELSE_CLAUSE = ""; + public const string IDS_RECORD_LIKE_EXPR = ""; public static string GetString(string id) => id; public static string GetExpectedMessage(string s) => string.Empty; diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Parsing/TreeBuilderBase.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Parsing/TreeBuilderBase.cs index 5e77150b01..9502c330a9 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Parsing/TreeBuilderBase.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Parsing/TreeBuilderBase.cs @@ -43,7 +43,7 @@ public LeafElementBase CreateToken(TokenNodeType tokenType, IBuffer buffer, int return tokenType.Create(null); var text = - FSharpTokenType.Identifiers[tokenType] || tokenType.IsWhitespace + FSharpTokenType.CreateIdentifierTokenTypes[tokenType] || tokenType.IsWhitespace ? myIdentifierIntern.Intern(buffer, startOffset, endOffset) : buffer.GetText(new TextRange(startOffset, endOffset)); return tokenType.Create(text); diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Resolve/CtorTypeReference.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Resolve/CtorReference.cs similarity index 100% rename from ReSharper.FSharp/src/FSharp.Psi/src/Resolve/CtorTypeReference.cs rename to ReSharper.FSharp/src/FSharp.Psi/src/Resolve/CtorReference.cs diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Resolve/FSharpModuleResolvedSymbols.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Resolve/FSharpModuleResolvedSymbols.cs index ecdf580387..0b926f0d42 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Resolve/FSharpModuleResolvedSymbols.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Resolve/FSharpModuleResolvedSymbols.cs @@ -11,25 +11,25 @@ public class FSharpModuleResolvedSymbols : IFSharpModuleResolvedSymbols public IPsiModule PsiModule { get; } public FSharpCheckerService CheckerService { get; } - public IFSharpProjectOptionsProvider ProjectOptionsProvider { get; } + public IFcsProjectProvider FcsProjectProvider { get; } private readonly JetFastSemiReenterableRWLock myLock = new JetFastSemiReenterableRWLock(); public FSharpModuleResolvedSymbols(IPsiModule psiModule, int filesCount, FSharpCheckerService checkerService, - IFSharpProjectOptionsProvider projectOptionsProvider) + IFcsProjectProvider fcsProjectProvider) { myFileResolvedSymbols = new FSharpFileResolvedSymbols[filesCount]; PsiModule = psiModule; CheckerService = checkerService; - ProjectOptionsProvider = projectOptionsProvider; + FcsProjectProvider = fcsProjectProvider; } public void Invalidate(IPsiSourceFile sourceFile) { using (myLock.UsingWriteLock()) { - var fileIndex = ProjectOptionsProvider.GetFileIndex(sourceFile); + var fileIndex = FcsProjectProvider.GetFileIndex(sourceFile); if (fileIndex == -1) return; @@ -47,7 +47,7 @@ private FSharpFileResolvedSymbols TryGetResolvedSymbols(int fileIndex) public IFSharpFileResolvedSymbols GetResolvedSymbols(IPsiSourceFile sourceFile) { - var fileIndex = ProjectOptionsProvider.GetFileIndex(sourceFile); + var fileIndex = FcsProjectProvider.GetFileIndex(sourceFile); var fileResolvedSymbols = TryGetResolvedSymbols(fileIndex); if (fileResolvedSymbols != null) return fileResolvedSymbols; diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Resolve/FSharpParameterUtil.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Resolve/FSharpParameterUtil.cs index 6057e2c752..f1823074e6 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Resolve/FSharpParameterUtil.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Resolve/FSharpParameterUtil.cs @@ -22,7 +22,7 @@ public static IDeclaredElement GetOwner([NotNull] this FSharpParameter fsParamet if (!(infixAppExpr?.Operator is var funExpr) || funExpr?.GetText() != "=") return null; - var innerExpr = (ISynExpr) TupleExprNavigator.GetByExpression(infixAppExpr) ?? infixAppExpr; + var innerExpr = (IFSharpExpression) TupleExprNavigator.GetByExpression(infixAppExpr) ?? infixAppExpr; var parenExpr = ParenExprNavigator.GetByInnerExpression(innerExpr); if (!(PrefixAppExprNavigator.GetByArgumentExpression(parenExpr)?.FunctionExpression is IReferenceExpr expr)) diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Resolve/FSharpResolvedSymbolsCache.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Resolve/FSharpResolvedSymbolsCache.cs index 1750370e10..9b652aa8a5 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Resolve/FSharpResolvedSymbolsCache.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Resolve/FSharpResolvedSymbolsCache.cs @@ -21,19 +21,19 @@ public class FSharpResolvedSymbolsCache : IPsiSourceFileCache, IFSharpResolvedSy { public IPsiModules PsiModules { get; } public FSharpCheckerService CheckerService { get; } - public IFSharpProjectOptionsProvider ProjectOptionsProvider { get; } + public IFcsProjectProvider FcsProjectProvider { get; } private readonly object myLock = new object(); private readonly ISet myDirtyFiles = new HashSet(); public FSharpResolvedSymbolsCache(Lifetime lifetime, FSharpCheckerService checkerService, IPsiModules psiModules, - IFSharpProjectOptionsProvider projectOptionsProvider) + IFcsProjectProvider fcsProjectProvider) { PsiModules = psiModules; CheckerService = checkerService; - ProjectOptionsProvider = projectOptionsProvider; + FcsProjectProvider = fcsProjectProvider; - projectOptionsProvider.ModuleInvalidated.Advise(lifetime, Invalidate); + fcsProjectProvider.ModuleInvalidated.Advise(lifetime, Invalidate); } private static bool IsApplicable(IPsiSourceFile sourceFile) => @@ -54,6 +54,7 @@ private void InvalidateReferencingModules(IPsiModule psiModule) if (myPsiModules.IsEmpty()) return; + // todo: reuse FcsProjectProvider references using (CompilationContextCookie.GetOrCreate(psiModule.GetContextFromModule())) { var resolveContext = CompilationContextCookie.GetContext(); @@ -183,11 +184,11 @@ private IFSharpModuleResolvedSymbols GetModuleResolvedSymbols(IPsiSourceFile sou if (myPsiModules.TryGetValue(psiModule, out var symbols)) return symbols; - var parsingOptions = ProjectOptionsProvider.GetParsingOptions(sourceFile); + var parsingOptions = FcsProjectProvider.GetParsingOptions(sourceFile); var filesCount = parsingOptions.SourceFiles.Length; var moduleResolvedSymbols = - new FSharpModuleResolvedSymbols(psiModule, filesCount, CheckerService, ProjectOptionsProvider); + new FSharpModuleResolvedSymbols(psiModule, filesCount, CheckerService, FcsProjectProvider); myPsiModules[psiModule] = moduleResolvedSymbols; return moduleResolvedSymbols; } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Resolve/FSharpSymbolReference.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Resolve/FSharpSymbolReference.cs index 3897d60f21..c128615d99 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Resolve/FSharpSymbolReference.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Resolve/FSharpSymbolReference.cs @@ -12,6 +12,7 @@ using JetBrains.ReSharper.Resources.Shell; using JetBrains.Util; using JetBrains.Util.DataStructures; +using Microsoft.FSharp.Core; namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Resolve { @@ -34,6 +35,9 @@ public FSharpSymbolUse GetSymbolUse() => public virtual FSharpSymbol GetFSharpSymbol() => GetSymbolUse()?.Symbol; + public FSharpOption TryGetFSharpSymbol() => + OptionModule.OfObj(GetFSharpSymbol()); + public override ResolveResultWithInfo ResolveWithoutCache() { if (!myOwner.IsValid()) @@ -89,7 +93,7 @@ public override IReference BindTo(IDeclaredElement element) return this; using (WriteLockCookie.Create(myOwner.IsPhysical())) - return myOwner.SetName(FSharpBindingUtil.SuggestShortReferenceName(this, element)).Reference; + return myOwner.SetName(FSharpReferenceBindingUtil.SuggestShortReferenceName(this, element)).Reference; } private static bool CanBindTo(IDeclaredElement element) => @@ -105,12 +109,28 @@ public override ISymbolTable GetReferenceSymbolTable(bool useReferenceName) => throw new NotImplementedException(); public bool IsQualified => - GetElement() switch - { - IReferenceExpr referenceExpr => referenceExpr.Qualifier != null, - IReferenceName referenceName => referenceName.Qualifier != null, - ITypeExtensionDeclaration typeExtension => typeExtension.QualifierReferenceName != null, - _ => false - }; + GetElement() is IFSharpQualifiableReferenceOwner referenceOwner && referenceOwner.IsQualified; + + public FSharpSymbolReference QualifierReference => + GetElement() is IFSharpQualifiableReferenceOwner referenceOwner ? referenceOwner.QualifierReference : null; + + public void SetQualifier([NotNull] IClrDeclaredElement declaredElement) + { + if (GetElement() is IFSharpQualifiableReferenceOwner referenceOwner) + referenceOwner.SetQualifier(declaredElement); + } + + /// Does not reuse existing file resolve results, does complete lookup by name. + public FSharpOption ResolveWithFcs([NotNull] string opName, bool qualified = true) + { + var referenceOwner = GetElement(); + var checkerService = referenceOwner.GetFcsCheckerService(); + + var names = qualified && referenceOwner is IFSharpQualifiableReferenceOwner qualifiableReferenceOwner + ? qualifiableReferenceOwner.Names + : new[] {GetName()}; + + return checkerService.ResolveNameAtLocation(referenceOwner, names, opName); + } } } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/AppExprNavigator.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/AppExprNavigator.cs index 8e94ad94cd..ea19908145 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/AppExprNavigator.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/AppExprNavigator.cs @@ -5,12 +5,12 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Tree public partial class AppExprNavigator { [CanBeNull] - public static IAppExpr GetByArgument([CanBeNull] ISynExpr param) => + public static IAppExpr GetByArgument([CanBeNull] IFSharpExpression param) => (IAppExpr) BinaryAppExprNavigator.GetByArgument(param) ?? PrefixAppExprNavigator.GetByArgumentExpression(param); [CanBeNull] - public static IAppExpr GetByRightArgument([CanBeNull] ISynExpr param) => + public static IAppExpr GetByRightArgument([CanBeNull] IFSharpExpression param) => (IAppExpr) BinaryAppExprNavigator.GetByRightArgument(param) ?? PrefixAppExprNavigator.GetByArgumentExpression(param); } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/BinaryAppExprNavigator.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/BinaryAppExprNavigator.cs index f4e836ba05..890e4459b7 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/BinaryAppExprNavigator.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/BinaryAppExprNavigator.cs @@ -5,7 +5,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Tree public partial class BinaryAppExprNavigator { [CanBeNull] - public static IBinaryAppExpr GetByArgument([CanBeNull] ISynExpr param) => + public static IBinaryAppExpr GetByArgument([CanBeNull] IFSharpExpression param) => GetByLeftArgument(param) ?? GetByRightArgument(param); } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/ConditionOwnerExprNavigator.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/ConditionOwnerExprNavigator.cs index aa582ad019..6c595da407 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/ConditionOwnerExprNavigator.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/ConditionOwnerExprNavigator.cs @@ -5,7 +5,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Tree public partial class ConditionOwnerExprNavigator { [CanBeNull] - public static IConditionOwnerExpr GetByExpr([CanBeNull] ISynExpr param) => + public static IConditionOwnerExpr GetByExpr([CanBeNull] IFSharpExpression param) => (IConditionOwnerExpr) IfThenElseExprNavigator.GetByExpression(param) ?? WhileExprNavigator.GetByExpression(param); } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/FSharpArgumentsOwnerNavigator.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/FSharpArgumentsOwnerNavigator.cs new file mode 100644 index 0000000000..235affd42f --- /dev/null +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/FSharpArgumentsOwnerNavigator.cs @@ -0,0 +1,11 @@ +using JetBrains.Annotations; + +namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Tree +{ + public class FSharpArgumentOwnerNavigator + { + public static IFSharpArgumentsOwner GetByArgumentExpression([CanBeNull] IFSharpExpression param) => + (IFSharpArgumentsOwner)AppLikeExprNavigator.GetByArgumentExpression(param) ?? + AttributeNavigator.GetByExpression(param); + } +} diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/FSharpReferenceOwnerNavigator.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/FSharpReferenceOwnerNavigator.cs index f66e56b1fb..6274c7fd1b 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/FSharpReferenceOwnerNavigator.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/FSharpReferenceOwnerNavigator.cs @@ -5,7 +5,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Tree public static class FSharpReferenceOwnerNavigator { public static IFSharpReferenceOwner GetByQualifier([CanBeNull] IFSharpReferenceOwner param) => - ReferenceExprNavigator.GetByQualifier(param as ISynExpr) ?? + ReferenceExprNavigator.GetByQualifier(param as IFSharpExpression) ?? (IFSharpReferenceOwner) ReferenceNameNavigator.GetByQualifier(param as IReferenceName) ?? TypeExtensionDeclarationNavigator.GetByQualifierReferenceName(param as IReferenceName); diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/ForEachExprNavigator.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/ForEachExprNavigator.cs deleted file mode 100644 index 8c4522cc72..0000000000 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/ForEachExprNavigator.cs +++ /dev/null @@ -1,13 +0,0 @@ -using JetBrains.Annotations; - -namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -{ - public partial class ForEachExprNavigator - { - [CanBeNull] - public static IForEachExpr GetByInExpression([CanBeNull] ISynExpr param) => - param?.Parent is IForEachExpr forEachExpr && forEachExpr.InClause == param - ? forEachExpr - : null; - } -} diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/ForLikeExprNavigator.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/ForLikeExprNavigator.cs index 0a1946ce86..6654ed849f 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/ForLikeExprNavigator.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/ForLikeExprNavigator.cs @@ -5,7 +5,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Tree public partial class ForLikeExprNavigator { [CanBeNull] - public static IForLikeExpr GetByInExpression([CanBeNull] ISynExpr param) => + public static IForLikeExpr GetByInExpression([CanBeNull] IFSharpExpression param) => ForExprNavigator.GetByIdentExpression(param) ?? (IForLikeExpr) ForExprNavigator.GetByToExpression(param) ?? ForEachExprNavigator.GetByInExpression(param); diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IAppExpr.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IAppExpr.cs index e4f629256a..ae33d0ee37 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IAppExpr.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IAppExpr.cs @@ -1,6 +1,6 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Tree { - public partial interface IAppExpr : ISynExpr + public partial interface IAppExpr : IFSharpExpression { } } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IAppLikeExpr.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IAppLikeExpr.cs new file mode 100644 index 0000000000..73d2f51ca9 --- /dev/null +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IAppLikeExpr.cs @@ -0,0 +1,6 @@ +namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Tree +{ + public partial interface IAppLikeExpr : IFSharpArgumentsOwner + { + } +} diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IAttribute.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IAttribute.cs index 3abd063839..71f7f78a02 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IAttribute.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IAttribute.cs @@ -1,6 +1,6 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Tree { - public partial interface IAttribute : IFSharpReferenceOwner + public partial interface IAttribute : IFSharpArgumentsOwner { } } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IFSharpArgumentsOwner.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IFSharpArgumentsOwner.cs new file mode 100644 index 0000000000..46a805ab59 --- /dev/null +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IFSharpArgumentsOwner.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; +using JetBrains.ReSharper.Psi.Tree; + +namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Tree +{ + public interface IFSharpArgumentsOwner : IArgumentsOwner, IFSharpReferenceOwner + { + /// List of arguments aligned with their matching parameter. + /// e.g. index #2 is the argument that matches with param #2 on the invoked reference. + /// A null element at a given index means there is no argument matching that parameter. + IList ParameterArguments { get; } + } +} diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/ISynPat.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IFSharpPattern.cs similarity index 86% rename from ReSharper.FSharp/src/FSharp.Psi/src/Tree/ISynPat.cs rename to ReSharper.FSharp/src/FSharp.Psi/src/Tree/IFSharpPattern.cs index 9d74d175e5..7041615295 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/ISynPat.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IFSharpPattern.cs @@ -3,7 +3,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Tree { - public partial interface ISynPat + public partial interface IFSharpPattern { bool IsDeclaration { get; } IEnumerable Declarations { get; } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IFSharpReferenceOwner.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IFSharpReferenceOwner.cs index f8f248ec72..c26f11a608 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IFSharpReferenceOwner.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IFSharpReferenceOwner.cs @@ -1,6 +1,12 @@ +using System; +using System.Collections.Generic; using JetBrains.Annotations; +using JetBrains.Diagnostics; +using JetBrains.ReSharper.Plugins.FSharp.Psi.Impl; +using JetBrains.ReSharper.Plugins.FSharp.Psi.Parsing; using JetBrains.ReSharper.Plugins.FSharp.Psi.Resolve; -using JetBrains.ReSharper.Psi.Tree; +using JetBrains.ReSharper.Psi; +using JetBrains.ReSharper.Psi.ExtensionsAPI.Tree; namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Tree { @@ -13,4 +19,28 @@ public interface IFSharpReferenceOwner : IFSharpTreeNode [NotNull] IFSharpReferenceOwner SetName([NotNull] string name); } + + public interface IFSharpQualifiableReferenceOwner : IFSharpReferenceOwner + { + IList Names { get; } + FSharpSymbolReference QualifierReference { get; } + bool IsQualified { get; } + void SetQualifier([NotNull] IClrDeclaredElement declaredElement); + } + + public static class FSharpQualifiableReferenceOwnerExtensions + { + public static void SetQualifier([NotNull] this IFSharpQualifiableReferenceOwner referenceOwner, + [NotNull] Func factory, [NotNull] IClrDeclaredElement declaredElement) + { + var identifier = referenceOwner.FSharpIdentifier; + Assertion.Assert(identifier != null, "referenceOwner.FSharpIdentifier != null"); + + // todo: type args + var name = FSharpReferenceBindingUtil.SuggestShortReferenceName(declaredElement, referenceOwner.Language); + var delimiter = ModificationUtil.AddChildBefore(identifier, FSharpTokenType.DOT.CreateLeafElement()); + var qualifier = ModificationUtil.AddChildBefore(delimiter, factory(name)); + FSharpReferenceBindingUtil.SetRequiredQualifiers(qualifier.Reference, declaredElement); + } + } } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IForEachExpr.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IForEachExpr.cs new file mode 100644 index 0000000000..375c2f8ef9 --- /dev/null +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IForEachExpr.cs @@ -0,0 +1,7 @@ +namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Tree +{ + public partial interface IForEachExpr + { + bool IsYieldExpression { get; } + } +} diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/ILet.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/ILet.cs deleted file mode 100644 index eb514284da..0000000000 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/ILet.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -{ - public partial interface ILet - { - bool IsUse { get; } - } -} diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/ILetBindings.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/ILetBindings.cs index a35c5f27c5..439a9b7ba7 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/ILetBindings.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/ILetBindings.cs @@ -2,6 +2,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Tree { public partial interface ILetBindings { + bool IsUse { get; } bool IsRecursive { get; } void SetIsRecursive(bool value); } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/ILetLikeExpr.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/ILetLikeExpr.cs deleted file mode 100644 index a0681c0fb9..0000000000 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/ILetLikeExpr.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -{ - public partial interface ILetLikeExpr : ILet - { - } -} diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IPrefixAppExpr.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IPrefixAppExpr.cs index e4759ccec4..4ed02014f7 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IPrefixAppExpr.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IPrefixAppExpr.cs @@ -1,13 +1,15 @@ -using System.Collections.Generic; +using System; using JetBrains.Annotations; using JetBrains.ReSharper.Plugins.FSharp.Psi.Resolve; +using JetBrains.ReSharper.Psi; using JetBrains.ReSharper.Psi.Tree; namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Tree { public partial interface IPrefixAppExpr { + [CanBeNull] IReferenceExpr InvokedReferenceExpression { get; } + [CanBeNull] FSharpSymbolReference InvokedFunctionReference { get; } - [NotNull] IList Arguments { get; } } } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IReferenceExpr.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IReferenceExpr.cs index afc67606f9..fee99c43f7 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IReferenceExpr.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IReferenceExpr.cs @@ -2,7 +2,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Tree { - public partial interface IReferenceExpr : IFSharpReferenceOwner, ITypeArgumentOwner + public partial interface IReferenceExpr : IFSharpQualifiableReferenceOwner, ITypeArgumentOwner { [NotNull] string ShortName { get; } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IReferenceName.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IReferenceName.cs index 5581788542..fce0c98abd 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IReferenceName.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IReferenceName.cs @@ -1,12 +1,10 @@ -using System.Collections.Generic; using JetBrains.Annotations; namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Tree { - public partial interface IReferenceName : IFSharpReferenceOwner, ITypeArgumentOwner + public partial interface IReferenceName : IFSharpQualifiableReferenceOwner, ITypeArgumentOwner { [NotNull] string ShortName { get; } [NotNull] string QualifiedName { get; } - IList Names { get; } } } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/ISynExpr.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/ISynExpr.cs index 4e88f1fc1b..7cf8c5a948 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/ISynExpr.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/ISynExpr.cs @@ -2,7 +2,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Tree { - public partial interface ISynExpr : IExpression + public partial interface IFSharpExpression : IExpression { } } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/ITypeExtensionDeclaration.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/ITypeExtensionDeclaration.cs index 613c382d07..1dabe57d40 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/ITypeExtensionDeclaration.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/ITypeExtensionDeclaration.cs @@ -1,6 +1,6 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Tree { - public partial interface ITypeExtensionDeclaration : IFSharpReferenceOwner + public partial interface ITypeExtensionDeclaration : IFSharpQualifiableReferenceOwner { bool IsTypePartDeclaration { get; } bool IsTypeExtensionAllowed { get; } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IfThenElseExprNavigator.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IfThenElseExprNavigator.cs index 82950a7525..c7fb14776e 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IfThenElseExprNavigator.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IfThenElseExprNavigator.cs @@ -5,11 +5,11 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Tree public partial class IfThenElseExprNavigator { [CanBeNull] - public static IIfThenElseExpr GetByExpression([CanBeNull] ISynExpr param) => + public static IIfThenElseExpr GetByExpression([CanBeNull] IFSharpExpression param) => GetByConditionExpr(param) ?? GetByBranchExpression(param); [CanBeNull] - public static IIfThenElseExpr GetByBranchExpression([CanBeNull] ISynExpr param) => + public static IIfThenElseExpr GetByBranchExpression([CanBeNull] IFSharpExpression param) => GetByThenExpr(param) ?? GetByElseExpr(param); } } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/PrefixAppExprNavigator.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/PrefixAppExprNavigator.cs index 5348e44014..17c32254bd 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/PrefixAppExprNavigator.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/PrefixAppExprNavigator.cs @@ -5,7 +5,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Tree public partial class PrefixAppExprNavigator { [CanBeNull] - public static IPrefixAppExpr GetByExpression([CanBeNull] ISynExpr param) => + public static IPrefixAppExpr GetByExpression([CanBeNull] IFSharpExpression param) => GetByFunctionExpression(param) ?? GetByArgumentExpression(param); } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/WhileExprNavigator.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/WhileExprNavigator.cs index a3af9d8bef..41137b018d 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/WhileExprNavigator.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/WhileExprNavigator.cs @@ -5,7 +5,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Tree public partial class WhileExprNavigator { [CanBeNull] - public static IWhileExpr GetByExpression([CanBeNull] ISynExpr param) => + public static IWhileExpr GetByExpression([CanBeNull] IFSharpExpression param) => GetByConditionExpr(param) ?? GetByDoExpression(param); } } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Util/FSharpElementsUtil.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Util/FSharpElementsUtil.cs index d5c6917148..572054e288 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Util/FSharpElementsUtil.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Util/FSharpElementsUtil.cs @@ -58,7 +58,7 @@ public static ITypeElement GetTypeElement([NotNull] this FSharpEntity entity, [N // Happens when there are an exception and a module with the same name. // It's now allowed, but we want keep resolve working where possible. if (typeElement is IFSharpDeclaredElement) - return isModule == typeElement is IModule; + return isModule == typeElement is IFSharpModule; return true; }); @@ -136,7 +136,7 @@ public static IDeclaredElement GetDeclaredElement([CanBeNull] this FSharpSymbol if (declaration is IFSharpLocalDeclaration localDeclaration) return localDeclaration; - return declaration is ISynPat + return declaration is IFSharpPattern ? declaration.DeclaredElement : null; } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Util/FSharpNamesUtil.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Util/FSharpNamesUtil.cs index 2840e299b5..50598008bc 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Util/FSharpNamesUtil.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Util/FSharpNamesUtil.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using JetBrains.Annotations; @@ -48,10 +48,10 @@ public static IEnumerable GetPossibleSourceNames([NotNull] IDeclaredElem if (element is IAttributesOwner attrOwner) { - if (GetAttributeValue(attrOwner, SourceNameAttrTypeName) is string sourceName) + if (GetAttributeFirstArgValue(attrOwner, SourceNameAttrTypeName) is string sourceName) names.Add(sourceName); - if (GetAttributeValue(attrOwner, CompilationMappingAttrTypeName) is var flagValue && flagValue != null) + if (GetAttributeFirstArgValue(attrOwner, CompilationMappingAttrTypeName) is var flagValue && flagValue != null) { if ((SourceConstructFlags) flagValue == SourceConstructFlags.UnionCase && element is IMethod && name.StartsWith("New", StringComparison.Ordinal)) @@ -75,7 +75,7 @@ private static void GetPossibleSourceNames(ITypeElement type, ISet names } [CanBeNull] - private static object GetAttributeValue([NotNull] IAttributesSet attrs, [NotNull] IClrTypeName attrName) + public static object GetAttributeFirstArgValue([NotNull] this IAttributesSet attrs, [NotNull] IClrTypeName attrName) { var instance = attrs.GetAttributeInstances(attrName, false).FirstOrDefault(); var parameter = instance?.PositionParameters().FirstOrDefault(); diff --git a/ReSharper.FSharp/src/Services.FSharp/Services.FSharp.csproj b/ReSharper.FSharp/src/Services.FSharp/Services.FSharp.csproj index 03412bfe3b..03b2cf162d 100644 --- a/ReSharper.FSharp/src/Services.FSharp/Services.FSharp.csproj +++ b/ReSharper.FSharp/src/Services.FSharp/Services.FSharp.csproj @@ -3,6 +3,7 @@ net461 JetBrains.ReSharper.Plugins.FSharp.Services.Cs JetBrains.ReSharper.Plugins.FSharp.Services.Cs + latest @@ -14,4 +15,4 @@ - \ No newline at end of file + diff --git a/ReSharper.FSharp/src/Services.FSharp/src/ParameterInfo/FSharpParameterInfoContextFactory.cs b/ReSharper.FSharp/src/Services.FSharp/src/ParameterInfo/FSharpParameterInfoContextFactory.cs index b8827abb12..4dee236321 100644 --- a/ReSharper.FSharp/src/Services.FSharp/src/ParameterInfo/FSharpParameterInfoContextFactory.cs +++ b/ReSharper.FSharp/src/Services.FSharp/src/ParameterInfo/FSharpParameterInfoContextFactory.cs @@ -50,8 +50,10 @@ public IParameterInfoContext CreateContext(ISolution solution, DocumentOffset ca var paramInfoLocations = paramInfoLocationsOption.Value; var names = paramInfoLocations.LongId; var lidEnd = paramInfoLocations.LongIdEndLocation; + + using var op = fsFile.CheckerService.FcsReactorMonitor.MonitorOperation(OpName); var getMethodsAsync = - checkResults.GetMethods(lidEnd.Line, lidEnd.Column, string.Empty, OptionModule.OfObj(names), FSharpOption.None); + checkResults.GetMethods(lidEnd.Line, lidEnd.Column, string.Empty, OptionModule.OfObj(names), FSharpOption.Some(op.OperationName)); // do not show when no overloads are found or got an operator info // github.com/Microsoft/visualfsharp/blob/Visual-Studio-2017/vsintegration/src/FSharp.LanguageService/Intellisense.fs#L274 @@ -106,4 +108,4 @@ public bool IsIntellisenseEnabled(ISolution solution, IContextBoundSettingsStore public PsiLanguageType Language => FSharpLanguage.Instance; public IEnumerable ImportantChars => new[] {'(', ')', ',', '<', '>'}; } -} \ No newline at end of file +} diff --git a/ReSharper.FSharp/test/data/assemblies/ImplicitModule.dll b/ReSharper.FSharp/test/data/assemblies/ImplicitModule.dll new file mode 100644 index 0000000000..c195fbc4f3 Binary files /dev/null and b/ReSharper.FSharp/test/data/assemblies/ImplicitModule.dll differ diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 01 - No arguments.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 01 - No arguments.fs new file mode 100644 index 0000000000..1b62bcc3e0 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 01 - No arguments.fs @@ -0,0 +1,4 @@ +let add () = + "hello there" + +let l = fun () -> "hello there" diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 01 - No arguments.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 01 - No arguments.fs.gold new file mode 100644 index 0000000000..1cb0ef0663 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 01 - No arguments.fs.gold @@ -0,0 +1,6 @@ +let add () = + "hello there" + +let l = fun () -> "hello there" + +--------------------------------------------------------- diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 02 - Curried arguments.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 02 - Curried arguments.fs new file mode 100644 index 0000000000..5bbe44c611 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 02 - Curried arguments.fs @@ -0,0 +1,4 @@ +let add x y = + x + y + +let x = fun x y -> x + y diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 02 - Curried arguments.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 02 - Curried arguments.fs.gold new file mode 100644 index 0000000000..83254c5e10 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 02 - Curried arguments.fs.gold @@ -0,0 +1,22 @@ +ShowTypeNameHintsForLambdaExpressionParameters = True +let add x||(0) y||(1) = + x + y + +let x = fun x||(2) y||(3) -> x + y + +--------------------------------------------------------- +(0): ReSharper Parameter Name Hint: : int +(1): ReSharper Parameter Name Hint: : int +(2): ReSharper Parameter Name Hint: : int +(3): ReSharper Parameter Name Hint: : int + +================ +ShowTypeNameHintsForLambdaExpressionParameters = False +let add x||(0) y||(1) = + x + y + +let x = fun x y -> x + y + +--------------------------------------------------------- +(0): ReSharper Parameter Name Hint: : int +(1): ReSharper Parameter Name Hint: : int diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 03 - Generic arguments.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 03 - Generic arguments.fs new file mode 100644 index 0000000000..bb3941e5c6 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 03 - Generic arguments.fs @@ -0,0 +1,4 @@ +let add x y = + 15 + y + +let l = fun x y -> 15 + y diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 03 - Generic arguments.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 03 - Generic arguments.fs.gold new file mode 100644 index 0000000000..eb77a6f698 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 03 - Generic arguments.fs.gold @@ -0,0 +1,10 @@ +let add x||(0) y||(1) = + 15 + y + +let l = fun x||(2) y||(3) -> 15 + y + +--------------------------------------------------------- +(0): ReSharper Parameter Name Hint: : 'a +(1): ReSharper Parameter Name Hint: : int +(2): ReSharper Parameter Name Hint: : 'a +(3): ReSharper Parameter Name Hint: : int diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 04 - Tupled arguments.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 04 - Tupled arguments.fs new file mode 100644 index 0000000000..81ac6f5c66 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 04 - Tupled arguments.fs @@ -0,0 +1,4 @@ +let add (x, y) = + x + y + +let l = fun (x, y) -> x + y diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 04 - Tupled arguments.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 04 - Tupled arguments.fs.gold new file mode 100644 index 0000000000..3e8d30f3e7 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 04 - Tupled arguments.fs.gold @@ -0,0 +1,10 @@ +let add (x||(0), y||(1)) = + x + y + +let l = fun (x||(2), y||(3)) -> x + y + +--------------------------------------------------------- +(0): ReSharper Parameter Name Hint: : int +(1): ReSharper Parameter Name Hint: : int +(2): ReSharper Parameter Name Hint: : int +(3): ReSharper Parameter Name Hint: : int diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 05 - Type annotated - Curried.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 05 - Type annotated - Curried.fs new file mode 100644 index 0000000000..ca61b6d20e --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 05 - Type annotated - Curried.fs @@ -0,0 +1,4 @@ +let subtract x (y : int) = + x - y + +let l = fun x (y: int) -> x - y diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 05 - Type annotated - Curried.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 05 - Type annotated - Curried.fs.gold new file mode 100644 index 0000000000..2e09680225 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 05 - Type annotated - Curried.fs.gold @@ -0,0 +1,19 @@ +ShowTypeNameHintsForImplicitlyTypedVariables = True +let subtract x||(0) (y : int) = + x - y + +let l = fun x||(1) (y: int) -> x - y + +--------------------------------------------------------- +(0): ReSharper Parameter Name Hint: : int +(1): ReSharper Parameter Name Hint: : int + +================ +ShowTypeNameHintsForImplicitlyTypedVariables = False +let subtract x (y : int) = + x - y + +let l = fun x||(0) (y: int) -> x - y + +--------------------------------------------------------- +(0): ReSharper Parameter Name Hint: : int diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 06 - Type annotated - Tupled.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 06 - Type annotated - Tupled.fs new file mode 100644 index 0000000000..f658346e40 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 06 - Type annotated - Tupled.fs @@ -0,0 +1,4 @@ +let subtract (x: int, y) = + x - y + +let l = fun (x: int, y) -> x - y diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 06 - Type annotated - Tupled.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 06 - Type annotated - Tupled.fs.gold new file mode 100644 index 0000000000..e290581470 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 06 - Type annotated - Tupled.fs.gold @@ -0,0 +1,19 @@ +ShowTypeNameHintsForImplicitlyTypedVariables = True +let subtract (x: int, y||(0)) = + x - y + +let l = fun (x: int, y||(1)) -> x - y + +--------------------------------------------------------- +(0): ReSharper Parameter Name Hint: : int +(1): ReSharper Parameter Name Hint: : int + +================ +ShowTypeNameHintsForImplicitlyTypedVariables = False +let subtract (x: int, y) = + x - y + +let l = fun (x: int, y||(0)) -> x - y + +--------------------------------------------------------- +(0): ReSharper Parameter Name Hint: : int diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 07 - Local function.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 07 - Local function.fs new file mode 100644 index 0000000000..e76334a2f1 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 07 - Local function.fs @@ -0,0 +1,4 @@ +let hello () = + let localFunc x y = x + y + let l = fun x y -> x + y + () diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 07 - Local function.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 07 - Local function.fs.gold new file mode 100644 index 0000000000..48d5d33dc3 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 07 - Local function.fs.gold @@ -0,0 +1,10 @@ +let hello () = + let localFunc x||(0) y||(1) = x + y + let l = fun x||(2) y||(3) -> x + y + () + +--------------------------------------------------------- +(0): ReSharper Parameter Name Hint: : int +(1): ReSharper Parameter Name Hint: : int +(2): ReSharper Parameter Name Hint: : int +(3): ReSharper Parameter Name Hint: : int diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 08 - Function arguments.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 08 - Function arguments.fs new file mode 100644 index 0000000000..dc690227f8 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 08 - Function arguments.fs @@ -0,0 +1,3 @@ +let call f x = + let y = f (12, (15, [1; 2; 3])) * 15. + x f diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 08 - Function arguments.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 08 - Function arguments.fs.gold new file mode 100644 index 0000000000..869389b868 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 08 - Function arguments.fs.gold @@ -0,0 +1,7 @@ +let call f x||(0) = + let y||(1) = f (12, (15, [1; 2; 3])) * 15. + x f + +--------------------------------------------------------- +(0): ReSharper Parameter Name Hint: : (int * (int * int list) -> float) -> 'a +(1): ReSharper Parameter Name Hint: : float diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 09 - Pattern match argument.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 09 - Pattern match argument.fs new file mode 100644 index 0000000000..9c09bec7ae --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 09 - Pattern match argument.fs @@ -0,0 +1,3 @@ +type MySingleCaseDu = MySingleCaseDu of int +let addFive (MySingleCaseDu value) = + value + 5 diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 09 - Pattern match argument.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 09 - Pattern match argument.fs.gold new file mode 100644 index 0000000000..66f828647a --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 09 - Pattern match argument.fs.gold @@ -0,0 +1,6 @@ +type MySingleCaseDu = MySingleCaseDu of int +let addFive (MySingleCaseDu value||(0)) = + value + 5 + +--------------------------------------------------------- +(0): ReSharper Parameter Name Hint: : int diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 10 - Arguments in parentheses.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 10 - Arguments in parentheses.fs new file mode 100644 index 0000000000..bab1e26f26 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 10 - Arguments in parentheses.fs @@ -0,0 +1,2 @@ +let addFive (hi) = + hi + 5 diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 10 - Arguments in parentheses.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 10 - Arguments in parentheses.fs.gold new file mode 100644 index 0000000000..f2ec91cc55 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 10 - Arguments in parentheses.fs.gold @@ -0,0 +1,5 @@ +let addFive (hi||(0)) = + hi + 5 + +--------------------------------------------------------- +(0): ReSharper Parameter Name Hint: : int diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 01 - No arguments.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 01 - No arguments.fs new file mode 100644 index 0000000000..4a4b01b354 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 01 - No arguments.fs @@ -0,0 +1,5 @@ +type C () = + member __.Add () = + "hello there" + + member __.LambdaProp = fun () -> "hello there" diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 01 - No arguments.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 01 - No arguments.fs.gold new file mode 100644 index 0000000000..f09843bd5a --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 01 - No arguments.fs.gold @@ -0,0 +1,7 @@ +type C () = + member __.Add () = + "hello there" + + member __.LambdaProp = fun () -> "hello there" + +--------------------------------------------------------- diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 02 - Curried arguments.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 02 - Curried arguments.fs new file mode 100644 index 0000000000..a09e8c1b6f --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 02 - Curried arguments.fs @@ -0,0 +1,5 @@ +type C () = + member __.Add x y = + x + y + + member __.LambdaProp = fun x y -> x + y diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 02 - Curried arguments.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 02 - Curried arguments.fs.gold new file mode 100644 index 0000000000..c090053fe5 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 02 - Curried arguments.fs.gold @@ -0,0 +1,24 @@ +ShowTypeNameHintsForLambdaExpressionParameters = True +type C () = + member __.Add x||(0) y||(1) = + x + y + + member __.LambdaProp = fun x||(2) y||(3) -> x + y + +--------------------------------------------------------- +(0): ReSharper Parameter Name Hint: : int +(1): ReSharper Parameter Name Hint: : int +(2): ReSharper Parameter Name Hint: : int +(3): ReSharper Parameter Name Hint: : int + +================ +ShowTypeNameHintsForLambdaExpressionParameters = False +type C () = + member __.Add x||(0) y||(1) = + x + y + + member __.LambdaProp = fun x y -> x + y + +--------------------------------------------------------- +(0): ReSharper Parameter Name Hint: : int +(1): ReSharper Parameter Name Hint: : int diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 03 - Type annotated - Curried.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 03 - Type annotated - Curried.fs new file mode 100644 index 0000000000..c6c4cf155b --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 03 - Type annotated - Curried.fs @@ -0,0 +1,5 @@ +type C () = + member __.Subtract x (y : int) = + x - y + + member __.LambdaProp = fun x (y: int) -> x - y diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 03 - Type annotated - Curried.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 03 - Type annotated - Curried.fs.gold new file mode 100644 index 0000000000..192b8e313c --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 03 - Type annotated - Curried.fs.gold @@ -0,0 +1,21 @@ +ShowTypeNameHintsForImplicitlyTypedVariables = True +type C () = + member __.Subtract x||(0) (y : int) = + x - y + + member __.LambdaProp = fun x||(1) (y: int) -> x - y + +--------------------------------------------------------- +(0): ReSharper Parameter Name Hint: : int +(1): ReSharper Parameter Name Hint: : int + +================ +ShowTypeNameHintsForImplicitlyTypedVariables = False +type C () = + member __.Subtract x (y : int) = + x - y + + member __.LambdaProp = fun x||(0) (y: int) -> x - y + +--------------------------------------------------------- +(0): ReSharper Parameter Name Hint: : int diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 04 - Type annotated - Tupled.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 04 - Type annotated - Tupled.fs new file mode 100644 index 0000000000..916a6e43c3 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 04 - Type annotated - Tupled.fs @@ -0,0 +1,5 @@ +type C () = + member __.Subtract (x: int, y) = + x - y + + member __.LambdaProp = fun (x: int, y) -> x - y diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 04 - Type annotated - Tupled.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 04 - Type annotated - Tupled.fs.gold new file mode 100644 index 0000000000..46bb7de85c --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 04 - Type annotated - Tupled.fs.gold @@ -0,0 +1,21 @@ +ShowTypeNameHintsForImplicitlyTypedVariables = True +type C () = + member __.Subtract (x: int, y||(0)) = + x - y + + member __.LambdaProp = fun (x: int, y||(1)) -> x - y + +--------------------------------------------------------- +(0): ReSharper Parameter Name Hint: : int +(1): ReSharper Parameter Name Hint: : int + +================ +ShowTypeNameHintsForImplicitlyTypedVariables = False +type C () = + member __.Subtract (x: int, y) = + x - y + + member __.LambdaProp = fun (x: int, y||(0)) -> x - y + +--------------------------------------------------------- +(0): ReSharper Parameter Name Hint: : int diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Nested 01.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Nested 01.fs new file mode 100644 index 0000000000..769eaed874 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Nested 01.fs @@ -0,0 +1,11 @@ +let outerLet = + let myFunc (o: obj) = + match o with + | :? int as i -> + let x = + let myLambda = fun x (y: int) -> x + y + let myValue = 123 + myLambda myValue i + | _ -> 0 + + myFunc 10 diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Nested 01.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Nested 01.fs.gold new file mode 100644 index 0000000000..5de7195f34 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Nested 01.fs.gold @@ -0,0 +1,15 @@ +let outerLet = + let myFunc (o: obj) = + match o with + | :? int as i -> + let x||(0) = + let myLambda = fun x||(1) (y: int) -> x + y + let myValue = 123 + myLambda myValue i + | _ -> 0 + + myFunc 10 + +--------------------------------------------------------- +(0): ReSharper Parameter Name Hint: : int +(1): ReSharper Parameter Name Hint: : int diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 01 - Option.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 01 - Option.fs new file mode 100644 index 0000000000..927e205854 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 01 - Option.fs @@ -0,0 +1,4 @@ +let sayHello nameOpt = + match nameOpt with + | None -> "Hi there" + | Some name -> "Hi, " + name diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 01 - Option.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 01 - Option.fs.gold new file mode 100644 index 0000000000..fa46484b30 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 01 - Option.fs.gold @@ -0,0 +1,19 @@ +ShowTypeNameHintsForPatternMatchingExpressions = True +let sayHello nameOpt||(0) = + match nameOpt with + | None -> "Hi there" + | Some name||(1) -> "Hi, " + name + +--------------------------------------------------------- +(0): ReSharper Parameter Name Hint: : string option +(1): ReSharper Parameter Name Hint: : string + +================ +ShowTypeNameHintsForPatternMatchingExpressions = False +let sayHello nameOpt||(0) = + match nameOpt with + | None -> "Hi there" + | Some name -> "Hi, " + name + +--------------------------------------------------------- +(0): ReSharper Parameter Name Hint: : string option diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 02 - Record.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 02 - Record.fs new file mode 100644 index 0000000000..513e3148a6 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 02 - Record.fs @@ -0,0 +1,7 @@ +type 'a MyRecord = { MyOption : 'a option } + +let run () = + let x = { MyOption = Some 15. } + match x with + | { MyOption = None } -> () + | { MyOption = Some x } -> () diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 02 - Record.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 02 - Record.fs.gold new file mode 100644 index 0000000000..6098e899f3 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 02 - Record.fs.gold @@ -0,0 +1,25 @@ +ShowTypeNameHintsForPatternMatchingExpressions = True +type 'a MyRecord = { MyOption : 'a option } + +let run () = + let x||(0) = { MyOption = Some 15. } + match x with + | { MyOption = None } -> () + | { MyOption = Some x||(1) } -> () + +--------------------------------------------------------- +(0): ReSharper Parameter Name Hint: : float MyRecord +(1): ReSharper Parameter Name Hint: : float + +================ +ShowTypeNameHintsForPatternMatchingExpressions = False +type 'a MyRecord = { MyOption : 'a option } + +let run () = + let x||(0) = { MyOption = Some 15. } + match x with + | { MyOption = None } -> () + | { MyOption = Some x } -> () + +--------------------------------------------------------- +(0): ReSharper Parameter Name Hint: : float MyRecord diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 03 - Wildcard.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 03 - Wildcard.fs new file mode 100644 index 0000000000..2acaa5e3e3 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 03 - Wildcard.fs @@ -0,0 +1,4 @@ +let x = Some "hi there" +match x with +| None -> () +| Some _ -> () diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 03 - Wildcard.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 03 - Wildcard.fs.gold new file mode 100644 index 0000000000..a2701b8147 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 03 - Wildcard.fs.gold @@ -0,0 +1,6 @@ +let x = Some "hi there" +match x with +| None -> () +| Some _ -> () + +--------------------------------------------------------- diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 04 - Function.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 04 - Function.fs new file mode 100644 index 0000000000..c534a09be9 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 04 - Function.fs @@ -0,0 +1,4 @@ +let sayHello = + function + | None -> "Hi there" + | Some n -> "Hi, " + n diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 04 - Function.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 04 - Function.fs.gold new file mode 100644 index 0000000000..97b3139e70 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 04 - Function.fs.gold @@ -0,0 +1,17 @@ +ShowTypeNameHintsForPatternMatchingExpressions = True +let sayHello = + function + | None -> "Hi there" + | Some n||(0) -> "Hi, " + n + +--------------------------------------------------------- +(0): ReSharper Parameter Name Hint: : string + +================ +ShowTypeNameHintsForPatternMatchingExpressions = False +let sayHello = + function + | None -> "Hi there" + | Some n -> "Hi, " + n + +--------------------------------------------------------- diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 05 - Active pattern.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 05 - Active pattern.fs new file mode 100644 index 0000000000..46731f76e9 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 05 - Active pattern.fs @@ -0,0 +1,8 @@ +let (|Parse|_|) pattern input = + if input = pattern then Some [1; 2; 3] + else None + +let parse = + function + | Parse "ints" (x::xs) -> x + List.sum xs + | _ -> 0 diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 05 - Active pattern.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 05 - Active pattern.fs.gold new file mode 100644 index 0000000000..2c4e895387 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 05 - Active pattern.fs.gold @@ -0,0 +1,29 @@ +ShowTypeNameHintsForPatternMatchingExpressions = True +let (|Parse|_|) pattern||(0) input||(1) = + if input = pattern then Some [1; 2; 3] + else None + +let parse = + function + | Parse "ints" (x||(2)::xs) -> x + List.sum xs + | _ -> 0 + +--------------------------------------------------------- +(0): ReSharper Parameter Name Hint: : 'a +(1): ReSharper Parameter Name Hint: : 'a +(2): ReSharper Parameter Name Hint: : int + +================ +ShowTypeNameHintsForPatternMatchingExpressions = False +let (|Parse|_|) pattern||(0) input||(1) = + if input = pattern then Some [1; 2; 3] + else None + +let parse = + function + | Parse "ints" (x::xs) -> x + List.sum xs + | _ -> 0 + +--------------------------------------------------------- +(0): ReSharper Parameter Name Hint: : 'a +(1): ReSharper Parameter Name Hint: : 'a diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 06 - Type match.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 06 - Type match.fs new file mode 100644 index 0000000000..6aeb1f9ead --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 06 - Type match.fs @@ -0,0 +1,4 @@ +let parse (o: obj) = + match o with + | :? int as i -> i + 5 + | _ -> 0 diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 06 - Type match.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 06 - Type match.fs.gold new file mode 100644 index 0000000000..3e80b6519b --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 06 - Type match.fs.gold @@ -0,0 +1,6 @@ +let parse (o: obj) = + match o with + | :? int as i -> i + 5 + | _ -> 0 + +--------------------------------------------------------- diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 07 - Lists and arrays.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 07 - Lists and arrays.fs new file mode 100644 index 0000000000..42208fcbe3 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 07 - Lists and arrays.fs @@ -0,0 +1,8 @@ +let x = + match [1;2] with + | x -> () + | [x] -> () + | [x; y] -> () + | x::y -> () + | x::y::z -> () + | _ -> () diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 07 - Lists and arrays.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 07 - Lists and arrays.fs.gold new file mode 100644 index 0000000000..bb301559e9 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 07 - Lists and arrays.fs.gold @@ -0,0 +1,29 @@ +ShowTypeNameHintsForPatternMatchingExpressions = True +let x = + match [1;2] with + | x||(0) -> () + | [x||(1)] -> () + | [x||(2); y] -> () + | x||(3)::y -> () + | x||(4)::y::z -> () + | _ -> () + +--------------------------------------------------------- +(0): ReSharper Parameter Name Hint: : int list +(1): ReSharper Parameter Name Hint: : int +(2): ReSharper Parameter Name Hint: : int +(3): ReSharper Parameter Name Hint: : int +(4): ReSharper Parameter Name Hint: : int + +================ +ShowTypeNameHintsForPatternMatchingExpressions = False +let x = + match [1;2] with + | x -> () + | [x] -> () + | [x; y] -> () + | x::y -> () + | x::y::z -> () + | _ -> () + +--------------------------------------------------------- diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Value 01 - Literals.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Value 01 - Literals.fs new file mode 100644 index 0000000000..fa565952b1 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Value 01 - Literals.fs @@ -0,0 +1,9 @@ +let run () = + let x = 15 + let y = failwith "" + let z = [1;2;3] + let u = [|1;2;3|] + let ts = 1, "hi", 10. + let disp = { new System.IDisposable with override __.Dispose () = () } + let dispB = disp :> obj + y + "" diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Value 01 - Literals.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Value 01 - Literals.fs.gold new file mode 100644 index 0000000000..3067f58095 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Value 01 - Literals.fs.gold @@ -0,0 +1,34 @@ +HideTypeNameHintsForImplicitlyTypedVariablesWhenTypeIsEvident = True +let run () = + let x = 15 + let y||(0) = failwith "" + let z = [1;2;3] + let u = [|1;2;3|] + let ts = 1, "hi", 10. + let disp = { new System.IDisposable with override __.Dispose () = () } + let dispB = disp :> obj + y + "" + +--------------------------------------------------------- +(0): ReSharper Parameter Name Hint: : string + +================ +HideTypeNameHintsForImplicitlyTypedVariablesWhenTypeIsEvident = False +let run () = + let x||(0) = 15 + let y||(1) = failwith "" + let z||(2) = [1;2;3] + let u||(3) = [|1;2;3|] + let ts||(4) = 1, "hi", 10. + let disp||(5) = { new System.IDisposable with override __.Dispose () = () } + let dispB||(6) = disp :> obj + y + "" + +--------------------------------------------------------- +(0): ReSharper Parameter Name Hint: : int +(1): ReSharper Parameter Name Hint: : string +(2): ReSharper Parameter Name Hint: : int list +(3): ReSharper Parameter Name Hint: : int [] +(4): ReSharper Parameter Name Hint: : int * string * float +(5): ReSharper Parameter Name Hint: : IDisposable +(6): ReSharper Parameter Name Hint: : obj diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Value 02 - Non literals.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Value 02 - Non literals.fs new file mode 100644 index 0000000000..f7a43e7616 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Value 02 - Non literals.fs @@ -0,0 +1,6 @@ +let outer z = + let x = [y; y+2] + let y = [|z; z+1|] + let u = z + 1 + let ts = 1, "hi", u + () diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Value 02 - Non literals.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Value 02 - Non literals.fs.gold new file mode 100644 index 0000000000..36ea7e4199 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Value 02 - Non literals.fs.gold @@ -0,0 +1,13 @@ +let outer z||(0) = + let x||(1) = [y; y+2] + let y||(2) = [|z; z+1|] + let u||(3) = z + 1 + let ts||(4) = 1, "hi", u + () + +--------------------------------------------------------- +(0): ReSharper Parameter Name Hint: : int +(1): ReSharper Parameter Name Hint: : int list +(2): ReSharper Parameter Name Hint: : int [] +(3): ReSharper Parameter Name Hint: : int +(4): ReSharper Parameter Name Hint: : int * string * int diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Value 03 - Pattern match.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Value 03 - Pattern match.fs new file mode 100644 index 0000000000..16a3fe3eff --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Value 03 - Pattern match.fs @@ -0,0 +1,3 @@ +let run () = + let (Some x) = failwith "" + x + 15 diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Value 03 - Pattern match.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Value 03 - Pattern match.fs.gold new file mode 100644 index 0000000000..c7dcce5c1d --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Value 03 - Pattern match.fs.gold @@ -0,0 +1,6 @@ +let run () = + let (Some x||(0)) = failwith "" + x + 15 + +--------------------------------------------------------- +(0): ReSharper Parameter Name Hint: : int diff --git a/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/AutoOpen - Assembly 01.fs b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/AutoOpen - Assembly 01.fs new file mode 100644 index 0000000000..d6d48aaf6d --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/AutoOpen - Assembly 01.fs @@ -0,0 +1,3 @@ +module Module + +Microsoft.FSharp.Collections.Map.empty diff --git a/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/AutoOpen - Assembly 02 - Implicit FSharp.fs b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/AutoOpen - Assembly 02 - Implicit FSharp.fs new file mode 100644 index 0000000000..1c65548553 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/AutoOpen - Assembly 02 - Implicit FSharp.fs @@ -0,0 +1,3 @@ +module Module + +FSharp.Collections.Map.empty diff --git a/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/AutoOpen - Global 01.fs b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/AutoOpen - Global 01.fs new file mode 100644 index 0000000000..19dfaa8473 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/AutoOpen - Global 01.fs @@ -0,0 +1,9 @@ +namespace global +[] +module Nested1 = + type T() = class end + +namespace Ns +module Nested2 = + let t: Nested1.T = Nested1.T() + diff --git a/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/AutoOpen - Global 01.fs.gold b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/AutoOpen - Global 01.fs.gold new file mode 100644 index 0000000000..e80c08bde3 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/AutoOpen - Global 01.fs.gold @@ -0,0 +1,13 @@ +namespace global +[] +module Nested1 = + type T() = class end + +namespace Ns +module Nested2 = + let t: |Nested1.|(0)T = |Nested1.|(1)T() + + +--------------------------------------------------------- +(0): ReSharper Dead Code: Qualifier is redundant +(1): ReSharper Dead Code: Qualifier is redundant diff --git a/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/AutoOpen - Nested 01.fs b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/AutoOpen - Nested 01.fs new file mode 100644 index 0000000000..6a0d3c0c9b --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/AutoOpen - Nested 01.fs @@ -0,0 +1,7 @@ +module TopLevel = + [] + module Nested = + type T() = class end + +open TopLevel +let t: Nested.T = Nested.T() diff --git a/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/AutoOpen - Nested 01.fs.gold b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/AutoOpen - Nested 01.fs.gold new file mode 100644 index 0000000000..16d8daf013 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/AutoOpen - Nested 01.fs.gold @@ -0,0 +1,11 @@ +module TopLevel = + [] + module Nested = + type T() = class end + +open TopLevel +let t: |Nested.|(0)T = |Nested.|(1)T() + +--------------------------------------------------------- +(0): ReSharper Dead Code: Qualifier is redundant +(1): ReSharper Dead Code: Qualifier is redundant diff --git a/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/AutoOpen - Nested 02 - Qualified.fs b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/AutoOpen - Nested 02 - Qualified.fs new file mode 100644 index 0000000000..69b69e5ff9 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/AutoOpen - Nested 02 - Qualified.fs @@ -0,0 +1,9 @@ +module TopLevel + +module Nested1 = + [] + module Nested2 = + type T() = class end + +open Nested1 +let t: Nested1.Nested2.T = Nested1.Nested2.T() diff --git a/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/AutoOpen - Nested 02 - Qualified.fs.gold b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/AutoOpen - Nested 02 - Qualified.fs.gold new file mode 100644 index 0000000000..3f6619202b --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/AutoOpen - Nested 02 - Qualified.fs.gold @@ -0,0 +1,15 @@ +module TopLevel + +module Nested1 = + [] + module Nested2 = + type T() = class end + +open Nested1 +let t: ||Nested1.|(1)Nested2.|(0)T = ||Nested1.|(3)Nested2.|(2)T() + +--------------------------------------------------------- +(0): ReSharper Dead Code: Qualifier is redundant +(1): ReSharper Dead Code: Qualifier is redundant +(2): ReSharper Dead Code: Qualifier is redundant +(3): ReSharper Dead Code: Qualifier is redundant diff --git a/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/AutoOpen 01.fs b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/AutoOpen 01.fs new file mode 100644 index 0000000000..c910a6b5b9 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/AutoOpen 01.fs @@ -0,0 +1,9 @@ +namespace Ns1 +[] +module Nested1 = + let x = 123 + +namespace Ns2 +module Nested2 = + open Ns1 + Nested1.x diff --git a/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/AutoOpen 01.fs.gold b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/AutoOpen 01.fs.gold new file mode 100644 index 0000000000..aff7f01592 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/AutoOpen 01.fs.gold @@ -0,0 +1,12 @@ +namespace Ns1 +[] +module Nested1 = + let x = 123 + +namespace Ns2 +module Nested2 = + open Ns1 + |Nested1.|(0)x + +--------------------------------------------------------- +(0): ReSharper Dead Code: Qualifier is redundant diff --git a/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/AutoOpen 02 - Qualified.fs b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/AutoOpen 02 - Qualified.fs new file mode 100644 index 0000000000..9c2fdff27a --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/AutoOpen 02 - Qualified.fs @@ -0,0 +1,9 @@ +namespace Ns1 +[] +module Nested1 = + let x = 123 + +namespace Ns2 +module Nested2 = + open Ns1 + Ns1.Nested1.x diff --git a/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/AutoOpen 02 - Qualified.fs.gold b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/AutoOpen 02 - Qualified.fs.gold new file mode 100644 index 0000000000..2428f46f54 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/AutoOpen 02 - Qualified.fs.gold @@ -0,0 +1,13 @@ +namespace Ns1 +[] +module Nested1 = + let x = 123 + +namespace Ns2 +module Nested2 = + open Ns1 + ||Ns1.|(1)Nested1.|(0)x + +--------------------------------------------------------- +(0): ReSharper Dead Code: Qualifier is redundant +(1): ReSharper Dead Code: Qualifier is redundant diff --git a/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Compiled names - ModuleSuffix 01.fs b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Compiled names - ModuleSuffix 01.fs new file mode 100644 index 0000000000..22fbc56fb2 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Compiled names - ModuleSuffix 01.fs @@ -0,0 +1,5 @@ +module Module + +open Option + +Option.bind |> ignore diff --git a/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Compiled names - ModuleSuffix 01.fs.gold b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Compiled names - ModuleSuffix 01.fs.gold new file mode 100644 index 0000000000..7ac28fc3e7 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Compiled names - ModuleSuffix 01.fs.gold @@ -0,0 +1,8 @@ +module Module + +open Option + +|Option.|(0)bind |> ignore + +--------------------------------------------------------- +(0): ReSharper Dead Code: Qualifier is redundant diff --git a/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Compiled names - ModuleSuffix 02 - Implicit.fs b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Compiled names - ModuleSuffix 02 - Implicit.fs new file mode 100644 index 0000000000..49acae7fb8 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Compiled names - ModuleSuffix 02 - Implicit.fs @@ -0,0 +1,15 @@ +module Module + +open T +let t1 = T() +let t2: T.NestedModuleType = T.NestedModuleType() +let t3: T.AnotherNestedModuleType = T.AnotherNestedModuleType() +let v1 = T.moduleValue +let v2 = T.AnotherNestedModuleType.nestedModuleValue + +open GenericT +let v3 = GenericT.genericModuleValue + +open T.NestedModuleType +let t4 = T.NestedModuleType() +let v4 = T.NestedModuleType.nestedModuleValue diff --git a/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Compiled names - ModuleSuffix 02 - Implicit.fs.gold b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Compiled names - ModuleSuffix 02 - Implicit.fs.gold new file mode 100644 index 0000000000..4ff8dcb0bc --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Compiled names - ModuleSuffix 02 - Implicit.fs.gold @@ -0,0 +1,27 @@ +module Module + +open T +let t1 = T() +let t2: |T.|(0)NestedModuleType = |T.|(1)NestedModuleType() +let t3: |T.|(2)AnotherNestedModuleType = |T.|(3)AnotherNestedModuleType() +let v1 = |T.|(4)moduleValue +let v2 = |T.|(5)AnotherNestedModuleType.nestedModuleValue + +open GenericT +let v3 = |GenericT.|(6)genericModuleValue + +open T.NestedModuleType +let t4 = |T.|(7)NestedModuleType() +let v4 = ||T.|(9)NestedModuleType.|(8)nestedModuleValue + +--------------------------------------------------------- +(0): ReSharper Dead Code: Qualifier is redundant +(1): ReSharper Dead Code: Qualifier is redundant +(2): ReSharper Dead Code: Qualifier is redundant +(3): ReSharper Dead Code: Qualifier is redundant +(4): ReSharper Dead Code: Qualifier is redundant +(5): ReSharper Dead Code: Qualifier is redundant +(6): ReSharper Dead Code: Qualifier is redundant +(7): ReSharper Dead Code: Qualifier is redundant +(8): ReSharper Dead Code: Qualifier is redundant +(9): ReSharper Dead Code: Qualifier is redundant diff --git a/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Namespace 01.fs b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Namespace 01.fs new file mode 100644 index 0000000000..15e0e63b8a --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Namespace 01.fs @@ -0,0 +1,5 @@ +module Module + +open System + +let s: System.String = System.String('a', 123) diff --git a/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Namespace 01.fs.gold b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Namespace 01.fs.gold new file mode 100644 index 0000000000..1f4d3bfb02 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Namespace 01.fs.gold @@ -0,0 +1,9 @@ +module Module + +open System + +let s: |System.|(0)String = |System.|(1)String('a', 123) + +--------------------------------------------------------- +(0): ReSharper Dead Code: Qualifier is redundant +(1): ReSharper Dead Code: Qualifier is redundant diff --git a/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Namespace 02 - Qualified.fs b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Namespace 02 - Qualified.fs new file mode 100644 index 0000000000..b17c08e654 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Namespace 02 - Qualified.fs @@ -0,0 +1,5 @@ +module Module + +open System.Collections.Generic + +let l: System.Collections.Generic.List = System.Collections.Generic.List() diff --git a/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Namespace 02 - Qualified.fs.gold b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Namespace 02 - Qualified.fs.gold new file mode 100644 index 0000000000..c0f89e32e8 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Namespace 02 - Qualified.fs.gold @@ -0,0 +1,9 @@ +module Module + +open System.Collections.Generic + +let l: |System.Collections.Generic.|(0)List = |System.Collections.Generic.|(1)List() + +--------------------------------------------------------- +(0): ReSharper Dead Code: Qualifier is redundant +(1): ReSharper Dead Code: Qualifier is redundant diff --git a/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Namespace 03 - Multiple import.fs b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Namespace 03 - Multiple import.fs new file mode 100644 index 0000000000..3117e99f73 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Namespace 03 - Multiple import.fs @@ -0,0 +1,6 @@ +module Module + +open System +open System.Collections.Generic + +let l: System.Collections.Generic.List = System.Collections.Generic.List() diff --git a/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Namespace 03 - Multiple import.fs.gold b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Namespace 03 - Multiple import.fs.gold new file mode 100644 index 0000000000..ffddb6efff --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Namespace 03 - Multiple import.fs.gold @@ -0,0 +1,11 @@ +module Module + +open System +open System.Collections.Generic + +let l: |System.Collections.Generic.|(0)List<|System.|(1)String> = |System.Collections.Generic.|(2)List() + +--------------------------------------------------------- +(0): ReSharper Dead Code: Qualifier is redundant +(1): ReSharper Dead Code: Qualifier is redundant +(2): ReSharper Dead Code: Qualifier is redundant diff --git a/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Namespace 04 - Global.fs b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Namespace 04 - Global.fs new file mode 100644 index 0000000000..fd3e0118bd --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Namespace 04 - Global.fs @@ -0,0 +1,3 @@ +module Module + +let s: global.System.String = global.System.String('a', 123) diff --git a/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Namespace 04 - Global.fs.gold b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Namespace 04 - Global.fs.gold new file mode 100644 index 0000000000..6fb67aa867 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Namespace 04 - Global.fs.gold @@ -0,0 +1,7 @@ +module Module + +let s: |global.|(0)System.String = |global.|(1)System.String('a', 123) + +--------------------------------------------------------- +(0): ReSharper Dead Code: Qualifier is redundant +(1): ReSharper Dead Code: Qualifier is redundant diff --git a/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Namespace 05 - Prefix.fs b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Namespace 05 - Prefix.fs new file mode 100644 index 0000000000..2b35827cd7 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Namespace 05 - Prefix.fs @@ -0,0 +1,5 @@ +module Module + +open System + +let l: System.Collections.Generic.List = System.Collections.Generic.List() diff --git a/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Namespace 05 - Prefix.fs.gold b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Namespace 05 - Prefix.fs.gold new file mode 100644 index 0000000000..b8b515ae9b --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Namespace 05 - Prefix.fs.gold @@ -0,0 +1,8 @@ +module Module + +open System + +let l: System.Collections.Generic.List<|System.|(0)String> = System.Collections.Generic.List() + +--------------------------------------------------------- +(0): ReSharper Dead Code: Qualifier is redundant diff --git a/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Opens 01.fs b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Opens 01.fs new file mode 100644 index 0000000000..823e440b9a --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Opens 01.fs @@ -0,0 +1,9 @@ +namespace Ns1.Ns2 +module Module = + let x = 123 + +namespace Ns3 +module Module = + open Ns1.Ns2 + open Ns1.Ns2.Module + x diff --git a/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Opens 01.fs.gold b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Opens 01.fs.gold new file mode 100644 index 0000000000..f172566d19 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Opens 01.fs.gold @@ -0,0 +1,11 @@ +namespace Ns1.Ns2 +module Module = + let x = 123 + +namespace Ns3 +module Module = + open Ns1.Ns2 + open Ns1.Ns2.Module + x + +--------------------------------------------------------- diff --git a/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Type extension 01.fs b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Type extension 01.fs new file mode 100644 index 0000000000..3381ccf42c --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Type extension 01.fs @@ -0,0 +1,6 @@ +module Module + +open System + +type System.String with + member x.P = 123 diff --git a/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Type extension 01.fs.gold b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Type extension 01.fs.gold new file mode 100644 index 0000000000..c1e8ac6b51 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/redundantQualifiers/Type extension 01.fs.gold @@ -0,0 +1,9 @@ +module Module + +open System + +type |System.|(0)String with + member x.P = 123 + +--------------------------------------------------------- +(0): ReSharper Dead Code: Qualifier is redundant diff --git a/ReSharper.FSharp/test/data/features/findUsages/occurenceKinds/Base Type 04 - Inherit arg.gold b/ReSharper.FSharp/test/data/features/findUsages/occurenceKinds/Base Type 04 - Inherit arg.gold index 698d381ff7..79366b65dd 100644 --- a/ReSharper.FSharp/test/data/features/findUsages/occurenceKinds/Base Type 04 - Inherit arg.gold +++ b/ReSharper.FSharp/test/data/features/findUsages/occurenceKinds/Base Type 04 - Inherit arg.gold @@ -3,9 +3,18 @@ TO: [O] open |System| RANGE: (21,27) @ Base Type 04 - Inherit arg.fs -Other +Pattern +--- +TO: [O] type Base(|s|: String) = RANGE: (63,64) @ Base Type 04 - Inherit arg.fs + + +Type specification --- TO: [O] type Base(s: |String|) = RANGE: (66,72) @ Base Type 04 - Inherit arg.fs + + +Other +--- TO: [O] inherit Module1.|Base|(String('a', 1)) RANGE: (165,169) @ Base Type 04 - Inherit arg.fs TO: [O] inherit |Module1|.Base(String('a', 1)) RANGE: (157,164) @ Base Type 04 - Inherit arg.fs diff --git a/ReSharper.FSharp/test/data/features/findUsages/occurenceKinds/New instance 03 - New.gold b/ReSharper.FSharp/test/data/features/findUsages/occurenceKinds/New instance 03 - New.gold index e6779552ac..917a7d6a34 100644 --- a/ReSharper.FSharp/test/data/features/findUsages/occurenceKinds/New instance 03 - New.gold +++ b/ReSharper.FSharp/test/data/features/findUsages/occurenceKinds/New instance 03 - New.gold @@ -1,10 +1,11 @@ -New instance creation +Other --- TO: [O] new System.|String|(' ', 1) RANGE: (28,34) @ New instance 03 - New.fs +TO: [O] new |System|.String(' ', 1) RANGE: (21,27) @ New instance 03 - New.fs -Other +New instance creation --- -TO: [O] new |System|.String(' ', 1) RANGE: (21,27) @ New instance 03 - New.fs +TO: [O] new System.|String|(' ', 1) RANGE: (28,34) @ New instance 03 - New.fs diff --git a/ReSharper.FSharp/test/data/features/findUsages/occurenceKinds/New instance 04 - Attribute.fs b/ReSharper.FSharp/test/data/features/findUsages/occurenceKinds/New instance 04 - Attribute.fs new file mode 100644 index 0000000000..e8ad02113b --- /dev/null +++ b/ReSharper.FSharp/test/data/features/findUsages/occurenceKinds/New instance 04 - Attribute.fs @@ -0,0 +1,4 @@ +module Module + +[ this.GetType().ToString(); + + [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")] ------------------ Occurrence's dump: diff --git a/ReSharper.FSharp/test/data/features/navigation/declaration/Ctor 01 - Modifier.fs b/ReSharper.FSharp/test/data/features/navigation/declaration/Ctor 01 - Modifier.fs new file mode 100644 index 0000000000..1b7d1a2334 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/navigation/declaration/Ctor 01 - Modifier.fs @@ -0,0 +1,7 @@ +module Module + +type T() = + internal new (x: int) = T() + + +{on}T(123) diff --git a/ReSharper.FSharp/test/data/features/navigation/declaration/Ctor 01 - Modifier.fs.gold b/ReSharper.FSharp/test/data/features/navigation/declaration/Ctor 01 - Modifier.fs.gold new file mode 100644 index 0000000000..51df8ba4fd --- /dev/null +++ b/ReSharper.FSharp/test/data/features/navigation/declaration/Ctor 01 - Modifier.fs.gold @@ -0,0 +1,28 @@ +-------------- offset 66 line 7 col 1 -------------------- ++++ JetBrains.ReSharper.Features.Navigation.Features.GoToDeclaration.GotoDeclarationProvider navigation provider results +++ +MULTIPLE CANDIDATES EXECUTION: +--> CANDIDATE DEO: Envoy: JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.DeclaredElement.FSharpConstructor, PsiLanguageType:F# as Envoy: JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.DeclaredElement.FSharpConstructor, PsiLanguageType:F# RANGE: (0,0) @ Ctor 01 - Modifier.fs +Immediate result: Occurrence's dump: +TO: [O] internal |new| (x: int) = T() RANGE: (42,45) @ Ctor 01 - Modifier.fs +Occurrence's navigation result. Opened file: Ctor 01 - Modifier.fs +------------------ + +type T() = + internal |CARET|new (x: int) = T() + + +------------------ + +--> CANDIDATE DEO: Envoy: Class:Module+T, PsiLanguageType:F# as Envoy: Class:Module+T, PsiLanguageType:F# RANGE: (0,0) @ Ctor 01 - Modifier.fs +Immediate result: Occurrence's dump: +TO: [O] type |T|() = RANGE: (22,23) @ Ctor 01 - Modifier.fs +Occurrence's navigation result. Opened file: Ctor 01 - Modifier.fs +------------------ +module Module + +type |CARET|T() = + internal new (x: int) = T() + +------------------ + +END OF MULTIPLE CANDIDATES EXECUTION diff --git a/ReSharper.FSharp/test/data/features/navigation/usages/Module suffix 01 - Compiled.fs b/ReSharper.FSharp/test/data/features/navigation/usages/Module suffix 01 - Compiled.fs new file mode 100644 index 0000000000..20205bd0b8 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/navigation/usages/Module suffix 01 - Compiled.fs @@ -0,0 +1,4 @@ +module Module + +List{on}.append |> ignore +List.append |> ignore diff --git a/ReSharper.FSharp/test/data/features/navigation/usages/Module suffix 01 - Compiled.fs.gold b/ReSharper.FSharp/test/data/features/navigation/usages/Module suffix 01 - Compiled.fs.gold new file mode 100644 index 0000000000..cbb385877d --- /dev/null +++ b/ReSharper.FSharp/test/data/features/navigation/usages/Module suffix 01 - Compiled.fs.gold @@ -0,0 +1,38 @@ +-------------- offset 21 line 3 col 5 -------------------- ++++ JetBrains.ReSharper.Features.Navigation.Features.GoToUsages.GotoUsagesProvider navigation provider results +++ +Occurrences provided for OccurrenceUtil: +Occurrence's dump: +TO: [O] |List|.append |> ignore RANGE: (17,21) @ Module suffix 01 - Compiled.fs +Menu Item presentation: +Text: Module |List|.append |> ignore| (3) +Shortcut text: in +Style: Enabled +Mnemonic: +Tooltip: List.append |> ignore + +Occurrence's navigation result. Opened file: Module suffix 01 - Compiled.fs +------------------ +module Module + +List|CARET|.append |> ignore +List.append |> ignore + +------------------ + +Occurrence's dump: +TO: [O] |List|.append |> ignore RANGE: (40,44) @ Module suffix 01 - Compiled.fs +Menu Item presentation: +Text: Module |List|.append |> ignore| (4) +Shortcut text: in +Style: Enabled +Mnemonic: +Tooltip: List.append |> ignore + +Occurrence's navigation result. Opened file: Module suffix 01 - Compiled.fs +------------------ + +List.append |> ignore +|CARET|List.append |> ignore + +------------------ + diff --git a/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Expr - Imported 01.fs b/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Expr - Imported 01.fs new file mode 100644 index 0000000000..df23651d42 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Expr - Imported 01.fs @@ -0,0 +1,12 @@ +namespace Ns1 + +[] +module Module1 = + type T() = class end + +namespace N2 + +open Ns1 + +module Nested = + let t = T{caret}() diff --git a/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Expr - Imported 01.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Expr - Imported 01.fs.gold new file mode 100644 index 0000000000..6b62615719 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Expr - Imported 01.fs.gold @@ -0,0 +1,12 @@ +namespace Ns1 + +[] +module Module1 = + type T() = class end + +namespace N2 + +open Ns1 + +module Nested = + let t = Module1.T{caret}() diff --git a/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Expr - Imported 02 - Nested.fs b/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Expr - Imported 02 - Nested.fs new file mode 100644 index 0000000000..934c77127e --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Expr - Imported 02 - Nested.fs @@ -0,0 +1,14 @@ +namespace Ns1 + +[] +module Module1 = + [] + module Nested1 = + type T() = class end + +namespace N2 + +open Ns1 + +module Nested = + let t = {caret}T() diff --git a/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Expr - Imported 02 - Nested.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Expr - Imported 02 - Nested.fs.gold new file mode 100644 index 0000000000..bd66bf8835 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Expr - Imported 02 - Nested.fs.gold @@ -0,0 +1,14 @@ +namespace Ns1 + +[] +module Module1 = + [] + module Nested1 = + type T() = class end + +namespace N2 + +open Ns1 + +module Nested = + let t = Module1.Nested1.{caret}T() diff --git a/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Expr 01.fs b/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Expr 01.fs new file mode 100644 index 0000000000..97ab20a21a --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Expr 01.fs @@ -0,0 +1,10 @@ +namespace Ns1 + +[] +module Module1 = + type T() = class end + +namespace N2 + +module Nested = + let t = T{caret}() diff --git a/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Expr 01.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Expr 01.fs.gold new file mode 100644 index 0000000000..6b62615719 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Expr 01.fs.gold @@ -0,0 +1,12 @@ +namespace Ns1 + +[] +module Module1 = + type T() = class end + +namespace N2 + +open Ns1 + +module Nested = + let t = Module1.T{caret}() diff --git a/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Expr 02 - Nested.fs b/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Expr 02 - Nested.fs new file mode 100644 index 0000000000..0df5cfba25 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Expr 02 - Nested.fs @@ -0,0 +1,12 @@ +namespace Ns1 + +[] +module Module1 = + [] + module Nested1 = + type T() = class end + +namespace N2 + +module Nested = + let t = {caret}T() diff --git a/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Expr 02 - Nested.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Expr 02 - Nested.fs.gold new file mode 100644 index 0000000000..bd66bf8835 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Expr 02 - Nested.fs.gold @@ -0,0 +1,14 @@ +namespace Ns1 + +[] +module Module1 = + [] + module Nested1 = + type T() = class end + +namespace N2 + +open Ns1 + +module Nested = + let t = Module1.Nested1.{caret}T() diff --git a/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Reference name - Expression 01.fs b/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Reference name - Expression 01.fs new file mode 100644 index 0000000000..767b572904 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Reference name - Expression 01.fs @@ -0,0 +1,10 @@ +namespace Ns1 + +[] +module Module1 = + type T() = class end + +namespace N2 + +module Nested = + let t: T{caret} = Unchecked.defaultof<_> diff --git a/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Reference name - Expression 01.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Reference name - Expression 01.fs.gold new file mode 100644 index 0000000000..2e190374d8 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Reference name - Expression 01.fs.gold @@ -0,0 +1,12 @@ +namespace Ns1 + +[] +module Module1 = + type T() = class end + +namespace N2 + +open Ns1 + +module Nested = + let t: Module1.T{caret} = Unchecked.defaultof<_> diff --git a/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Reference name - Type 01.fs b/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Reference name - Type 01.fs new file mode 100644 index 0000000000..f9b5b8ac5e --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Reference name - Type 01.fs @@ -0,0 +1,11 @@ +namespace Ns1 + +[] +module Module1 = + type T() = class end + +namespace N2 + +module Nested = + match null with + | :? T{caret} -> () diff --git a/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Reference name - Type 01.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Reference name - Type 01.fs.gold new file mode 100644 index 0000000000..03911842c7 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Reference name - Type 01.fs.gold @@ -0,0 +1,13 @@ +namespace Ns1 + +[] +module Module1 = + type T() = class end + +namespace N2 + +open Ns1 + +module Nested = + match null with + | :? Module1.T{caret} -> () diff --git a/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Type extension 01.fs b/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Type extension 01.fs new file mode 100644 index 0000000000..85ed782f8e --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Type extension 01.fs @@ -0,0 +1,10 @@ +namespace Ns1 + +[] +module Module1 = + type T() = class end + +namespace N2 + +module Nested = + type T{caret} with diff --git a/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Type extension 01.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Type extension 01.fs.gold new file mode 100644 index 0000000000..ca084bf46c --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/importType/Qualifiers - Type extension 01.fs.gold @@ -0,0 +1,12 @@ +namespace Ns1 + +[] +module Module1 = + type T() = class end + +namespace N2 + +open Ns1 + +module Nested = + type Module1.T{caret} with diff --git a/ReSharper.FSharp/test/data/features/quickFixes/introduceVar/Do 01.fs b/ReSharper.FSharp/test/data/features/quickFixes/introduceVar/Do 01.fs new file mode 100644 index 0000000000..a5cd4d4541 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/introduceVar/Do 01.fs @@ -0,0 +1,4 @@ +module Module + +do + 123{caret} diff --git a/ReSharper.FSharp/test/data/features/quickFixes/introduceVar/Do 01.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/introduceVar/Do 01.fs.gold new file mode 100644 index 0000000000..627d5c7096 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/introduceVar/Do 01.fs.gold @@ -0,0 +1,4 @@ +module Module + +do + let {selstart}i{selend} = 123 diff --git a/ReSharper.FSharp/test/data/features/quickFixes/introduceVar/For 01.fs b/ReSharper.FSharp/test/data/features/quickFixes/introduceVar/For 01.fs new file mode 100644 index 0000000000..88699e87ad --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/introduceVar/For 01.fs @@ -0,0 +1,4 @@ +module Module + +for _ in [] do + 123{caret} diff --git a/ReSharper.FSharp/test/data/features/quickFixes/introduceVar/For 01.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/introduceVar/For 01.fs.gold new file mode 100644 index 0000000000..185bb33391 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/introduceVar/For 01.fs.gold @@ -0,0 +1,4 @@ +module Module + +for _ in [] do + let {selstart}i{selend} = 123 diff --git a/ReSharper.FSharp/test/data/features/quickFixes/introduceVar/If 01.fs b/ReSharper.FSharp/test/data/features/quickFixes/introduceVar/If 01.fs new file mode 100644 index 0000000000..fcc07d0bb4 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/introduceVar/If 01.fs @@ -0,0 +1,4 @@ +module Module + +if true then + 123{caret} diff --git a/ReSharper.FSharp/test/data/features/quickFixes/introduceVar/If 01.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/introduceVar/If 01.fs.gold new file mode 100644 index 0000000000..948b74712b --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/introduceVar/If 01.fs.gold @@ -0,0 +1,4 @@ +module Module + +if true then + let {selstart}i{selend} = 123 diff --git a/ReSharper.FSharp/test/data/features/quickFixes/introduceVar/Local - Seq - Last 01.fs b/ReSharper.FSharp/test/data/features/quickFixes/introduceVar/Local - Seq - Last 01.fs new file mode 100644 index 0000000000..bb3ae6a727 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/introduceVar/Local - Seq - Last 01.fs @@ -0,0 +1,5 @@ +module Module + +do + () + 123{caret} diff --git a/ReSharper.FSharp/test/data/features/quickFixes/introduceVar/Local - Seq - Last 01.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/introduceVar/Local - Seq - Last 01.fs.gold new file mode 100644 index 0000000000..26bbe0c48b --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/introduceVar/Local - Seq - Last 01.fs.gold @@ -0,0 +1,5 @@ +module Module + +do + () + let {selstart}i{selend} = 123 diff --git a/ReSharper.FSharp/test/data/features/quickFixes/removeRedundantQualifier/Reference expr 01.fs b/ReSharper.FSharp/test/data/features/quickFixes/removeRedundantQualifier/Reference expr 01.fs new file mode 100644 index 0000000000..e4af768216 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/removeRedundantQualifier/Reference expr 01.fs @@ -0,0 +1,5 @@ +module Module + +open System.Collections.Generic + +System.{caret}Collections.Generic.List() diff --git a/ReSharper.FSharp/test/data/features/quickFixes/removeRedundantQualifier/Reference expr 01.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/removeRedundantQualifier/Reference expr 01.fs.gold new file mode 100644 index 0000000000..103244211a --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/removeRedundantQualifier/Reference expr 01.fs.gold @@ -0,0 +1,5 @@ +module Module + +open System.Collections.Generic + +{caret}List() diff --git a/ReSharper.FSharp/test/data/features/quickFixes/removeRedundantQualifier/Reference name 01.fs b/ReSharper.FSharp/test/data/features/quickFixes/removeRedundantQualifier/Reference name 01.fs new file mode 100644 index 0000000000..ea0aa1dff6 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/removeRedundantQualifier/Reference name 01.fs @@ -0,0 +1,5 @@ +module Module + +open System.Collections.Generic + +let l: System.{caret}Collections.Generic.List<_> = List() diff --git a/ReSharper.FSharp/test/data/features/quickFixes/removeRedundantQualifier/Reference name 01.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/removeRedundantQualifier/Reference name 01.fs.gold new file mode 100644 index 0000000000..a237c5a5c6 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/removeRedundantQualifier/Reference name 01.fs.gold @@ -0,0 +1,5 @@ +module Module + +open System.Collections.Generic + +let l: {caret}List<_> = List() diff --git a/ReSharper.FSharp/test/data/features/quickFixes/removeRedundantQualifier/Type extension 01.fs b/ReSharper.FSharp/test/data/features/quickFixes/removeRedundantQualifier/Type extension 01.fs new file mode 100644 index 0000000000..25dac686ee --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/removeRedundantQualifier/Type extension 01.fs @@ -0,0 +1,6 @@ +module Module + +open System + +type {caret}System.String with + member x.P = 123 diff --git a/ReSharper.FSharp/test/data/features/quickFixes/removeRedundantQualifier/Type extension 01.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/removeRedundantQualifier/Type extension 01.fs.gold new file mode 100644 index 0000000000..780d45c0e0 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/removeRedundantQualifier/Type extension 01.fs.gold @@ -0,0 +1,6 @@ +module Module + +open System + +type {caret}String with + member x.P = 123 diff --git a/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Return 01.fs b/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Return 01.fs new file mode 100644 index 0000000000..e6bb750dce --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Return 01.fs @@ -0,0 +1,3 @@ +module Module + +return 123{caret} \ No newline at end of file diff --git a/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Return 01.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Return 01.fs.gold new file mode 100644 index 0000000000..13f171183e --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Return 01.fs.gold @@ -0,0 +1,3 @@ +module Module + +123{caret} \ No newline at end of file diff --git a/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Return 02 - Multiline.fs b/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Return 02 - Multiline.fs new file mode 100644 index 0000000000..9f0b53db15 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Return 02 - Multiline.fs @@ -0,0 +1,4 @@ +module Module + +return 123 + 123{caret} diff --git a/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Return 02 - Multiline.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Return 02 - Multiline.fs.gold new file mode 100644 index 0000000000..5d8bde7ebf --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Return 02 - Multiline.fs.gold @@ -0,0 +1,4 @@ +module Module + +123 +123{caret} diff --git a/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Return 03 - New line.fs b/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Return 03 - New line.fs new file mode 100644 index 0000000000..a3c371aa5d --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Return 03 - New line.fs @@ -0,0 +1,4 @@ +module Module + +{caret}return + 123 diff --git a/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Return 03 - New line.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Return 03 - New line.fs.gold new file mode 100644 index 0000000000..a899e3b045 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Return 03 - New line.fs.gold @@ -0,0 +1,3 @@ +module Module + +{caret}123 diff --git a/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Return! 01.fs b/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Return! 01.fs new file mode 100644 index 0000000000..bc36b6faab --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Return! 01.fs @@ -0,0 +1,3 @@ +module Module + +return! 123{caret} \ No newline at end of file diff --git a/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Return! 01.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Return! 01.fs.gold new file mode 100644 index 0000000000..13f171183e --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Return! 01.fs.gold @@ -0,0 +1,3 @@ +module Module + +123{caret} \ No newline at end of file diff --git a/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Yield 01.fs b/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Yield 01.fs new file mode 100644 index 0000000000..d8661fed38 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Yield 01.fs @@ -0,0 +1,3 @@ +module Module + +{caret}yield 123 diff --git a/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Yield 01.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Yield 01.fs.gold new file mode 100644 index 0000000000..a899e3b045 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Yield 01.fs.gold @@ -0,0 +1,3 @@ +module Module + +{caret}123 diff --git a/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Yield 02 - Comment.fs b/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Yield 02 - Comment.fs new file mode 100644 index 0000000000..406e0db4fc --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Yield 02 - Comment.fs @@ -0,0 +1,4 @@ +module Module + +{caret}yield + 123 // Foo diff --git a/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Yield 02 - Comment.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Yield 02 - Comment.fs.gold new file mode 100644 index 0000000000..c1a41b96d5 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Yield 02 - Comment.fs.gold @@ -0,0 +1,3 @@ +module Module + +{caret}123 // Foo diff --git a/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Yield! 01.fs b/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Yield! 01.fs new file mode 100644 index 0000000000..d8661fed38 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Yield! 01.fs @@ -0,0 +1,3 @@ +module Module + +{caret}yield 123 diff --git a/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Yield! 01.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Yield! 01.fs.gold new file mode 100644 index 0000000000..a899e3b045 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/removeYield/Yield! 01.fs.gold @@ -0,0 +1,3 @@ +module Module + +{caret}123 diff --git a/ReSharper.FSharp/test/data/features/quickFixes/replaceWithWildPat/Not available - Ctor 01.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/replaceWithWildPat/Not available - Ctor 01.fs.gold index 08e3d7db1b..07e2befb0b 100644 --- a/ReSharper.FSharp/test/data/features/quickFixes/replaceWithWildPat/Not available - Ctor 01.fs.gold +++ b/ReSharper.FSharp/test/data/features/quickFixes/replaceWithWildPat/Not available - Ctor 01.fs.gold @@ -6,4 +6,5 @@ type T(|p|(0)) = ------------------------------------------------ 0: The value 'p' is unused -NO QUICKFIXES +QUICKFIXES: +Rename to '_p' diff --git a/ReSharper.FSharp/test/data/features/quickFixes/replaceWithWildPat/Not available - Let - Attribute 03 - Typed.fs b/ReSharper.FSharp/test/data/features/quickFixes/replaceWithWildPat/Not available - Let - Attribute 03 - Typed.fs new file mode 100644 index 0000000000..7034b74020 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/replaceWithWildPat/Not available - Let - Attribute 03 - Typed.fs @@ -0,0 +1,7 @@ +module Module + +type FooAttribute() = + inherit System.Attribute() + +let foo ([] x{caret}: int) = + () diff --git a/ReSharper.FSharp/test/data/features/quickFixes/replaceWithWildPat/Not available - Let - Attribute 03 - Typed.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/replaceWithWildPat/Not available - Let - Attribute 03 - Typed.fs.gold new file mode 100644 index 0000000000..fec35a29e9 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/replaceWithWildPat/Not available - Let - Attribute 03 - Typed.fs.gold @@ -0,0 +1,12 @@ +module Module + +type FooAttribute() = + inherit System.Attribute() + +let foo ([] |x|(0): int) = + () + +------------------------------------------------ +0: The value 'x' is unused +QUICKFIXES: +Rename to '_x' diff --git a/ReSharper.FSharp/test/data/features/quickFixes/replaceWithWildPat/Not available - Let - Attribute 04 - Typed.fs b/ReSharper.FSharp/test/data/features/quickFixes/replaceWithWildPat/Not available - Let - Attribute 04 - Typed.fs new file mode 100644 index 0000000000..439d712bbc --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/replaceWithWildPat/Not available - Let - Attribute 04 - Typed.fs @@ -0,0 +1,7 @@ +module Module + +type FooAttribute() = + inherit System.Attribute() + +let foo ([] ((x{caret}: int))) = + () diff --git a/ReSharper.FSharp/test/data/features/quickFixes/replaceWithWildPat/Not available - Let - Attribute 04 - Typed.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/replaceWithWildPat/Not available - Let - Attribute 04 - Typed.fs.gold new file mode 100644 index 0000000000..9c868e810f --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/replaceWithWildPat/Not available - Let - Attribute 04 - Typed.fs.gold @@ -0,0 +1,12 @@ +module Module + +type FooAttribute() = + inherit System.Attribute() + +let foo ([] ((|x|(0): int))) = + () + +------------------------------------------------ +0: The value 'x' is unused +QUICKFIXES: +Rename to '_x' diff --git a/ReSharper.FSharp/test/data/features/quickFixes/toRecursiveFunction/Top level 02 - Alignment.fs b/ReSharper.FSharp/test/data/features/quickFixes/toRecursiveFunction/Top level 02 - Alignment.fs new file mode 100644 index 0000000000..c6a947b47b --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/toRecursiveFunction/Top level 02 - Alignment.fs @@ -0,0 +1,4 @@ +module Module + +let f x = () + {caret}f x diff --git a/ReSharper.FSharp/test/data/features/quickFixes/toRecursiveFunction/Top level 02 - Alignment.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/toRecursiveFunction/Top level 02 - Alignment.fs.gold new file mode 100644 index 0000000000..3f3f6c364e --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/toRecursiveFunction/Top level 02 - Alignment.fs.gold @@ -0,0 +1,4 @@ +module Module + +let rec f x = () + {caret}f x diff --git a/ReSharper.FSharp/test/data/features/quickFixes/toRecursiveLetBindings/Module 03 - Alignment.fs b/ReSharper.FSharp/test/data/features/quickFixes/toRecursiveLetBindings/Module 03 - Alignment.fs new file mode 100644 index 0000000000..4beddf5e54 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/toRecursiveLetBindings/Module 03 - Alignment.fs @@ -0,0 +1,5 @@ +module Module + +let foo x = 1 + 1 +and{caret} bar x = 1 diff --git a/ReSharper.FSharp/test/data/features/quickFixes/toRecursiveLetBindings/Module 03 - Alignment.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/toRecursiveLetBindings/Module 03 - Alignment.fs.gold new file mode 100644 index 0000000000..8036a8e847 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/toRecursiveLetBindings/Module 03 - Alignment.fs.gold @@ -0,0 +1,5 @@ +module Module + +let rec foo x = 1 + 1 +and{caret} bar x = 1 diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Do decl - Implicit 01.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Do decl - Implicit 01.fs.gold index 7e5f3d87ed..c017876575 100644 --- a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Do decl - Implicit 01.fs.gold +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Do decl - Implicit 01.fs.gold @@ -1,3 +1,2 @@ Suggested names: i let i = 1 -i diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Expr - Binary app - Same indent 01.fs b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Expr - Binary app - Same indent 01.fs new file mode 100644 index 0000000000..36c7962880 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Expr - Binary app - Same indent 01.fs @@ -0,0 +1,5 @@ +module Module + +do + 1 + + {selstart}1{selend}{caret} diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Expr - Binary app - Same indent 01.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Expr - Binary app - Same indent 01.fs.gold new file mode 100644 index 0000000000..1774bf6fe1 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Expr - Binary app - Same indent 01.fs.gold @@ -0,0 +1,7 @@ +Suggested names: i +module Module + +do + let i = 1 + 1 + + i diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Expr - Binary app - Same indent 02.fs b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Expr - Binary app - Same indent 02.fs new file mode 100644 index 0000000000..a510658163 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Expr - Binary app - Same indent 02.fs @@ -0,0 +1,5 @@ +module Module + +do + 1 + + 1 + {selstart}1{selend}{caret} diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Expr - Binary app - Same indent 02.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Expr - Binary app - Same indent 02.fs.gold new file mode 100644 index 0000000000..107bcddc3b --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Expr - Binary app - Same indent 02.fs.gold @@ -0,0 +1,7 @@ +Suggested names: i +module Module + +do + let i = 1 + 1 + + 1 + i diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Expr - Binary app - Same indent 03.fs b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Expr - Binary app - Same indent 03.fs new file mode 100644 index 0000000000..5753e81249 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Expr - Binary app - Same indent 03.fs @@ -0,0 +1,6 @@ +module Module + +do + 1 + + + {selstart}1{selend}{caret} diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Expr - Binary app - Same indent 03.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Expr - Binary app - Same indent 03.fs.gold new file mode 100644 index 0000000000..71df31c2c4 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Expr - Binary app - Same indent 03.fs.gold @@ -0,0 +1,7 @@ +Suggested names: i +module Module + +do + 1 + + + let i = 1 diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Expr - Binary app - Same indent 04.fs b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Expr - Binary app - Same indent 04.fs new file mode 100644 index 0000000000..bc837c2731 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Expr - Binary app - Same indent 04.fs @@ -0,0 +1,6 @@ +module Module + +do + 1 + + + id {selstart}1{selend}{caret} diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Expr - Binary app - Same indent 04.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Expr - Binary app - Same indent 04.fs.gold new file mode 100644 index 0000000000..21588546bf --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Expr - Binary app - Same indent 04.fs.gold @@ -0,0 +1,8 @@ +Suggested names: i +module Module + +do + 1 + + + let i = 1 + id i diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Expr - Binary app - Same indent 05.fs b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Expr - Binary app - Same indent 05.fs new file mode 100644 index 0000000000..cb8890ffd3 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Expr - Binary app - Same indent 05.fs @@ -0,0 +1,6 @@ +module Module + +do + 1 + + + 1 + {selstart}1{selend}{caret} diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Expr - Binary app - Same indent 05.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Expr - Binary app - Same indent 05.fs.gold new file mode 100644 index 0000000000..a52b27f663 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Expr - Binary app - Same indent 05.fs.gold @@ -0,0 +1,8 @@ +Suggested names: i +module Module + +do + 1 + + + let i = 1 + 1 + i diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Expr - Binary app 01.fs b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Expr - Binary app 01.fs new file mode 100644 index 0000000000..2fbfb820a4 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Expr - Binary app 01.fs @@ -0,0 +1,7 @@ +module Module + +type U = + | A + static member M(b: bool) = () + +U.M({selstart}U.A = U.A{selend}{caret}) diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Expr - Binary app 01.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Expr - Binary app 01.fs.gold new file mode 100644 index 0000000000..928eb27117 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Expr - Binary app 01.fs.gold @@ -0,0 +1,9 @@ +Suggested names: foo +module Module + +type U = + | A + static member M(b: bool) = () + +let foo = U.A = U.A +U.M(foo) diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Let 04 - After other.fs b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Let 04 - After other.fs new file mode 100644 index 0000000000..6d2e4895b8 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Let 04 - After other.fs @@ -0,0 +1,3 @@ +do + let a = 1 + {caret}{selstart}ignore 1{selend} diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Let 04 - After other.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Let 04 - After other.fs.gold new file mode 100644 index 0000000000..30d3d3db80 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Let 04 - After other.fs.gold @@ -0,0 +1,4 @@ +Suggested names: unit +do + let a = 1 + let unit = ignore 1 diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/LetDecl - Function 01.fs b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/LetDecl - Function 01.fs new file mode 100644 index 0000000000..67ac56b230 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/LetDecl - Function 01.fs @@ -0,0 +1,2 @@ +let f x = + {caret}{selstart}1{selend} diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/LetDecl - Function 01.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/LetDecl - Function 01.fs.gold new file mode 100644 index 0000000000..21c332a512 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/LetDecl - Function 01.fs.gold @@ -0,0 +1,3 @@ +Suggested names: i +let f x = + let i = 1 diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/LetDecl - Function 02.fs b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/LetDecl - Function 02.fs new file mode 100644 index 0000000000..c75184105f --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/LetDecl - Function 02.fs @@ -0,0 +1,3 @@ +let f x = + {caret}{selstart}1{selend} + 2 diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/LetDecl - Function 02.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/LetDecl - Function 02.fs.gold new file mode 100644 index 0000000000..e096ef3f62 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/LetDecl - Function 02.fs.gold @@ -0,0 +1,4 @@ +Suggested names: i +let f x = + let i = 1 + 2 diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/LetExpr 01.fs b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/LetExpr 01.fs new file mode 100644 index 0000000000..443c70c30e --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/LetExpr 01.fs @@ -0,0 +1,3 @@ +do + {selstart}let x = 1 + 1 + (){selend}{caret} diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/LetExpr 01.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/LetExpr 01.fs.gold new file mode 100644 index 0000000000..4d1ef66731 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/LetExpr 01.fs.gold @@ -0,0 +1,5 @@ +Suggested names: foo +do + let foo = + let x = 1 + 1 + () diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Match 03 - Multiline.fs b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Match 03 - Multiline.fs new file mode 100644 index 0000000000..6d649571d0 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Match 03 - Multiline.fs @@ -0,0 +1,5 @@ +do + match () with + | _ -> 1 + + + {selstart}1{selend}{caret} diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Match 03 - Multiline.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Match 03 - Multiline.fs.gold new file mode 100644 index 0000000000..623d01eb0c --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Match 03 - Multiline.fs.gold @@ -0,0 +1,6 @@ +Suggested names: i +do + match () with + | _ -> 1 + + + let i = 1 diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Match 04 - Multiline.fs b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Match 04 - Multiline.fs new file mode 100644 index 0000000000..77ddbab588 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Match 04 - Multiline.fs @@ -0,0 +1,5 @@ +do + match () with + | _ -> 1 + + + id {selstart}1{selend}{caret} diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Match 04 - Multiline.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Match 04 - Multiline.fs.gold new file mode 100644 index 0000000000..7008342675 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Match 04 - Multiline.fs.gold @@ -0,0 +1,7 @@ +Suggested names: i +do + match () with + | _ -> 1 + + + let i = 1 + id i diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Member - Auto property 01.fs b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Member - Auto property 01.fs new file mode 100644 index 0000000000..498dcb9bbd --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Member - Auto property 01.fs @@ -0,0 +1,2 @@ +type T() = + member val P = {selstart}1{selend}{caret} diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Member - Auto property 01.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Member - Auto property 01.fs.gold new file mode 100644 index 0000000000..471c6811d4 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Member - Auto property 01.fs.gold @@ -0,0 +1,4 @@ +Suggested names: i +type T() = + member val P = + let i = 1 diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Member - Decl 01.fs b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Member - Decl 01.fs new file mode 100644 index 0000000000..913e301af2 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Member - Decl 01.fs @@ -0,0 +1,2 @@ +type T() = + static member P = {selstart}1{selend}{caret} diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Member - Decl 01.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Member - Decl 01.fs.gold new file mode 100644 index 0000000000..38f368a021 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Member - Decl 01.fs.gold @@ -0,0 +1,4 @@ +Suggested names: i +type T() = + static member P = + let i = 1 diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Not allowed - CompExpr 01.fs b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Not allowed - CompExpr 01.fs new file mode 100644 index 0000000000..8ddb4e506a --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Not allowed - CompExpr 01.fs @@ -0,0 +1 @@ +async {selstart}{ return 123 }{selend}{caret} diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Not allowed - CompExpr 01.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Not allowed - CompExpr 01.fs.gold new file mode 100644 index 0000000000..5859971f20 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Not allowed - CompExpr 01.fs.gold @@ -0,0 +1 @@ +NOT AVAILABLE \ No newline at end of file diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Not allowed - CompExpr 02 - Yield.fs b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Not allowed - CompExpr 02 - Yield.fs new file mode 100644 index 0000000000..ac012bae39 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Not allowed - CompExpr 02 - Yield.fs @@ -0,0 +1 @@ +async { {selstart}yield 123{selend}{caret} } diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Not allowed - CompExpr 02 - Yield.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Not allowed - CompExpr 02 - Yield.fs.gold new file mode 100644 index 0000000000..5859971f20 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Not allowed - CompExpr 02 - Yield.fs.gold @@ -0,0 +1 @@ +NOT AVAILABLE \ No newline at end of file diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Not allowed - Named arg 01.fs b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Not allowed - Named arg 01.fs new file mode 100644 index 0000000000..58a4dc2482 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Not allowed - Named arg 01.fs @@ -0,0 +1 @@ +"".Equals({selstart}obj = ""{selend}{caret}) diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Not allowed - Named arg 01.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Not allowed - Named arg 01.fs.gold new file mode 100644 index 0000000000..5859971f20 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Not allowed - Named arg 01.fs.gold @@ -0,0 +1 @@ +NOT AVAILABLE \ No newline at end of file diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Not allowed - Named arg 02 - Unit.fs b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Not allowed - Named arg 02 - Unit.fs new file mode 100644 index 0000000000..186b8c42c2 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Not allowed - Named arg 02 - Unit.fs @@ -0,0 +1,4 @@ +type T() = + static member M(u: unit) = () + +T.M({selstart}u = (){selend}{caret}) diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Not allowed - Named arg 02 - Unit.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Not allowed - Named arg 02 - Unit.fs.gold new file mode 100644 index 0000000000..5859971f20 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Not allowed - Named arg 02 - Unit.fs.gold @@ -0,0 +1 @@ +NOT AVAILABLE \ No newline at end of file diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Not allowed - Named arg 03 - Union case field.fs b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Not allowed - Named arg 03 - Union case field.fs new file mode 100644 index 0000000000..f3645874ad --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Not allowed - Named arg 03 - Union case field.fs @@ -0,0 +1,4 @@ +type U = + A of x: int + +A({selstart}x = 123{selend}{caret}) diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Not allowed - Named arg 03 - Union case field.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Not allowed - Named arg 03 - Union case field.fs.gold new file mode 100644 index 0000000000..5859971f20 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Not allowed - Named arg 03 - Union case field.fs.gold @@ -0,0 +1 @@ +NOT AVAILABLE \ No newline at end of file diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Not allowed - RangeSequenceExpr 01.fs b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Not allowed - RangeSequenceExpr 01.fs new file mode 100644 index 0000000000..7a2ed2547d --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Not allowed - RangeSequenceExpr 01.fs @@ -0,0 +1 @@ +for _ in {selstart}1 .. 2{selend}{caret} do () diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Not allowed - RangeSequenceExpr 01.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Not allowed - RangeSequenceExpr 01.fs.gold new file mode 100644 index 0000000000..5859971f20 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Not allowed - RangeSequenceExpr 01.fs.gold @@ -0,0 +1 @@ +NOT AVAILABLE \ No newline at end of file diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Record field binding - Anon 01.fs b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Record field binding - Anon 01.fs new file mode 100644 index 0000000000..dbcf41a642 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Record field binding - Anon 01.fs @@ -0,0 +1,3 @@ +module Module + +let r = {| Field = {selstart}1{selend}{caret} |} diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Record field binding - Anon 01.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Record field binding - Anon 01.fs.gold new file mode 100644 index 0000000000..4521abe3d8 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Record field binding - Anon 01.fs.gold @@ -0,0 +1,5 @@ +Suggested names: i +module Module + +let i = 1 +let r = {| Field = i |} diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Record field binding - Anon 02 - In app.fs b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Record field binding - Anon 02 - In app.fs new file mode 100644 index 0000000000..667b899a8b --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Record field binding - Anon 02 - In app.fs @@ -0,0 +1,3 @@ +module Module + +ignore {| Field = {selstart}1{selend}{caret} |} diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Record field binding - Anon 02 - In app.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Record field binding - Anon 02 - In app.fs.gold new file mode 100644 index 0000000000..a8ac27c8d0 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Record field binding - Anon 02 - In app.fs.gold @@ -0,0 +1,5 @@ +Suggested names: i +module Module + +let i = 1 +ignore {| Field = i |} diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Record field binding 01.fs b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Record field binding 01.fs new file mode 100644 index 0000000000..91b104abc9 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Record field binding 01.fs @@ -0,0 +1,5 @@ +module Module + +type R = { Field: int } + +let r = { Field = {selstart}1{selend}{caret} } diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Record field binding 01.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Record field binding 01.fs.gold new file mode 100644 index 0000000000..e4a252f9e9 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Record field binding 01.fs.gold @@ -0,0 +1,7 @@ +Suggested names: i +module Module + +type R = { Field: int } + +let i = 1 +let r = { Field = i } diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Record field binding 02 - In app.fs b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Record field binding 02 - In app.fs new file mode 100644 index 0000000000..f99f9580da --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Record field binding 02 - In app.fs @@ -0,0 +1,5 @@ +module Module + +type R = { Field: int } + +ignore { Field = {selstart}1{selend}{caret} } diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Record field binding 02 - In app.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Record field binding 02 - In app.fs.gold new file mode 100644 index 0000000000..85bf986c68 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Record field binding 02 - In app.fs.gold @@ -0,0 +1,7 @@ +Suggested names: i +module Module + +type R = { Field: int } + +let i = 1 +ignore { Field = i } diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Seq 01.fs b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Seq 01.fs new file mode 100644 index 0000000000..b998a867c0 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Seq 01.fs @@ -0,0 +1,3 @@ +while true do + {selstart}123{selend}{caret} + () \ No newline at end of file diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Seq 01.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Seq 01.fs.gold new file mode 100644 index 0000000000..9eef97a4df --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Seq 01.fs.gold @@ -0,0 +1,4 @@ +Suggested names: i +while true do + let i = 123 + () \ No newline at end of file diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Seq 02.fs b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Seq 02.fs new file mode 100644 index 0000000000..ba6ab499e9 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Seq 02.fs @@ -0,0 +1,4 @@ +while true do + () + {selstart}123{selend}{caret} + () \ No newline at end of file diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Seq 02.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Seq 02.fs.gold new file mode 100644 index 0000000000..7078c7d987 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Seq 02.fs.gold @@ -0,0 +1,5 @@ +Suggested names: i +while true do + () + let i = 123 + () \ No newline at end of file diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Seq 03 - Last.fs b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Seq 03 - Last.fs new file mode 100644 index 0000000000..6f3b485a7f --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Seq 03 - Last.fs @@ -0,0 +1,3 @@ +while true do + () + {selstart}123{selend}{caret} diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Seq 03 - Last.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Seq 03 - Last.fs.gold new file mode 100644 index 0000000000..f317ed1b66 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Seq 03 - Last.fs.gold @@ -0,0 +1,4 @@ +Suggested names: i +while true do + () + let i = 123 diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Seq 04.fs b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Seq 04.fs new file mode 100644 index 0000000000..1b99407165 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Seq 04.fs @@ -0,0 +1,4 @@ +do + {selstart}123{selend}{caret} + 234 + 123 diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Seq 04.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Seq 04.fs.gold new file mode 100644 index 0000000000..66043805cd --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Seq 04.fs.gold @@ -0,0 +1,5 @@ +Suggested names: i +do + let i = 123 + 234 + 123 diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Simple 03.fs b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Simple 03.fs new file mode 100644 index 0000000000..e1a32135d9 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Simple 03.fs @@ -0,0 +1,2 @@ +do + {selstart}1{selend}{caret} diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Simple 03.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Simple 03.fs.gold new file mode 100644 index 0000000000..d829ff1e80 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Simple 03.fs.gold @@ -0,0 +1,3 @@ +Suggested names: i +do + let i = 1 diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Single line - If 01.fs b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Single line - If 01.fs new file mode 100644 index 0000000000..7494148319 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Single line - If 01.fs @@ -0,0 +1,2 @@ +do + if true then {selstart}1{selend}{caret} else 2 \ No newline at end of file diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Single line - If 01.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Single line - If 01.fs.gold new file mode 100644 index 0000000000..a2a6ff68c9 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Single line - If 01.fs.gold @@ -0,0 +1,3 @@ +Suggested names: i +do + if true then let i = 1 in i else 2 \ No newline at end of file diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Single line - Lambda 01.fs b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Single line - Lambda 01.fs new file mode 100644 index 0000000000..bfdb36b5bc --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Single line - Lambda 01.fs @@ -0,0 +1,2 @@ +do + let x = fun _ -> 1 + {selstart}1{selend}{caret} \ No newline at end of file diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Single line - Lambda 01.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Single line - Lambda 01.fs.gold new file mode 100644 index 0000000000..36c1600b66 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Single line - Lambda 01.fs.gold @@ -0,0 +1,3 @@ +Suggested names: i +do + let x = fun _ -> let i = 1 in 1 + i \ No newline at end of file diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Single line - Match 01.fs b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Single line - Match 01.fs new file mode 100644 index 0000000000..8c348bf990 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Single line - Match 01.fs @@ -0,0 +1,2 @@ +do + match () with | _ -> {selstart}true{selend}{caret} diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Single line - Match 01.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Single line - Match 01.fs.gold new file mode 100644 index 0000000000..8d9b125b61 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Single line - Match 01.fs.gold @@ -0,0 +1,3 @@ +Suggested names: boolean +do + match () with | _ -> let boolean = true in boolean diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Single line - Match 02 - Parens.fs b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Single line - Match 02 - Parens.fs new file mode 100644 index 0000000000..a9b330af35 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Single line - Match 02 - Parens.fs @@ -0,0 +1,2 @@ +do + match () with | _ -> ({selstart}true{selend}{caret}) diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Single line - Match 02 - Parens.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Single line - Match 02 - Parens.fs.gold new file mode 100644 index 0000000000..0ef4dd4496 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Single line - Match 02 - Parens.fs.gold @@ -0,0 +1,3 @@ +Suggested names: boolean +do + match () with | _ -> let boolean = true in (boolean) diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Single line - When 01.fs b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Single line - When 01.fs new file mode 100644 index 0000000000..975202f963 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Single line - When 01.fs @@ -0,0 +1,3 @@ +do + match () with + | _ when {selstart}true{selend}{caret} -> () diff --git a/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Single line - When 01.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Single line - When 01.fs.gold new file mode 100644 index 0000000000..7fa3ec056c --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/introduceVar/Single line - When 01.fs.gold @@ -0,0 +1,4 @@ +Suggested names: boolean +do + match () with + | _ when let boolean = true in boolean -> () diff --git a/ReSharper.FSharp/test/data/features/refactorings/rename/Ctor params 01.fs b/ReSharper.FSharp/test/data/features/refactorings/rename/Ctor params 01.fs new file mode 100644 index 0000000000..50cfcd8752 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/rename/Ctor params 01.fs @@ -0,0 +1,4 @@ +module Module + +type T(a: int) = + let b = a{caret} diff --git a/ReSharper.FSharp/test/data/features/refactorings/rename/Ctor params 01.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/rename/Ctor params 01.fs.gold new file mode 100644 index 0000000000..434c8c9e81 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/rename/Ctor params 01.fs.gold @@ -0,0 +1,4 @@ +module Module + +type T(zzz: int) = + let b = zzz diff --git a/ReSharper.FSharp/test/data/features/refactorings/rename/Ctor params 02.fs b/ReSharper.FSharp/test/data/features/refactorings/rename/Ctor params 02.fs new file mode 100644 index 0000000000..f5c5961130 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/rename/Ctor params 02.fs @@ -0,0 +1,4 @@ +module Module + +type T({caret}a: int) = + let b = a diff --git a/ReSharper.FSharp/test/data/features/refactorings/rename/Ctor params 02.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/rename/Ctor params 02.fs.gold new file mode 100644 index 0000000000..434c8c9e81 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/rename/Ctor params 02.fs.gold @@ -0,0 +1,4 @@ +module Module + +type T(zzz: int) = + let b = zzz diff --git a/ReSharper.FSharp/test/data/features/refactorings/rename/Ctor params 03.fs b/ReSharper.FSharp/test/data/features/refactorings/rename/Ctor params 03.fs new file mode 100644 index 0000000000..ce1350189f --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/rename/Ctor params 03.fs @@ -0,0 +1,4 @@ +module Module + +type T(a) = + let b = a{caret} diff --git a/ReSharper.FSharp/test/data/features/refactorings/rename/Ctor params 03.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/rename/Ctor params 03.fs.gold new file mode 100644 index 0000000000..d8b5d1584b --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/rename/Ctor params 03.fs.gold @@ -0,0 +1,4 @@ +module Module + +type T(zzz) = + let b = zzz diff --git a/ReSharper.FSharp/test/data/features/refactorings/rename/Error - If 01.fs b/ReSharper.FSharp/test/data/features/refactorings/rename/Error - If 01.fs new file mode 100644 index 0000000000..e1cd9c08de --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/rename/Error - If 01.fs @@ -0,0 +1,2 @@ +let x{caret} = true +if x diff --git a/ReSharper.FSharp/test/data/features/refactorings/rename/Error - If 01.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/rename/Error - If 01.fs.gold new file mode 100644 index 0000000000..fa9a9562e2 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/rename/Error - If 01.fs.gold @@ -0,0 +1,2 @@ +let zzz = true +if zzz diff --git a/ReSharper.FSharp/test/data/features/refactorings/rename/Union Case Field - Pattern param 02.fs b/ReSharper.FSharp/test/data/features/refactorings/rename/Union Case Field - Pattern param 02.fs new file mode 100644 index 0000000000..a50df788fc --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/rename/Union Case Field - Pattern param 02.fs @@ -0,0 +1,8 @@ +module Module + +type U = + | C of f: int * g{caret}: int + +match C(1, 2) with +| C (f = f; g = g) -> () +| _ -> () diff --git a/ReSharper.FSharp/test/data/features/refactorings/rename/Union Case Field - Pattern param 02.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/rename/Union Case Field - Pattern param 02.fs.gold new file mode 100644 index 0000000000..755793fc75 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/rename/Union Case Field - Pattern param 02.fs.gold @@ -0,0 +1,11 @@ +CONFLICTS FOUND: +Warning Module.U.C.zzz will hide Module.U.C.zzz +========== +module Module + +type U = + | C of f: int * zzz: int + +match C(1, 2) with +| C (f = f; zzz = g) -> () +| _ -> () diff --git a/ReSharper.FSharp/test/data/features/refactorings/rename/Union Case Field - Pattern param 03 - Pat.fs b/ReSharper.FSharp/test/data/features/refactorings/rename/Union Case Field - Pattern param 03 - Pat.fs new file mode 100644 index 0000000000..f5c2e141b9 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/rename/Union Case Field - Pattern param 03 - Pat.fs @@ -0,0 +1,8 @@ +module Module + +type U = + | C of f: int * g: int + +match C(1, 2) with +| C (f = f; g = {caret}g) -> g |> ignore +| _ -> () diff --git a/ReSharper.FSharp/test/data/features/refactorings/rename/Union Case Field - Pattern param 03 - Pat.fs.gold b/ReSharper.FSharp/test/data/features/refactorings/rename/Union Case Field - Pattern param 03 - Pat.fs.gold new file mode 100644 index 0000000000..df07483b59 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/refactorings/rename/Union Case Field - Pattern param 03 - Pat.fs.gold @@ -0,0 +1,8 @@ +module Module + +type U = + | C of f: int * g: int + +match C(1, 2) with +| C (f = f; g = zzz) -> zzz |> ignore +| _ -> () diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Attribute 01 - Multiple args.fs b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 01 - Multiple args.fs new file mode 100644 index 0000000000..425d85ffa0 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 01 - Multiple args.fs @@ -0,0 +1,4 @@ +open System.ComponentModel + +[<{selstart}DefaultValue(typeof, "hi"){selend}>] +let x = "" diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Attribute 01 - Multiple args.gold b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 01 - Multiple args.gold new file mode 100644 index 0000000000..7a735b238b --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 01 - Multiple args.gold @@ -0,0 +1,8 @@ +open System.ComponentModel + +[|(arg #0), |"hi"|(arg #1))>] +let x = "" + +--------------------------------------------------------- +(arg #0) => type +(arg #1) => value diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Attribute 02 - Single arg - no parens.fs b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 02 - Single arg - no parens.fs new file mode 100644 index 0000000000..89a6a4b615 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 02 - Single arg - no parens.fs @@ -0,0 +1,4 @@ +open System.ComponentModel + +[<{selstart}Description "hi"{selend}>] +let x = "" diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Attribute 02 - Single arg - no parens.gold b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 02 - Single arg - no parens.gold new file mode 100644 index 0000000000..87901fd3df --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 02 - Single arg - no parens.gold @@ -0,0 +1,7 @@ +open System.ComponentModel + +[] +let x = "" + +--------------------------------------------------------- +(arg #0) => description diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Attribute 03 - Single arg - parens.fs b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 03 - Single arg - parens.fs new file mode 100644 index 0000000000..25af20c869 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 03 - Single arg - parens.fs @@ -0,0 +1,4 @@ +open System.ComponentModel + +[<{selstart}Description("hi"){selend}>] +let x = "" diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Attribute 03 - Single arg - parens.gold b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 03 - Single arg - parens.gold new file mode 100644 index 0000000000..d57d2f1744 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 03 - Single arg - parens.gold @@ -0,0 +1,7 @@ +open System.ComponentModel + +[] +let x = "" + +--------------------------------------------------------- +(arg #0) => description diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Attribute 04 - No args - no parens.fs b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 04 - No args - no parens.fs new file mode 100644 index 0000000000..addd98758c --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 04 - No args - no parens.fs @@ -0,0 +1,4 @@ +open System.ComponentModel + +[<{selstart}Description{selend}>] +let x = "" diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Attribute 04 - No args - no parens.gold b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 04 - No args - no parens.gold new file mode 100644 index 0000000000..5e7c9322ff --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 04 - No args - no parens.gold @@ -0,0 +1,6 @@ +open System.ComponentModel + +[] +let x = "" + +--------------------------------------------------------- diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Attribute 05 - No args - parens.fs b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 05 - No args - parens.fs new file mode 100644 index 0000000000..9cf9c2d56f --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 05 - No args - parens.fs @@ -0,0 +1,4 @@ +open System.ComponentModel + +[<{selstart}Description(){selend}>] +let x = "" diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Attribute 05 - No args - parens.gold b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 05 - No args - parens.gold new file mode 100644 index 0000000000..118f726273 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 05 - No args - parens.gold @@ -0,0 +1,6 @@ +open System.ComponentModel + +[] +let x = "" + +--------------------------------------------------------- diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Compiled 01 - FSharpCore.fs b/ReSharper.FSharp/test/data/features/service/arguments/Compiled 01 - FSharpCore.fs new file mode 100644 index 0000000000..8e8628e594 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Compiled 01 - FSharpCore.fs @@ -0,0 +1 @@ +{selstart}List.length ["hi"; "there"]{selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Compiled 01 - FSharpCore.gold b/ReSharper.FSharp/test/data/features/service/arguments/Compiled 01 - FSharpCore.gold new file mode 100644 index 0000000000..8eff7257a4 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Compiled 01 - FSharpCore.gold @@ -0,0 +1,4 @@ +List.length |["hi"; "there"]|(arg #0) + +--------------------------------------------------------- +(arg #0) => list diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Compiled 02 - BCL.fs b/ReSharper.FSharp/test/data/features/service/arguments/Compiled 02 - BCL.fs new file mode 100644 index 0000000000..6320cc70f2 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Compiled 02 - BCL.fs @@ -0,0 +1,2 @@ +open System.Drawing +{selstart}Color.FromArgb (123, 100, 50){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Compiled 02 - BCL.gold b/ReSharper.FSharp/test/data/features/service/arguments/Compiled 02 - BCL.gold new file mode 100644 index 0000000000..e31db3ba8c --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Compiled 02 - BCL.gold @@ -0,0 +1,7 @@ +open System.Drawing +Color.FromArgb (|123|(arg #0), |100|(arg #1), |50|(arg #2)) + +--------------------------------------------------------- +(arg #0) => red +(arg #1) => green +(arg #2) => blue diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Constructor 01 - No args.fs b/ReSharper.FSharp/test/data/features/service/arguments/Constructor 01 - No args.fs new file mode 100644 index 0000000000..d9f76f8a95 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Constructor 01 - No args.fs @@ -0,0 +1,4 @@ +type MyType () = + class end + +{selstart}MyType(){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Constructor 01 - No args.gold b/ReSharper.FSharp/test/data/features/service/arguments/Constructor 01 - No args.gold new file mode 100644 index 0000000000..da7e636f2e --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Constructor 01 - No args.gold @@ -0,0 +1,6 @@ +type MyType () = + class end + +MyType() + +--------------------------------------------------------- diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Constructor 02 - Single arg.fs b/ReSharper.FSharp/test/data/features/service/arguments/Constructor 02 - Single arg.fs new file mode 100644 index 0000000000..918e6c5cf3 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Constructor 02 - Single arg.fs @@ -0,0 +1,4 @@ +type MyType (foo: string) = + class end + +{selstart}MyType("test"){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Constructor 02 - Single arg.gold b/ReSharper.FSharp/test/data/features/service/arguments/Constructor 02 - Single arg.gold new file mode 100644 index 0000000000..cf4d65e601 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Constructor 02 - Single arg.gold @@ -0,0 +1,7 @@ +type MyType (|foo|(param #0): string) = + class end + +MyType(|"test"|(arg #0)) + +--------------------------------------------------------- +(arg #0) => foo diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Constructor 03 - Multiple args.fs b/ReSharper.FSharp/test/data/features/service/arguments/Constructor 03 - Multiple args.fs new file mode 100644 index 0000000000..b5a7f83bfb --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Constructor 03 - Multiple args.fs @@ -0,0 +1,4 @@ +type MyType (foo: string, i: int) = + class end + +{selstart}MyType("test", 15){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Constructor 03 - Multiple args.gold b/ReSharper.FSharp/test/data/features/service/arguments/Constructor 03 - Multiple args.gold new file mode 100644 index 0000000000..d7d3cfec5f --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Constructor 03 - Multiple args.gold @@ -0,0 +1,8 @@ +type MyType (|foo|(param #0): string, |i|(param #1): int) = + class end + +MyType(|"test"|(arg #0), |15|(arg #1)) + +--------------------------------------------------------- +(arg #0) => foo +(arg #1) => i diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL 01 - No args.fs b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL 01 - No args.fs new file mode 100644 index 0000000000..b752668921 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL 01 - No args.fs @@ -0,0 +1,6 @@ +module Mod + +open System.Linq + +let x = Seq.empty +{selstart}x.Single(){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL 01 - No args.gold b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL 01 - No args.gold new file mode 100644 index 0000000000..fe06259674 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL 01 - No args.gold @@ -0,0 +1,8 @@ +module Mod + +open System.Linq + +let x = Seq.empty +x.Single() + +--------------------------------------------------------- diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL 02 - Single arg.fs b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL 02 - Single arg.fs new file mode 100644 index 0000000000..1b4e57b40f --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL 02 - Single arg.fs @@ -0,0 +1,6 @@ +module Mod + +open System.Linq + +let x = Seq.empty +{selstart}x.Single (fun x -> true){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL 02 - Single arg.gold b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL 02 - Single arg.gold new file mode 100644 index 0000000000..66b4dd75b7 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL 02 - Single arg.gold @@ -0,0 +1,9 @@ +module Mod + +open System.Linq + +let x = Seq.empty +x.Single (|fun x -> true|(arg #0)) + +--------------------------------------------------------- +(arg #0) => predicate diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL 03 - Tupled args.fs b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL 03 - Tupled args.fs new file mode 100644 index 0000000000..6ce13cbb1c --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL 03 - Tupled args.fs @@ -0,0 +1,6 @@ +module Mod + +open System.Linq + +let x = Seq.empty +{selstart}x.ToDictionary((fun (x, y) -> x), (fun (x, y) -> y)){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL 03 - Tupled args.gold b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL 03 - Tupled args.gold new file mode 100644 index 0000000000..f22fc35882 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL 03 - Tupled args.gold @@ -0,0 +1,10 @@ +module Mod + +open System.Linq + +let x = Seq.empty +x.ToDictionary(|(fun (x, y) -> x)|(arg #0), |(fun (x, y) -> y)|(arg #1)) + +--------------------------------------------------------- +(arg #0) => keySelector +(arg #1) => elementSelector diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL Direct 01 - No args.fs b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL Direct 01 - No args.fs new file mode 100644 index 0000000000..1c550bb865 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL Direct 01 - No args.fs @@ -0,0 +1,6 @@ +module Mod + +open System.Linq + +let x = Seq.empty +{selstart}Enumerable.Single(x){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL Direct 01 - No args.gold b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL Direct 01 - No args.gold new file mode 100644 index 0000000000..16790b947a --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL Direct 01 - No args.gold @@ -0,0 +1,9 @@ +module Mod + +open System.Linq + +let x = Seq.empty +Enumerable.Single(|x|(arg #0)) + +--------------------------------------------------------- +(arg #0) => source diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL Direct 02 - Single arg.fs b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL Direct 02 - Single arg.fs new file mode 100644 index 0000000000..45a15b0e28 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL Direct 02 - Single arg.fs @@ -0,0 +1,6 @@ +module Mod + +open System.Linq + +let x = Seq.empty +{selstart}Enumerable.Single (x, fun x -> true){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL Direct 02 - Single arg.gold b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL Direct 02 - Single arg.gold new file mode 100644 index 0000000000..49ff479e68 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL Direct 02 - Single arg.gold @@ -0,0 +1,10 @@ +module Mod + +open System.Linq + +let x = Seq.empty +Enumerable.Single (|x|(arg #0), |fun x -> true|(arg #1)) + +--------------------------------------------------------- +(arg #0) => source +(arg #1) => predicate diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL Direct 03 - Tupled args.fs b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL Direct 03 - Tupled args.fs new file mode 100644 index 0000000000..bce63d1a57 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL Direct 03 - Tupled args.fs @@ -0,0 +1,6 @@ +module Mod + +open System.Linq + +let x = Seq.empty +{selstart}Enumerable.ToDictionary(x, (fun (x, y) -> x), (fun (x, y) -> y)){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL Direct 03 - Tupled args.gold b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL Direct 03 - Tupled args.gold new file mode 100644 index 0000000000..be28989eb8 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL Direct 03 - Tupled args.gold @@ -0,0 +1,11 @@ +module Mod + +open System.Linq + +let x = Seq.empty +Enumerable.ToDictionary(|x|(arg #0), |(fun (x, y) -> x)|(arg #1), |(fun (x, y) -> y)|(arg #2)) + +--------------------------------------------------------- +(arg #0) => source +(arg #1) => keySelector +(arg #2) => elementSelector diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp 01 - No args.fs b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp 01 - No args.fs new file mode 100644 index 0000000000..12d4e09225 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp 01 - No args.fs @@ -0,0 +1,13 @@ +module Mod + +open System.IO +open System.Runtime.CompilerServices + +[] +type FileExt = + [] + static member CreateDirectory (fileInfo: FileInfo) = + Directory.CreateDirectory fileInfo.Directory.FullName + +let x = FileInfo "abc.txt" +{selstart}x.CreateDirectory(){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp 01 - No args.gold b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp 01 - No args.gold new file mode 100644 index 0000000000..ec5822bea3 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp 01 - No args.gold @@ -0,0 +1,15 @@ +module Mod + +open System.IO +open System.Runtime.CompilerServices + +[] +type FileExt = + [] + static member CreateDirectory (fileInfo: FileInfo) = + Directory.CreateDirectory fileInfo.Directory.FullName + +let x = FileInfo "abc.txt" +x.CreateDirectory() + +--------------------------------------------------------- diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp 02 - Single arg.fs b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp 02 - Single arg.fs new file mode 100644 index 0000000000..41e5ea13a0 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp 02 - Single arg.fs @@ -0,0 +1,13 @@ +module Mod + +open System.IO +open System.Runtime.CompilerServices + +[] +type FileExt = + [] + static member CreateDirectory (fileInfo: FileInfo, safe: bool) = + Directory.CreateDirectory fileInfo.Directory.FullName + +let x = FileInfo "abc.txt" +{selstart}x.CreateDirectory (true){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp 02 - Single arg.gold b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp 02 - Single arg.gold new file mode 100644 index 0000000000..797b73f85b --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp 02 - Single arg.gold @@ -0,0 +1,16 @@ +module Mod + +open System.IO +open System.Runtime.CompilerServices + +[] +type FileExt = + [] + static member CreateDirectory (fileInfo: FileInfo, |safe|(param #0): bool) = + Directory.CreateDirectory fileInfo.Directory.FullName + +let x = FileInfo "abc.txt" +x.CreateDirectory (|true|(arg #0)) + +--------------------------------------------------------- +(arg #0) => safe diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp 03 - Tupled args.fs b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp 03 - Tupled args.fs new file mode 100644 index 0000000000..caa8403cc6 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp 03 - Tupled args.fs @@ -0,0 +1,13 @@ +module Mod + +open System.IO +open System.Runtime.CompilerServices + +[] +type FileExt = + [] + static member CreateDirectory (fileInfo: FileInfo, safe: bool, s: string) = + Directory.CreateDirectory fileInfo.Directory.FullName + +let x = FileInfo "abc.txt" +{selstart}x.CreateDirectory (true, "hi"){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp 03 - Tupled args.gold b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp 03 - Tupled args.gold new file mode 100644 index 0000000000..7b66704c1f --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp 03 - Tupled args.gold @@ -0,0 +1,17 @@ +module Mod + +open System.IO +open System.Runtime.CompilerServices + +[] +type FileExt = + [] + static member CreateDirectory (fileInfo: FileInfo, |safe|(param #0): bool, |s|(param #1): string) = + Directory.CreateDirectory fileInfo.Directory.FullName + +let x = FileInfo "abc.txt" +x.CreateDirectory (|true|(arg #0), |"hi"|(arg #1)) + +--------------------------------------------------------- +(arg #0) => safe +(arg #1) => s diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp Direct 01 - No args.fs b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp Direct 01 - No args.fs new file mode 100644 index 0000000000..7ccc3b90c4 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp Direct 01 - No args.fs @@ -0,0 +1,13 @@ +module Mod + +open System.IO +open System.Runtime.CompilerServices + +[] +type FileExt = + [] + static member CreateDirectory (fileInfo: FileInfo) = + Directory.CreateDirectory fileInfo.Directory.FullName + +let x = FileInfo "abc.txt" +{selstart}FileExt.CreateDirectory(x){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp Direct 01 - No args.gold b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp Direct 01 - No args.gold new file mode 100644 index 0000000000..55871bf76c --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp Direct 01 - No args.gold @@ -0,0 +1,16 @@ +module Mod + +open System.IO +open System.Runtime.CompilerServices + +[] +type FileExt = + [] + static member CreateDirectory (|fileInfo|(param #0): FileInfo) = + Directory.CreateDirectory fileInfo.Directory.FullName + +let x = FileInfo "abc.txt" +FileExt.CreateDirectory(|x|(arg #0)) + +--------------------------------------------------------- +(arg #0) => fileInfo diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp Direct 02 - Single arg.fs b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp Direct 02 - Single arg.fs new file mode 100644 index 0000000000..9dc2139615 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp Direct 02 - Single arg.fs @@ -0,0 +1,13 @@ +module Mod + +open System.IO +open System.Runtime.CompilerServices + +[] +type FileExt = + [] + static member CreateDirectory (fileInfo: FileInfo, safe: bool) = + Directory.CreateDirectory fileInfo.Directory.FullName + +let x = FileInfo "abc.txt" +{selstart}FileExt.CreateDirectory (x, true){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp Direct 02 - Single arg.gold b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp Direct 02 - Single arg.gold new file mode 100644 index 0000000000..7a598b511f --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp Direct 02 - Single arg.gold @@ -0,0 +1,17 @@ +module Mod + +open System.IO +open System.Runtime.CompilerServices + +[] +type FileExt = + [] + static member CreateDirectory (|fileInfo|(param #0): FileInfo, |safe|(param #1): bool) = + Directory.CreateDirectory fileInfo.Directory.FullName + +let x = FileInfo "abc.txt" +FileExt.CreateDirectory (|x|(arg #0), |true|(arg #1)) + +--------------------------------------------------------- +(arg #0) => fileInfo +(arg #1) => safe diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp Direct 03 - Tupled args.fs b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp Direct 03 - Tupled args.fs new file mode 100644 index 0000000000..90c6ed4185 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp Direct 03 - Tupled args.fs @@ -0,0 +1,13 @@ +module Mod + +open System.IO +open System.Runtime.CompilerServices + +[] +type FileExt = + [] + static member CreateDirectory (fileInfo: FileInfo, safe: bool, x: string) = + Directory.CreateDirectory fileInfo.Directory.FullName + +let x = FileInfo "abc.txt" +{selstart}FileExt.CreateDirectory (x, true, "hi"){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp Direct 03 - Tupled args.gold b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp Direct 03 - Tupled args.gold new file mode 100644 index 0000000000..64b81a84d1 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp Direct 03 - Tupled args.gold @@ -0,0 +1,18 @@ +module Mod + +open System.IO +open System.Runtime.CompilerServices + +[] +type FileExt = + [] + static member CreateDirectory (|fileInfo|(param #0): FileInfo, |safe|(param #1): bool, |x|(param #2): string) = + Directory.CreateDirectory fileInfo.Directory.FullName + +let x = FileInfo "abc.txt" +FileExt.CreateDirectory (|x|(arg #0), |true|(arg #1), |"hi"|(arg #2)) + +--------------------------------------------------------- +(arg #0) => fileInfo +(arg #1) => safe +(arg #2) => x diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 01 - No args.fs b/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 01 - No args.fs new file mode 100644 index 0000000000..39ad7572a3 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 01 - No args.fs @@ -0,0 +1,12 @@ +module Mod + +open System.IO + +[] +module FileExt = + type FileInfo with + member this.CreateDirectory () = + Directory.CreateDirectory this.Directory.FullName + +let x = FileInfo "abc.txt" +{selstart}x.CreateDirectory(){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 01 - No args.gold b/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 01 - No args.gold new file mode 100644 index 0000000000..b92dd1e30a --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 01 - No args.gold @@ -0,0 +1,14 @@ +module Mod + +open System.IO + +[] +module FileExt = + type FileInfo with + member this.CreateDirectory () = + Directory.CreateDirectory this.Directory.FullName + +let x = FileInfo "abc.txt" +x.CreateDirectory() + +--------------------------------------------------------- diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 02 - Single arg.fs b/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 02 - Single arg.fs new file mode 100644 index 0000000000..15c89912fc --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 02 - Single arg.fs @@ -0,0 +1,12 @@ +module Mod + +open System.IO + +[] +module FileExt = + type FileInfo with + member this.CreateDirectory (safe: bool) = + Directory.CreateDirectory this.Directory.FullName + +let x = FileInfo "abc.txt" +{selstart}x.CreateDirectory (true){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 02 - Single arg.gold b/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 02 - Single arg.gold new file mode 100644 index 0000000000..d62de54c08 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 02 - Single arg.gold @@ -0,0 +1,15 @@ +module Mod + +open System.IO + +[] +module FileExt = + type FileInfo with + member this.CreateDirectory (|safe|(param #0): bool) = + Directory.CreateDirectory this.Directory.FullName + +let x = FileInfo "abc.txt" +x.CreateDirectory (|true|(arg #0)) + +--------------------------------------------------------- +(arg #0) => safe diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 03 - Curried args.fs b/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 03 - Curried args.fs new file mode 100644 index 0000000000..be75ea0274 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 03 - Curried args.fs @@ -0,0 +1,12 @@ +module Mod + +open System.IO + +[] +module FileExt = + type FileInfo with + member this.CreateDirectory (safe: bool) (x: string) = + Directory.CreateDirectory this.Directory.FullName + +let x = FileInfo "abc.txt" +{selstart}x.CreateDirectory true "hi"{selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 03 - Curried args.gold b/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 03 - Curried args.gold new file mode 100644 index 0000000000..36b2c9b6c3 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 03 - Curried args.gold @@ -0,0 +1,16 @@ +module Mod + +open System.IO + +[] +module FileExt = + type FileInfo with + member this.CreateDirectory (|safe|(param #0): bool) (|x|(param #1): string) = + Directory.CreateDirectory this.Directory.FullName + +let x = FileInfo "abc.txt" +x.CreateDirectory |true|(arg #0) |"hi"|(arg #1) + +--------------------------------------------------------- +(arg #0) => safe +(arg #1) => x diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 04 - Tupled args.fs b/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 04 - Tupled args.fs new file mode 100644 index 0000000000..56e000a147 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 04 - Tupled args.fs @@ -0,0 +1,12 @@ +module Mod + +open System.IO + +[] +module FileExt = + type FileInfo with + member this.CreateDirectory (safe: bool, x: string) = + Directory.CreateDirectory this.Directory.FullName + +let x = FileInfo "abc.txt" +{selstart}x.CreateDirectory (true, "hi"){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 04 - Tupled args.gold b/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 04 - Tupled args.gold new file mode 100644 index 0000000000..5ef78d531d --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 04 - Tupled args.gold @@ -0,0 +1,16 @@ +module Mod + +open System.IO + +[] +module FileExt = + type FileInfo with + member this.CreateDirectory (|safe|(param #0): bool, |x|(param #1): string) = + Directory.CreateDirectory this.Directory.FullName + +let x = FileInfo "abc.txt" +x.CreateDirectory (|true|(arg #0), |"hi"|(arg #1)) + +--------------------------------------------------------- +(arg #0) => safe +(arg #1) => x diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Generic 01 - Module.fs b/ReSharper.FSharp/test/data/features/service/arguments/Generic 01 - Module.fs new file mode 100644 index 0000000000..4fa7c8f841 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Generic 01 - Module.fs @@ -0,0 +1,4 @@ +module Mod = + let log<'a> (x : 'a) = sprintf "%O" x + +{selstart}Mod.log "hello"{selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Generic 01 - Module.gold b/ReSharper.FSharp/test/data/features/service/arguments/Generic 01 - Module.gold new file mode 100644 index 0000000000..da6ad3cad3 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Generic 01 - Module.gold @@ -0,0 +1,7 @@ +module Mod = + let log<'a> (|x|(param #0) : 'a) = sprintf "%O" x + +Mod.log |"hello"|(arg #0) + +--------------------------------------------------------- +(arg #0) => x diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Generic 02 - Static method.fs b/ReSharper.FSharp/test/data/features/service/arguments/Generic 02 - Static method.fs new file mode 100644 index 0000000000..12f811a893 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Generic 02 - Static method.fs @@ -0,0 +1,4 @@ +type C () = + static member Log<'a> (x : 'a) = sprintf "%O" x + +{selstart}C.Log "hello"{selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Generic 02 - Static method.gold b/ReSharper.FSharp/test/data/features/service/arguments/Generic 02 - Static method.gold new file mode 100644 index 0000000000..3428c1bf91 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Generic 02 - Static method.gold @@ -0,0 +1,7 @@ +type C () = + static member Log<'a> (|x|(param #0) : 'a) = sprintf "%O" x + +C.Log |"hello"|(arg #0) + +--------------------------------------------------------- +(arg #0) => x diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Misc 01 - No args.fs b/ReSharper.FSharp/test/data/features/service/arguments/Misc 01 - No args.fs new file mode 100644 index 0000000000..04b55b7bcf --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Misc 01 - No args.fs @@ -0,0 +1,2 @@ +let f () = () +{selstart}f (){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Misc 01 - No args.gold b/ReSharper.FSharp/test/data/features/service/arguments/Misc 01 - No args.gold new file mode 100644 index 0000000000..376ae7330d --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Misc 01 - No args.gold @@ -0,0 +1,4 @@ +let f () = () +f () + +--------------------------------------------------------- diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Misc 02 - Too many args.fs b/ReSharper.FSharp/test/data/features/service/arguments/Misc 02 - Too many args.fs new file mode 100644 index 0000000000..8cd20ef0ba --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Misc 02 - Too many args.fs @@ -0,0 +1,2 @@ +let f () = () +{selstart}f 123{selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Misc 02 - Too many args.gold b/ReSharper.FSharp/test/data/features/service/arguments/Misc 02 - Too many args.gold new file mode 100644 index 0000000000..5b0d1001c9 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Misc 02 - Too many args.gold @@ -0,0 +1,4 @@ +let f () = () +f 123 + +--------------------------------------------------------- diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Multiple 01 - Curried.fs b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 01 - Curried.fs new file mode 100644 index 0000000000..2c5dee18d3 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 01 - Curried.fs @@ -0,0 +1,3 @@ +let f a b c = a + b + c + +{selstart}f 1 2 3{selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Multiple 01 - Curried.gold b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 01 - Curried.gold new file mode 100644 index 0000000000..6301954511 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 01 - Curried.gold @@ -0,0 +1,8 @@ +let f |a|(param #0) |b|(param #1) |c|(param #2) = a + b + c + +f |1|(arg #0) |2|(arg #1) |3|(arg #2) + +--------------------------------------------------------- +(arg #0) => a +(arg #1) => b +(arg #2) => c diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Multiple 02 - Tupled.fs b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 02 - Tupled.fs new file mode 100644 index 0000000000..250013b081 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 02 - Tupled.fs @@ -0,0 +1,5 @@ +module Module + +let f (a, b, c) = a + b + c + +{selstart}f(1, 2, 3){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Multiple 02 - Tupled.gold b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 02 - Tupled.gold new file mode 100644 index 0000000000..4eeb01c686 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 02 - Tupled.gold @@ -0,0 +1,10 @@ +module Module + +let f (|a|(param #0), |b|(param #1), |c|(param #2)) = a + b + c + +f(|1|(arg #0), |2|(arg #1), |3|(arg #2)) + +--------------------------------------------------------- +(arg #0) => a +(arg #1) => b +(arg #2) => c diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Multiple 03 - Curried fun in paren.fs b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 03 - Curried fun in paren.fs new file mode 100644 index 0000000000..4566fbff67 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 03 - Curried fun in paren.fs @@ -0,0 +1,3 @@ +let f a b c = a + b + c + +{selstart}(f 1) 2 3{selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Multiple 03 - Curried fun in paren.gold b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 03 - Curried fun in paren.gold new file mode 100644 index 0000000000..fb7aedba9c --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 03 - Curried fun in paren.gold @@ -0,0 +1,8 @@ +let f |a|(param #0) |b|(param #1) |c|(param #2) = a + b + c + +(f |1|(arg #0)) |2|(arg #1) |3|(arg #2) + +--------------------------------------------------------- +(arg #0) => a +(arg #1) => b +(arg #2) => c diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Multiple 04 - Curried arg in paren.fs b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 04 - Curried arg in paren.fs new file mode 100644 index 0000000000..c72f26bde3 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 04 - Curried arg in paren.fs @@ -0,0 +1,3 @@ +let f a b c = a + b + c + +{selstart}f (1) 2 (3){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Multiple 04 - Curried arg in paren.gold b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 04 - Curried arg in paren.gold new file mode 100644 index 0000000000..94b6d958ba --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 04 - Curried arg in paren.gold @@ -0,0 +1,8 @@ +let f |a|(param #0) |b|(param #1) |c|(param #2) = a + b + c + +f (|1|(arg #0)) |2|(arg #1) (|3|(arg #2)) + +--------------------------------------------------------- +(arg #0) => a +(arg #1) => b +(arg #2) => c diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Multiple 05 - Tupled - too few.fs b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 05 - Tupled - too few.fs new file mode 100644 index 0000000000..d3bef82ce6 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 05 - Tupled - too few.fs @@ -0,0 +1,5 @@ +module Module + +let f (a, b, c) = a + b + c + +{selstart}f(1, 2){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Multiple 05 - Tupled - too few.gold b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 05 - Tupled - too few.gold new file mode 100644 index 0000000000..adac191e3d --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 05 - Tupled - too few.gold @@ -0,0 +1,9 @@ +module Module + +let f (|a|(param #0), |b|(param #1), c) = a + b + c + +f(|1|(arg #0), |2|(arg #1)) + +--------------------------------------------------------- +(arg #0) => a +(arg #1) => b diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Multiple 06 - Tupled - too many.fs b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 06 - Tupled - too many.fs new file mode 100644 index 0000000000..4cde5368f7 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 06 - Tupled - too many.fs @@ -0,0 +1,5 @@ +module Module + +let f (a, b, c) = a + b + c + +{selstart}f(1, 2, 3, 4){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Multiple 06 - Tupled - too many.gold b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 06 - Tupled - too many.gold new file mode 100644 index 0000000000..24d8dc7d45 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 06 - Tupled - too many.gold @@ -0,0 +1,10 @@ +module Module + +let f (|a|(param #0), |b|(param #1), |c|(param #2)) = a + b + c + +f(|1|(arg #0), |2|(arg #1), |3|(arg #2), 4) + +--------------------------------------------------------- +(arg #0) => a +(arg #1) => b +(arg #2) => c diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Multiple 07 - Curried - partial.fs b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 07 - Curried - partial.fs new file mode 100644 index 0000000000..f42b38b37f --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 07 - Curried - partial.fs @@ -0,0 +1,3 @@ +let f a b c = a + b + c + +{selstart}f 1 2{selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Multiple 07 - Curried - partial.gold b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 07 - Curried - partial.gold new file mode 100644 index 0000000000..9c0cbca957 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 07 - Curried - partial.gold @@ -0,0 +1,7 @@ +let f |a|(param #0) |b|(param #1) c = a + b + c + +f |1|(arg #0) |2|(arg #1) + +--------------------------------------------------------- +(arg #0) => a +(arg #1) => b diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Multiple 08 - Curried - too many.fs b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 08 - Curried - too many.fs new file mode 100644 index 0000000000..530d9161af --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 08 - Curried - too many.fs @@ -0,0 +1,3 @@ +let f a b c = a + b + c + +{selstart}f 1 2 3 4{selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Multiple 08 - Curried - too many.gold b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 08 - Curried - too many.gold new file mode 100644 index 0000000000..4ead544dc9 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 08 - Curried - too many.gold @@ -0,0 +1,8 @@ +let f |a|(param #0) |b|(param #1) |c|(param #2) = a + b + c + +f |1|(arg #0) |2|(arg #1) |3|(arg #2) 4 + +--------------------------------------------------------- +(arg #0) => a +(arg #1) => b +(arg #2) => c diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Named arg 01 - BCL.fs b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 01 - BCL.fs new file mode 100644 index 0000000000..badeee7991 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 01 - BCL.fs @@ -0,0 +1,3 @@ +open System.Drawing + +{selstart}Color.FromArgb(120, blue=60, green=70){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Named arg 01 - BCL.gold b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 01 - BCL.gold new file mode 100644 index 0000000000..95731bfbd4 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 01 - BCL.gold @@ -0,0 +1,8 @@ +open System.Drawing + +Color.FromArgb(|120|(arg #0), |blue=60|(arg #1), |green=70|(arg #2)) + +--------------------------------------------------------- +(arg #0) => red +(arg #1) => blue +(arg #2) => green diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Named arg 02 - Partial.fs b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 02 - Partial.fs new file mode 100644 index 0000000000..cf8ee5c698 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 02 - Partial.fs @@ -0,0 +1,4 @@ +type Foo () = + static member F (first: int, second, third) = first + second + third + +{selstart}Foo.F (10, third=15){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Named arg 02 - Partial.gold b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 02 - Partial.gold new file mode 100644 index 0000000000..ab745ca767 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 02 - Partial.gold @@ -0,0 +1,8 @@ +type Foo () = + static member F (|first|(param #0): int, second, |third|(param #1)) = first + second + third + +Foo.F (|10|(arg #0), |third=15|(arg #1)) + +--------------------------------------------------------- +(arg #0) => first +(arg #1) => third diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Named arg 03 - Unordered.fs b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 03 - Unordered.fs new file mode 100644 index 0000000000..7aaf3797d3 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 03 - Unordered.fs @@ -0,0 +1,4 @@ +type Foo () = + static member F (first: int, second, third) = first + second + third + +{selstart}Foo.F (second=15, third=25, first=1){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Named arg 03 - Unordered.gold b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 03 - Unordered.gold new file mode 100644 index 0000000000..81ccf9eab7 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 03 - Unordered.gold @@ -0,0 +1,9 @@ +type Foo () = + static member F (|first|(param #2): int, |second|(param #0), |third|(param #1)) = first + second + third + +Foo.F (|second=15|(arg #0), |third=25|(arg #1), |first=1|(arg #2)) + +--------------------------------------------------------- +(arg #0) => second +(arg #1) => third +(arg #2) => first diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Named arg 04 - Invalid name.fs b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 04 - Invalid name.fs new file mode 100644 index 0000000000..8a59390722 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 04 - Invalid name.fs @@ -0,0 +1,4 @@ +type Foo () = + static member F (first: int, second, third) = first + second + third + +{selstart}Foo.F (first=15, second=23, what=56){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Named arg 04 - Invalid name.gold b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 04 - Invalid name.gold new file mode 100644 index 0000000000..bcb565553f --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 04 - Invalid name.gold @@ -0,0 +1,9 @@ +type Foo () = + static member F (|first|(param #0): int, |second|(param #1), third) = first + second + third + +Foo.F (|first=15|(arg #0), |second=23|(arg #1), |what=56|(arg #2)) + +--------------------------------------------------------- +(arg #0) => first +(arg #1) => second +(arg #2) => diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Named arg 05 - Boolean.fs b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 05 - Boolean.fs new file mode 100644 index 0000000000..3eebcfad07 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 05 - Boolean.fs @@ -0,0 +1,5 @@ +type Foo () = + static member F (first: bool, second, third) = second + third + +let someInt = 15 +{selstart}Foo.F ((someInt=15), third=56, second=23){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Named arg 05 - Boolean.gold b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 05 - Boolean.gold new file mode 100644 index 0000000000..d08ea168ec --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 05 - Boolean.gold @@ -0,0 +1,10 @@ +type Foo () = + static member F (|first|(param #0): bool, |second|(param #2), |third|(param #1)) = second + third + +let someInt = 15 +Foo.F (|(someInt=15)|(arg #0), |third=56|(arg #1), |second=23|(arg #2)) + +--------------------------------------------------------- +(arg #0) => first +(arg #1) => third +(arg #2) => second diff --git a/ReSharper.FSharp/test/data/features/service/arguments/New 01 - Multiple args.fs b/ReSharper.FSharp/test/data/features/service/arguments/New 01 - Multiple args.fs new file mode 100644 index 0000000000..a092e64d93 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/New 01 - Multiple args.fs @@ -0,0 +1,4 @@ +type MyType (x: string, i: int) = + class end + +{selstart}new MyType("", 15){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/New 01 - Multiple args.gold b/ReSharper.FSharp/test/data/features/service/arguments/New 01 - Multiple args.gold new file mode 100644 index 0000000000..818475aa08 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/New 01 - Multiple args.gold @@ -0,0 +1,8 @@ +type MyType (|x|(param #0): string, |i|(param #1): int) = + class end + +new MyType(|""|(arg #0), |15|(arg #1)) + +--------------------------------------------------------- +(arg #0) => x +(arg #1) => i diff --git a/ReSharper.FSharp/test/data/features/service/arguments/New 02 - No args - parens.fs b/ReSharper.FSharp/test/data/features/service/arguments/New 02 - No args - parens.fs new file mode 100644 index 0000000000..135f87389d --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/New 02 - No args - parens.fs @@ -0,0 +1,4 @@ +type MyType () = + class end + +{selstart}new MyType(){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/New 02 - No args - parens.gold b/ReSharper.FSharp/test/data/features/service/arguments/New 02 - No args - parens.gold new file mode 100644 index 0000000000..de43b0ea5d --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/New 02 - No args - parens.gold @@ -0,0 +1,6 @@ +type MyType () = + class end + +new MyType() + +--------------------------------------------------------- diff --git a/ReSharper.FSharp/test/data/features/service/arguments/New 03 - Single arg - no paren.fs b/ReSharper.FSharp/test/data/features/service/arguments/New 03 - Single arg - no paren.fs new file mode 100644 index 0000000000..f967009235 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/New 03 - Single arg - no paren.fs @@ -0,0 +1,4 @@ +type MyType (x: string) = + class end + +{selstart}new MyType ""{selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/New 03 - Single arg - no paren.gold b/ReSharper.FSharp/test/data/features/service/arguments/New 03 - Single arg - no paren.gold new file mode 100644 index 0000000000..27ddbd912d --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/New 03 - Single arg - no paren.gold @@ -0,0 +1,7 @@ +type MyType (|x|(param #0): string) = + class end + +new MyType |""|(arg #0) + +--------------------------------------------------------- +(arg #0) => x diff --git a/ReSharper.FSharp/test/data/features/service/arguments/New 04 - Single arg - parens.fs b/ReSharper.FSharp/test/data/features/service/arguments/New 04 - Single arg - parens.fs new file mode 100644 index 0000000000..4130201794 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/New 04 - Single arg - parens.fs @@ -0,0 +1,4 @@ +type MyType (x: string) = + class end + +{selstart}new MyType(""){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/New 04 - Single arg - parens.gold b/ReSharper.FSharp/test/data/features/service/arguments/New 04 - Single arg - parens.gold new file mode 100644 index 0000000000..148b39aeda --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/New 04 - Single arg - parens.gold @@ -0,0 +1,7 @@ +type MyType (|x|(param #0): string) = + class end + +new MyType(|""|(arg #0)) + +--------------------------------------------------------- +(arg #0) => x diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Non IArgument 01 - Obj expression.fs b/ReSharper.FSharp/test/data/features/service/arguments/Non IArgument 01 - Obj expression.fs new file mode 100644 index 0000000000..657de4e154 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Non IArgument 01 - Obj expression.fs @@ -0,0 +1,5 @@ +open System + +let dispose (disp: IDisposable) = disp.Dispose() + +{selstart}dispose { new IDisposable with override __.Dispose () = () }{selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Non IArgument 01 - Obj expression.gold b/ReSharper.FSharp/test/data/features/service/arguments/Non IArgument 01 - Obj expression.gold new file mode 100644 index 0000000000..b6032ba974 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Non IArgument 01 - Obj expression.gold @@ -0,0 +1,7 @@ +open System + +let dispose (disp: IDisposable) = disp.Dispose() + +dispose { new IDisposable with override __.Dispose () = () } + +--------------------------------------------------------- diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Single 01 - Paren.fs b/ReSharper.FSharp/test/data/features/service/arguments/Single 01 - Paren.fs new file mode 100644 index 0000000000..1f6084fb2d --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Single 01 - Paren.fs @@ -0,0 +1,3 @@ +let f a = a + "" + +{selstart}f("hi"){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Single 01 - Paren.gold b/ReSharper.FSharp/test/data/features/service/arguments/Single 01 - Paren.gold new file mode 100644 index 0000000000..8603b1d7e2 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Single 01 - Paren.gold @@ -0,0 +1,6 @@ +let f |a|(param #0) = a + "" + +f(|"hi"|(arg #0)) + +--------------------------------------------------------- +(arg #0) => a diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Single 02 - Space paren.fs b/ReSharper.FSharp/test/data/features/service/arguments/Single 02 - Space paren.fs new file mode 100644 index 0000000000..0d00ad111f --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Single 02 - Space paren.fs @@ -0,0 +1,3 @@ +let f a = a + "" + +{selstart}f ("hi"){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Single 02 - Space paren.gold b/ReSharper.FSharp/test/data/features/service/arguments/Single 02 - Space paren.gold new file mode 100644 index 0000000000..827cc41c11 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Single 02 - Space paren.gold @@ -0,0 +1,6 @@ +let f |a|(param #0) = a + "" + +f (|"hi"|(arg #0)) + +--------------------------------------------------------- +(arg #0) => a diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Single 03 - Bare.fs b/ReSharper.FSharp/test/data/features/service/arguments/Single 03 - Bare.fs new file mode 100644 index 0000000000..4fd8062142 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Single 03 - Bare.fs @@ -0,0 +1,3 @@ +let f a = a + "" + +{selstart}f "hi"{selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Single 03 - Bare.gold b/ReSharper.FSharp/test/data/features/service/arguments/Single 03 - Bare.gold new file mode 100644 index 0000000000..1631122f49 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Single 03 - Bare.gold @@ -0,0 +1,6 @@ +let f |a|(param #0) = a + "" + +f |"hi"|(arg #0) + +--------------------------------------------------------- +(arg #0) => a diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 01 - Deconstructed.fs b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 01 - Deconstructed.fs new file mode 100644 index 0000000000..771d3317ef --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 01 - Deconstructed.fs @@ -0,0 +1,3 @@ +module M = let f (x, y) z = x + y + z + +{selstart}M.f (1, 2) 3{selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 01 - Deconstructed.gold b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 01 - Deconstructed.gold new file mode 100644 index 0000000000..4e13602288 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 01 - Deconstructed.gold @@ -0,0 +1,8 @@ +module M = let f (|x|(param #0), |y|(param #1)) |z|(param #2) = x + y + z + +M.f (|1|(arg #0), |2|(arg #1)) |3|(arg #2) + +--------------------------------------------------------- +(arg #0) => x +(arg #1) => y +(arg #2) => z diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 02 - Variable tuple in arg.fs b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 02 - Variable tuple in arg.fs new file mode 100644 index 0000000000..30eab9cf81 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 02 - Variable tuple in arg.fs @@ -0,0 +1,4 @@ +module M = let f (x, y) z = x + y + z + +let x = 1, 2 +{selstart}M.f x 3{selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 02 - Variable tuple in arg.gold b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 02 - Variable tuple in arg.gold new file mode 100644 index 0000000000..d95932fd26 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 02 - Variable tuple in arg.gold @@ -0,0 +1,7 @@ +module M = let f (x, y) |z|(param #0) = x + y + z + +let x = 1, 2 +M.f x |3|(arg #0) + +--------------------------------------------------------- +(arg #0) => z diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 03 - Param not deconstructed.fs b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 03 - Param not deconstructed.fs new file mode 100644 index 0000000000..cc9ec97874 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 03 - Param not deconstructed.fs @@ -0,0 +1,6 @@ +module M = + let f a z = + let x, y = a + x + y + z + +{selstart}M.f (1, 2) 3{selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 03 - Param not deconstructed.gold b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 03 - Param not deconstructed.gold new file mode 100644 index 0000000000..1472b2df06 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 03 - Param not deconstructed.gold @@ -0,0 +1,11 @@ +module M = + let f a |z|(param #2) = + let x, y = a + x + y + z + +M.f (|1|(arg #0), |2|(arg #1)) |3|(arg #2) + +--------------------------------------------------------- +(arg #0) => +(arg #1) => +(arg #2) => z diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 04 - Mismatch - too few.fs b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 04 - Mismatch - too few.fs new file mode 100644 index 0000000000..c272f80445 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 04 - Mismatch - too few.fs @@ -0,0 +1,5 @@ +module M = + let f (w, x, y) z = + w + x + y + z + +{selstart}M.f (1, 2) 3{selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 04 - Mismatch - too few.gold b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 04 - Mismatch - too few.gold new file mode 100644 index 0000000000..a008fe577d --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 04 - Mismatch - too few.gold @@ -0,0 +1,10 @@ +module M = + let f (|w|(param #0), |x|(param #1), y) |z|(param #2) = + w + x + y + z + +M.f (|1|(arg #0), |2|(arg #1)) |3|(arg #2) + +--------------------------------------------------------- +(arg #0) => w +(arg #1) => x +(arg #2) => z diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 05 - Mismatch - too many.fs b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 05 - Mismatch - too many.fs new file mode 100644 index 0000000000..0524f857ee --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 05 - Mismatch - too many.fs @@ -0,0 +1,5 @@ +module M = + let f (w, x, y) z = + w + x + y + z + +{selstart}M.f (1, 2, 3, 4) 5{selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 05 - Mismatch - too many.gold b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 05 - Mismatch - too many.gold new file mode 100644 index 0000000000..dbb99d0328 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 05 - Mismatch - too many.gold @@ -0,0 +1,11 @@ +module M = + let f (|w|(param #0), |x|(param #1), |y|(param #2)) |z|(param #3) = + w + x + y + z + +M.f (|1|(arg #0), |2|(arg #1), |3|(arg #2), 4) |5|(arg #3) + +--------------------------------------------------------- +(arg #0) => w +(arg #1) => x +(arg #2) => y +(arg #3) => z diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Unit 01 - Named.fs b/ReSharper.FSharp/test/data/features/service/arguments/Unit 01 - Named.fs new file mode 100644 index 0000000000..a4799c5fd0 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Unit 01 - Named.fs @@ -0,0 +1,4 @@ +type T() = + static member M(u: unit) = () + +{selstart}T.M(u = ()){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Unit 01 - Named.gold b/ReSharper.FSharp/test/data/features/service/arguments/Unit 01 - Named.gold new file mode 100644 index 0000000000..9297d6af0d --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Unit 01 - Named.gold @@ -0,0 +1,6 @@ +type T() = + static member M(u: unit) = () + +T.M(u = ()) + +--------------------------------------------------------- diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Unit 02 - Unnamed.fs b/ReSharper.FSharp/test/data/features/service/arguments/Unit 02 - Unnamed.fs new file mode 100644 index 0000000000..5b7c2a2e29 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Unit 02 - Unnamed.fs @@ -0,0 +1,5 @@ +type T() = + static member M(u: unit) = () + +let u = () +{selstart}T.M(u){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Unit 02 - Unnamed.gold b/ReSharper.FSharp/test/data/features/service/arguments/Unit 02 - Unnamed.gold new file mode 100644 index 0000000000..05fb9c7d96 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Unit 02 - Unnamed.gold @@ -0,0 +1,7 @@ +type T() = + static member M(u: unit) = () + +let u = () +T.M(u) + +--------------------------------------------------------- diff --git a/ReSharper.FSharp/test/data/features/service/codeFormatter/Binary expr alignment 01.fs b/ReSharper.FSharp/test/data/features/service/codeFormatter/Binary expr alignment 01.fs new file mode 100644 index 0000000000..37a27f2a0d --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/codeFormatter/Binary expr alignment 01.fs @@ -0,0 +1,5 @@ +module Module + +let foo = 1 + + 2 + + 3 diff --git a/ReSharper.FSharp/test/data/features/service/codeFormatter/Binary expr alignment 01.fs.gold b/ReSharper.FSharp/test/data/features/service/codeFormatter/Binary expr alignment 01.fs.gold new file mode 100644 index 0000000000..c92cb8a931 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/codeFormatter/Binary expr alignment 01.fs.gold @@ -0,0 +1,5 @@ +module Module + +let foo = 1 + + 2 + + 3 \ No newline at end of file diff --git a/ReSharper.FSharp/test/data/features/service/codeFormatter/Enum cases alignment 01.fs b/ReSharper.FSharp/test/data/features/service/codeFormatter/Enum cases alignment 01.fs new file mode 100644 index 0000000000..a3e56ef179 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/codeFormatter/Enum cases alignment 01.fs @@ -0,0 +1,4 @@ +namespace Namespace + +type Foo = | A = 0 + | B = 1 diff --git a/ReSharper.FSharp/test/data/features/service/codeFormatter/Enum cases alignment 01.fs.gold b/ReSharper.FSharp/test/data/features/service/codeFormatter/Enum cases alignment 01.fs.gold new file mode 100644 index 0000000000..a9c711bc3f --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/codeFormatter/Enum cases alignment 01.fs.gold @@ -0,0 +1,4 @@ +namespace Namespace + +type Foo = | A = 0 + | B = 1 diff --git a/ReSharper.FSharp/test/data/features/service/codeFormatter/Match clauses alignment 01.fs b/ReSharper.FSharp/test/data/features/service/codeFormatter/Match clauses alignment 01.fs new file mode 100644 index 0000000000..9d64f34806 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/codeFormatter/Match clauses alignment 01.fs @@ -0,0 +1,5 @@ +module Module + +let foo = match () with + | _ -> () + | _ -> () diff --git a/ReSharper.FSharp/test/data/features/service/codeFormatter/Match clauses alignment 01.fs.gold b/ReSharper.FSharp/test/data/features/service/codeFormatter/Match clauses alignment 01.fs.gold new file mode 100644 index 0000000000..eccf182703 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/codeFormatter/Match clauses alignment 01.fs.gold @@ -0,0 +1,5 @@ +module Module + +let foo = match () with + | _ -> () + | _ -> () \ No newline at end of file diff --git a/ReSharper.FSharp/test/data/features/service/codeFormatter/Match expr indent 01 - Expr at new line.fs b/ReSharper.FSharp/test/data/features/service/codeFormatter/Match expr indent 01 - Expr at new line.fs new file mode 100644 index 0000000000..b40b462f9c --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/codeFormatter/Match expr indent 01 - Expr at new line.fs @@ -0,0 +1,5 @@ +module Module + +match + () with +| _ -> () diff --git a/ReSharper.FSharp/test/data/features/service/codeFormatter/Match expr indent 01 - Expr at new line.fs.gold b/ReSharper.FSharp/test/data/features/service/codeFormatter/Match expr indent 01 - Expr at new line.fs.gold new file mode 100644 index 0000000000..01f94d65a3 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/codeFormatter/Match expr indent 01 - Expr at new line.fs.gold @@ -0,0 +1,5 @@ +module Module + +match + () with +| _ -> () \ No newline at end of file diff --git a/ReSharper.FSharp/test/data/features/service/codeFormatter/Match expr indent 02 - With at new line.fs b/ReSharper.FSharp/test/data/features/service/codeFormatter/Match expr indent 02 - With at new line.fs new file mode 100644 index 0000000000..612155ebf0 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/codeFormatter/Match expr indent 02 - With at new line.fs @@ -0,0 +1,5 @@ +module Module + +match () + with +| _ -> () diff --git a/ReSharper.FSharp/test/data/features/service/codeFormatter/Match expr indent 02 - With at new line.fs.gold b/ReSharper.FSharp/test/data/features/service/codeFormatter/Match expr indent 02 - With at new line.fs.gold new file mode 100644 index 0000000000..1238bd4512 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/codeFormatter/Match expr indent 02 - With at new line.fs.gold @@ -0,0 +1,5 @@ +module Module + +match () + with +| _ -> () \ No newline at end of file diff --git a/ReSharper.FSharp/test/data/features/service/codeFormatter/Sequential expr alignment 01 - No separators.fs b/ReSharper.FSharp/test/data/features/service/codeFormatter/Sequential expr alignment 01 - No separators.fs new file mode 100644 index 0000000000..7d0104762c --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/codeFormatter/Sequential expr alignment 01 - No separators.fs @@ -0,0 +1,4 @@ +module Module + +let foo = () + () diff --git a/ReSharper.FSharp/test/data/features/service/codeFormatter/Sequential expr alignment 01 - No separators.fs.gold b/ReSharper.FSharp/test/data/features/service/codeFormatter/Sequential expr alignment 01 - No separators.fs.gold new file mode 100644 index 0000000000..d82f6564b3 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/codeFormatter/Sequential expr alignment 01 - No separators.fs.gold @@ -0,0 +1,4 @@ +module Module + +let foo = () + () \ No newline at end of file diff --git a/ReSharper.FSharp/test/data/features/service/codeFormatter/Sequential expr alignment 02 - Separators.fs b/ReSharper.FSharp/test/data/features/service/codeFormatter/Sequential expr alignment 02 - Separators.fs new file mode 100644 index 0000000000..73e0880796 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/codeFormatter/Sequential expr alignment 02 - Separators.fs @@ -0,0 +1,5 @@ +module Module + +let foo = [ 1; + 2; + 3; ] diff --git a/ReSharper.FSharp/test/data/features/service/codeFormatter/Sequential expr alignment 02 - Separators.fs.gold b/ReSharper.FSharp/test/data/features/service/codeFormatter/Sequential expr alignment 02 - Separators.fs.gold new file mode 100644 index 0000000000..3705b0ae48 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/codeFormatter/Sequential expr alignment 02 - Separators.fs.gold @@ -0,0 +1,5 @@ +module Module + +let foo = [ 1; + 2; + 3; ] \ No newline at end of file diff --git a/ReSharper.FSharp/test/data/features/service/codeFormatter/Union cases alignment 01.fs b/ReSharper.FSharp/test/data/features/service/codeFormatter/Union cases alignment 01.fs new file mode 100644 index 0000000000..270f0f6ec2 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/codeFormatter/Union cases alignment 01.fs @@ -0,0 +1,4 @@ +namespace Namespace + +type Foo = | A + | B diff --git a/ReSharper.FSharp/test/data/features/service/codeFormatter/Union cases alignment 01.fs.gold b/ReSharper.FSharp/test/data/features/service/codeFormatter/Union cases alignment 01.fs.gold new file mode 100644 index 0000000000..a6046fbc02 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/codeFormatter/Union cases alignment 01.fs.gold @@ -0,0 +1,4 @@ +namespace Namespace + +type Foo = | A + | B diff --git a/ReSharper.FSharp/test/data/features/service/codeFormatter/Union cases alignment 02 - Modifier.fs b/ReSharper.FSharp/test/data/features/service/codeFormatter/Union cases alignment 02 - Modifier.fs new file mode 100644 index 0000000000..9d19b66b53 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/codeFormatter/Union cases alignment 02 - Modifier.fs @@ -0,0 +1,4 @@ +namespace Namespace + +type Foo = private | A + | B diff --git a/ReSharper.FSharp/test/data/features/service/codeFormatter/Union cases alignment 02 - Modifier.fs.gold b/ReSharper.FSharp/test/data/features/service/codeFormatter/Union cases alignment 02 - Modifier.fs.gold new file mode 100644 index 0000000000..b84fae44c1 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/codeFormatter/Union cases alignment 02 - Modifier.fs.gold @@ -0,0 +1,4 @@ +namespace Namespace + +type Foo = private | A + | B diff --git a/ReSharper.FSharp/test/data/features/service/codeFormatter/Union cases alignment 03 - Modifier and new line.fs b/ReSharper.FSharp/test/data/features/service/codeFormatter/Union cases alignment 03 - Modifier and new line.fs new file mode 100644 index 0000000000..e43837216b --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/codeFormatter/Union cases alignment 03 - Modifier and new line.fs @@ -0,0 +1,5 @@ +namespace Namespace + +type Foo = private + | A + | B diff --git a/ReSharper.FSharp/test/data/features/service/codeFormatter/Union cases alignment 03 - Modifier and new line.fs.gold b/ReSharper.FSharp/test/data/features/service/codeFormatter/Union cases alignment 03 - Modifier and new line.fs.gold new file mode 100644 index 0000000000..7c1a32c01a --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/codeFormatter/Union cases alignment 03 - Modifier and new line.fs.gold @@ -0,0 +1,5 @@ +namespace Namespace + +type Foo = private + | A + | B diff --git a/ReSharper.FSharp/test/data/features/service/codeFormatter/Union declaration indent 02 - Modifier.fs b/ReSharper.FSharp/test/data/features/service/codeFormatter/Union declaration indent 02 - Modifier.fs new file mode 100644 index 0000000000..e29cb17f42 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/codeFormatter/Union declaration indent 02 - Modifier.fs @@ -0,0 +1,6 @@ +namespace Namespace + +type Foo = + private + | A + | B diff --git a/ReSharper.FSharp/test/data/features/service/codeFormatter/Union declaration indent 02 - Modifier.fs.gold b/ReSharper.FSharp/test/data/features/service/codeFormatter/Union declaration indent 02 - Modifier.fs.gold new file mode 100644 index 0000000000..25ad57a742 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/codeFormatter/Union declaration indent 02 - Modifier.fs.gold @@ -0,0 +1,6 @@ +namespace Namespace + +type Foo = + private + | A + | B diff --git a/ReSharper.FSharp/test/data/folder/Symbols.gold b/ReSharper.FSharp/test/data/folder/Symbols.gold deleted file mode 100644 index 3d6bdd603a..0000000000 --- a/ReSharper.FSharp/test/data/folder/Symbols.gold +++ /dev/null @@ -1,6 +0,0 @@ --- ORIGINAL -- -Project Files:[]: Namespace: --- RESTORED -- -Project Files:[]: Namespace: --- UPDATED -- -Project Files:[]: Namespace: diff --git a/ReSharper.FSharp/test/data/folder/Symbols/1.fs b/ReSharper.FSharp/test/data/folder/Symbols/1.fs deleted file mode 100644 index 462a712154..0000000000 --- a/ReSharper.FSharp/test/data/folder/Symbols/1.fs +++ /dev/null @@ -1 +0,0 @@ -namespace TopLevel diff --git a/ReSharper.FSharp/test/data/folder/Symbols/2.fs b/ReSharper.FSharp/test/data/folder/Symbols/2.fs deleted file mode 100644 index 4ac5967175..0000000000 --- a/ReSharper.FSharp/test/data/folder/Symbols/2.fs +++ /dev/null @@ -1 +0,0 @@ -namespace Qualifier.TopLevel diff --git a/ReSharper.FSharp/test/data/folder/Symbols/3.fs b/ReSharper.FSharp/test/data/folder/Symbols/3.fs deleted file mode 100644 index f42614a904..0000000000 --- a/ReSharper.FSharp/test/data/folder/Symbols/3.fs +++ /dev/null @@ -1,3 +0,0 @@ -namespace TopLevel -namespace Qualifier.Another - diff --git a/ReSharper.FSharp/test/data/lexing/Strings 08 - Quotes.fs b/ReSharper.FSharp/test/data/lexing/Strings 08 - Quotes.fs new file mode 100644 index 0000000000..29e2f24690 --- /dev/null +++ b/ReSharper.FSharp/test/data/lexing/Strings 08 - Quotes.fs @@ -0,0 +1 @@ +''' \ No newline at end of file diff --git a/ReSharper.FSharp/test/data/lexing/Strings 08 - Quotes.fs.gold b/ReSharper.FSharp/test/data/lexing/Strings 08 - Quotes.fs.gold new file mode 100644 index 0000000000..2743b47022 --- /dev/null +++ b/ReSharper.FSharp/test/data/lexing/Strings 08 - Quotes.fs.gold @@ -0,0 +1 @@ +0000: CHARACTER_LITERAL ''''' diff --git a/ReSharper.FSharp/test/data/parsing/Attributes - Type let bindings 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Attributes - Type let bindings 01.fs.gold index a0ae8fd7e9..bcde9e8b86 100644 --- a/ReSharper.FSharp/test/data/parsing/Attributes - Type let bindings 01.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Attributes - Type let bindings 01.fs.gold @@ -7,9 +7,10 @@ IFSharpImplFile IObjectTypeDeclaration FSharpIdentifierToken(type:IDENTIFIER, text:T) IImplicitConstructorDeclaration - IMemberParamDeclarationGroup - FSharpTokenType+LparenTokenElement(type:LPAREN, text:() - FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + IMemberParamsDeclaration + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) NewLine(type:NEW_LINE, text:\n) spaces:"\n" diff --git a/ReSharper.FSharp/test/data/parsing/Attributes - Type let bindings 02.fs.gold b/ReSharper.FSharp/test/data/parsing/Attributes - Type let bindings 02.fs.gold index 28f8815e75..bb8dce6524 100644 --- a/ReSharper.FSharp/test/data/parsing/Attributes - Type let bindings 02.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Attributes - Type let bindings 02.fs.gold @@ -7,9 +7,10 @@ IFSharpImplFile IObjectTypeDeclaration FSharpIdentifierToken(type:IDENTIFIER, text:T) IImplicitConstructorDeclaration - IMemberParamDeclarationGroup - FSharpTokenType+LparenTokenElement(type:LPAREN, text:() - FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + IMemberParamsDeclaration + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) NewLine(type:NEW_LINE, text:\n) spaces:"\n" diff --git a/ReSharper.FSharp/test/data/parsing/Attributes - Type let bindings 03 - Modifiers.fs.gold b/ReSharper.FSharp/test/data/parsing/Attributes - Type let bindings 03 - Modifiers.fs.gold index 3d6d5a5b3b..4619ccaaa7 100644 --- a/ReSharper.FSharp/test/data/parsing/Attributes - Type let bindings 03 - Modifiers.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Attributes - Type let bindings 03 - Modifiers.fs.gold @@ -7,9 +7,10 @@ IFSharpImplFile IObjectTypeDeclaration FSharpIdentifierToken(type:IDENTIFIER, text:T) IImplicitConstructorDeclaration - IMemberParamDeclarationGroup - FSharpTokenType+LparenTokenElement(type:LPAREN, text:() - FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + IMemberParamsDeclaration + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) NewLine(type:NEW_LINE, text:\n) spaces:"\n" diff --git a/ReSharper.FSharp/test/data/parsing/Attributes - Type let bindings 04 - Multiple bindings.fs.gold b/ReSharper.FSharp/test/data/parsing/Attributes - Type let bindings 04 - Multiple bindings.fs.gold index a4de06427c..db944e540f 100644 --- a/ReSharper.FSharp/test/data/parsing/Attributes - Type let bindings 04 - Multiple bindings.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Attributes - Type let bindings 04 - Multiple bindings.fs.gold @@ -7,9 +7,10 @@ IFSharpImplFile IObjectTypeDeclaration FSharpIdentifierToken(type:IDENTIFIER, text:T) IImplicitConstructorDeclaration - IMemberParamDeclarationGroup - FSharpTokenType+LparenTokenElement(type:LPAREN, text:() - FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + IMemberParamsDeclaration + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) NewLine(type:NEW_LINE, text:\n) spaces:"\n" diff --git a/ReSharper.FSharp/test/data/parsing/Binding - Return type 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Binding - Return type 01.fs.gold index 5501ead094..e40b2d407e 100644 --- a/ReSharper.FSharp/test/data/parsing/Binding - Return type 01.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Binding - Return type 01.fs.gold @@ -11,7 +11,7 @@ IFSharpImplFile IReturnTypeInfo FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) Whitespace(type:WHITE_SPACE, text: ) spaces:" " diff --git a/ReSharper.FSharp/test/data/parsing/Binding - Return type 02 - Attrs.fs.gold b/ReSharper.FSharp/test/data/parsing/Binding - Return type 02 - Attrs.fs.gold index 04073e2fe5..8aa0720cb3 100644 --- a/ReSharper.FSharp/test/data/parsing/Binding - Return type 02 - Attrs.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Binding - Return type 02 - Attrs.fs.gold @@ -18,7 +18,7 @@ IFSharpImplFile FSharpIdentifierToken(type:IDENTIFIER, text:Foo) FSharpTokenType+GreaterRbrackTokenElement(type:GREATER_RBRACK, text:>]) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) Whitespace(type:WHITE_SPACE, text: ) spaces:" " diff --git a/ReSharper.FSharp/test/data/parsing/Binding - Return type 03 - Attrs, wild type.fs.gold b/ReSharper.FSharp/test/data/parsing/Binding - Return type 03 - Attrs, wild type.fs.gold index 2e4afead7e..50f80bb1ec 100644 --- a/ReSharper.FSharp/test/data/parsing/Binding - Return type 03 - Attrs, wild type.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Binding - Return type 03 - Attrs, wild type.fs.gold @@ -18,7 +18,7 @@ IFSharpImplFile FSharpIdentifierToken(type:IDENTIFIER, text:Foo) FSharpTokenType+GreaterRbrackTokenElement(type:GREATER_RBRACK, text:>]) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IAnonType + IAnonTypeUsage FSharpTokenType+UnderscoreTokenElement(type:UNDERSCORE, text:_) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) diff --git a/ReSharper.FSharp/test/data/parsing/Expr - Anon record 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Expr - Anon record 01.fs.gold index 32ab84efe9..fb999f6008 100644 --- a/ReSharper.FSharp/test/data/parsing/Expr - Anon record 01.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Expr - Anon record 01.fs.gold @@ -3,7 +3,7 @@ IFSharpImplFile IAnonModuleDeclaration IDo IChameleonExpression - IAnonRecdExpr + IAnonRecordExpr FSharpTokenType+LbraceBarTokenElement(type:LBRACE_BAR, text:{|) Whitespace(type:WHITE_SPACE, text: ) spaces:" " IRecordExprBinding diff --git a/ReSharper.FSharp/test/data/parsing/Expr - App - Precedence 04 - High - List.fs.gold b/ReSharper.FSharp/test/data/parsing/Expr - App - Precedence 04 - High - List.fs.gold index 1475dbf5db..05211e9d44 100644 --- a/ReSharper.FSharp/test/data/parsing/Expr - App - Precedence 04 - High - List.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Expr - App - Precedence 04 - High - List.fs.gold @@ -7,11 +7,10 @@ IFSharpImplFile IPrefixAppExpr IReferenceExpr FSharpIdentifierToken(type:IDENTIFIER, text:f) - IArrayOrListOfSeqExpr + IArrayOrListExpr FSharpTokenType+LbrackTokenElement(type:LBRACK, text:[) - IComputationExpr - IReferenceExpr - FSharpIdentifierToken(type:IDENTIFIER, text:x) + IReferenceExpr + FSharpIdentifierToken(type:IDENTIFIER, text:x) FSharpTokenType+RbrackTokenElement(type:RBRACK, text:]) FSharpTokenType+DotTokenElement(type:DOT, text:.) FSharpIdentifierToken(type:IDENTIFIER, text:P) diff --git a/ReSharper.FSharp/test/data/parsing/Expr - Cast - Downcast 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Expr - Cast - Downcast 01.fs.gold index 8afb0b6506..880ca161fa 100644 --- a/ReSharper.FSharp/test/data/parsing/Expr - Cast - Downcast 01.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Expr - Cast - Downcast 01.fs.gold @@ -13,7 +13,7 @@ IFSharpImplFile Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+ColonQmarkGreaterTokenElement(type:COLON_QMARK_GREATER, text::?>) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IAnonType + IAnonTypeUsage FSharpTokenType+UnderscoreTokenElement(type:UNDERSCORE, text:_) NewLine(type:NEW_LINE, text:\n) spaces:"\n" diff --git a/ReSharper.FSharp/test/data/parsing/Expr - Cast - Upcast 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Expr - Cast - Upcast 01.fs.gold index 067dddfbfd..55b0c0de50 100644 --- a/ReSharper.FSharp/test/data/parsing/Expr - Cast - Upcast 01.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Expr - Cast - Upcast 01.fs.gold @@ -13,7 +13,7 @@ IFSharpImplFile Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+ColonGreaterTokenElement(type:COLON_GREATER, text::>) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IAnonType + IAnonTypeUsage FSharpTokenType+UnderscoreTokenElement(type:UNDERSCORE, text:_) NewLine(type:NEW_LINE, text:\n) spaces:"\n" diff --git a/ReSharper.FSharp/test/data/parsing/Expr - CompExpr - AndBang 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Expr - CompExpr - AndBang 01.fs.gold index 53fc09cc4b..5901f88409 100644 --- a/ReSharper.FSharp/test/data/parsing/Expr - CompExpr - AndBang 01.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Expr - CompExpr - AndBang 01.fs.gold @@ -1,4 +1,4 @@ -Language: PsiLanguageType:F# +Language: PsiLanguageType:F# IFSharpImplFile IAnonModuleDeclaration IDo @@ -11,7 +11,7 @@ IFSharpImplFile FSharpTokenType+LbraceTokenElement(type:LBRACE, text:{) NewLine(type:NEW_LINE, text:\n) spaces:"\n" Whitespace(type:WHITE_SPACE, text: ) spaces:" " - ILetOrUseBangExpr + ILetOrUseExpr FSharpTokenType+LetBangTokenElement(type:LET_BANG, text:let!) Whitespace(type:WHITE_SPACE, text: ) spaces:" " ILocalBinding diff --git a/ReSharper.FSharp/test/data/parsing/Expr - CompExpr - Range 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Expr - CompExpr - Range 01.fs.gold index adfd6b61f6..af4eb9a3f6 100644 --- a/ReSharper.FSharp/test/data/parsing/Expr - CompExpr - Range 01.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Expr - CompExpr - Range 01.fs.gold @@ -7,10 +7,10 @@ IFSharpImplFile IReferenceExpr FSharpIdentifierToken(type:IDENTIFIER, text:seq) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IRangeSequenceExpr + IComputationExpr FSharpTokenType+LbraceTokenElement(type:LBRACE, text:{) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IRangeSequence + IRangeSequenceExpr ILiteralExpr FSharpToken(type:INT32, text:1) Whitespace(type:WHITE_SPACE, text: ) spaces:" " diff --git a/ReSharper.FSharp/test/data/parsing/Expr - CompExpr - Range 02 - Step.fs.gold b/ReSharper.FSharp/test/data/parsing/Expr - CompExpr - Range 02 - Step.fs.gold index f163d71338..c20a4ffcc5 100644 --- a/ReSharper.FSharp/test/data/parsing/Expr - CompExpr - Range 02 - Step.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Expr - CompExpr - Range 02 - Step.fs.gold @@ -7,10 +7,10 @@ IFSharpImplFile IReferenceExpr FSharpIdentifierToken(type:IDENTIFIER, text:seq) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IRangeSequenceExpr + IComputationExpr FSharpTokenType+LbraceTokenElement(type:LBRACE, text:{) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IRangeSequence + IRangeSequenceExpr ILiteralExpr FSharpToken(type:INT32, text:1) Whitespace(type:WHITE_SPACE, text: ) spaces:" " diff --git a/ReSharper.FSharp/test/data/parsing/Expr - DotIndexerGet 05 - Typed.fs b/ReSharper.FSharp/test/data/parsing/Expr - DotIndexerGet 05 - Typed.fs new file mode 100644 index 0000000000..3109641054 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Expr - DotIndexerGet 05 - Typed.fs @@ -0,0 +1 @@ +foo.[a: int] \ No newline at end of file diff --git a/ReSharper.FSharp/test/data/parsing/Expr - DotIndexerGet 05 - Typed.fs.gold b/ReSharper.FSharp/test/data/parsing/Expr - DotIndexerGet 05 - Typed.fs.gold new file mode 100644 index 0000000000..acf2a4aaaf --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Expr - DotIndexerGet 05 - Typed.fs.gold @@ -0,0 +1,22 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + IAnonModuleDeclaration + IDo + IChameleonExpression + IItemIndexerExpr + IReferenceExpr + FSharpIdentifierToken(type:IDENTIFIER, text:foo) + FSharpTokenType+DotTokenElement(type:DOT, text:.) + IIndexerArgList + FSharpTokenType+LbrackTokenElement(type:LBRACK, text:[) + IIndexerArgExpr + ITypedExpr + IReferenceExpr + FSharpIdentifierToken(type:IDENTIFIER, text:a) + FSharpTokenType+ColonTokenElement(type:COLON, text::) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + INamedTypeUsage + ITypeReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:int) + FSharpTokenType+RbrackTokenElement(type:RBRACK, text:]) + diff --git a/ReSharper.FSharp/test/data/parsing/Expr - ForEach - Range 01.fs b/ReSharper.FSharp/test/data/parsing/Expr - ForEach - Range 01.fs index 78ba05d62c..a2549f6e84 100644 --- a/ReSharper.FSharp/test/data/parsing/Expr - ForEach - Range 01.fs +++ b/ReSharper.FSharp/test/data/parsing/Expr - ForEach - Range 01.fs @@ -1,2 +1,2 @@ -for x in 1 ..2 do +for x in 1 .. 2 do () diff --git a/ReSharper.FSharp/test/data/parsing/Expr - ForEach - Range 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Expr - ForEach - Range 01.fs.gold index be45bc6920..2de71fd362 100644 --- a/ReSharper.FSharp/test/data/parsing/Expr - ForEach - Range 01.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Expr - ForEach - Range 01.fs.gold @@ -12,11 +12,12 @@ IFSharpImplFile Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+InTokenElement(type:IN, text:in) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IRangeSequence + IRangeSequenceExpr ILiteralExpr FSharpToken(type:INT32, text:1) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+DotDotTokenElement(type:DOT_DOT, text:..) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " ILiteralExpr FSharpToken(type:INT32, text:2) Whitespace(type:WHITE_SPACE, text: ) spaces:" " diff --git a/ReSharper.FSharp/test/data/parsing/Expr - ForEach - Range 02 - Step.fs.gold b/ReSharper.FSharp/test/data/parsing/Expr - ForEach - Range 02 - Step.fs.gold index 203d0f31b8..04d8350893 100644 --- a/ReSharper.FSharp/test/data/parsing/Expr - ForEach - Range 02 - Step.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Expr - ForEach - Range 02 - Step.fs.gold @@ -12,7 +12,7 @@ IFSharpImplFile Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+InTokenElement(type:IN, text:in) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IRangeSequence + IRangeSequenceExpr ILiteralExpr FSharpToken(type:INT32, text:1) Whitespace(type:WHITE_SPACE, text: ) spaces:" " diff --git a/ReSharper.FSharp/test/data/parsing/Expr - ImplicitZero 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Expr - ImplicitZero 01.fs.gold index 596ca5fb22..d6c878b8f1 100644 --- a/ReSharper.FSharp/test/data/parsing/Expr - ImplicitZero 01.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Expr - ImplicitZero 01.fs.gold @@ -11,7 +11,7 @@ IFSharpImplFile FSharpTokenType+LbraceTokenElement(type:LBRACE, text:{) NewLine(type:NEW_LINE, text:\n) spaces:"\n" Whitespace(type:WHITE_SPACE, text: ) spaces:" " - ILetOrUseBangExpr + ILetOrUseExpr FSharpTokenType+LetBangTokenElement(type:LET_BANG, text:let!) Whitespace(type:WHITE_SPACE, text: ) spaces:" " ILocalBinding diff --git a/ReSharper.FSharp/test/data/parsing/Expr - Lambda 18 - Typed.fs.gold b/ReSharper.FSharp/test/data/parsing/Expr - Lambda 18 - Typed.fs.gold index 9ee565d817..b71c91d57c 100644 --- a/ReSharper.FSharp/test/data/parsing/Expr - Lambda 18 - Typed.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Expr - Lambda 18 - Typed.fs.gold @@ -14,7 +14,7 @@ IFSharpImplFile FSharpIdentifierToken(type:IDENTIFIER, text:x) FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) diff --git a/ReSharper.FSharp/test/data/parsing/Expr - Lambda 19 - Typed - Multiple params.fs.gold b/ReSharper.FSharp/test/data/parsing/Expr - Lambda 19 - Typed - Multiple params.fs.gold index d1bdf823f8..356f4366e5 100644 --- a/ReSharper.FSharp/test/data/parsing/Expr - Lambda 19 - Typed - Multiple params.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Expr - Lambda 19 - Typed - Multiple params.fs.gold @@ -14,7 +14,7 @@ IFSharpImplFile FSharpIdentifierToken(type:IDENTIFIER, text:x) FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) @@ -27,7 +27,7 @@ IFSharpImplFile FSharpIdentifierToken(type:IDENTIFIER, text:y) FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) diff --git a/ReSharper.FSharp/test/data/parsing/Expr - Lambda 21 - Nested types.fs.gold b/ReSharper.FSharp/test/data/parsing/Expr - Lambda 21 - Nested types.fs.gold index dd6c30fb36..2ff685d0bb 100644 --- a/ReSharper.FSharp/test/data/parsing/Expr - Lambda 21 - Nested types.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Expr - Lambda 21 - Nested types.fs.gold @@ -16,13 +16,13 @@ IFSharpImplFile FSharpIdentifierToken(type:IDENTIFIER, text:x) FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) diff --git a/ReSharper.FSharp/test/data/parsing/Expr - Lambda 23 - Attribute, Typed.fs.gold b/ReSharper.FSharp/test/data/parsing/Expr - Lambda 23 - Attribute, Typed.fs.gold index d582292cb4..98a96ace1f 100644 --- a/ReSharper.FSharp/test/data/parsing/Expr - Lambda 23 - Attribute, Typed.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Expr - Lambda 23 - Attribute, Typed.fs.gold @@ -22,7 +22,7 @@ IFSharpImplFile FSharpIdentifierToken(type:IDENTIFIER, text:a) FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) diff --git a/ReSharper.FSharp/test/data/parsing/Expr - LetOrUseBang 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Expr - LetOrUseBang 01.fs.gold index d60c75d7e9..b22da40b30 100644 --- a/ReSharper.FSharp/test/data/parsing/Expr - LetOrUseBang 01.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Expr - LetOrUseBang 01.fs.gold @@ -11,7 +11,7 @@ IFSharpImplFile FSharpTokenType+LbraceTokenElement(type:LBRACE, text:{) NewLine(type:NEW_LINE, text:\n) spaces:"\n" Whitespace(type:WHITE_SPACE, text: ) spaces:" " - ILetOrUseBangExpr + ILetOrUseExpr FSharpTokenType+LetBangTokenElement(type:LET_BANG, text:let!) Whitespace(type:WHITE_SPACE, text: ) spaces:" " ILocalBinding diff --git a/ReSharper.FSharp/test/data/parsing/Expr - LetOrUseBang 02 - Group.fs b/ReSharper.FSharp/test/data/parsing/Expr - LetOrUseBang 02 - Group.fs new file mode 100644 index 0000000000..24e8b0ace2 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Expr - LetOrUseBang 02 - Group.fs @@ -0,0 +1,5 @@ +async { + let! x = () + and! y = () + () +} diff --git a/ReSharper.FSharp/test/data/parsing/Expr - LetOrUseBang 02 - Group.fs.gold b/ReSharper.FSharp/test/data/parsing/Expr - LetOrUseBang 02 - Group.fs.gold new file mode 100644 index 0000000000..38989560da --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Expr - LetOrUseBang 02 - Group.fs.gold @@ -0,0 +1,49 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + IAnonModuleDeclaration + IDo + IChameleonExpression + IPrefixAppExpr + IReferenceExpr + FSharpIdentifierToken(type:IDENTIFIER, text:async) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IComputationExpr + FSharpTokenType+LbraceTokenElement(type:LBRACE, text:{) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ILetOrUseExpr + FSharpTokenType+LetBangTokenElement(type:LET_BANG, text:let!) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ILocalBinding + ILocalReferencePat + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:x) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IUnitExpr + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+AndBangTokenElement(type:AND_BANG, text:and!) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ILocalBinding + ILocalReferencePat + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:y) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IUnitExpr + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IUnitExpr + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + FSharpTokenType+RbraceTokenElement(type:RBRACE, text:}) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/Expr - List - Comprehension 01.fs b/ReSharper.FSharp/test/data/parsing/Expr - List - Comprehension 01.fs new file mode 100644 index 0000000000..ea55119498 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Expr - List - Comprehension 01.fs @@ -0,0 +1,2 @@ +do + [ for a in 1 .. 10 -> a ] diff --git a/ReSharper.FSharp/test/data/parsing/Expr - List - Comprehension 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Expr - List - Comprehension 01.fs.gold new file mode 100644 index 0000000000..992f922997 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Expr - List - Comprehension 01.fs.gold @@ -0,0 +1,37 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + IAnonModuleDeclaration + IDo + FSharpTokenType+DoTokenElement(type:DO, text:do) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IChameleonExpression + IArrayOrListExpr + FSharpTokenType+LbrackTokenElement(type:LBRACK, text:[) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IForEachExpr + FSharpTokenType+ForTokenElement(type:FOR, text:for) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ILocalReferencePat + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:a) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+InTokenElement(type:IN, text:in) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IRangeSequenceExpr + ILiteralExpr + FSharpToken(type:INT32, text:1) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+DotDotTokenElement(type:DOT_DOT, text:..) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ILiteralExpr + FSharpToken(type:INT32, text:10) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+RarrowTokenElement(type:RARROW, text:->) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IReferenceExpr + FSharpIdentifierToken(type:IDENTIFIER, text:a) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+RbrackTokenElement(type:RBRACK, text:]) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/Expr - List - Empty 01.fs b/ReSharper.FSharp/test/data/parsing/Expr - List - Empty 01.fs new file mode 100644 index 0000000000..c4391a550e --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Expr - List - Empty 01.fs @@ -0,0 +1,2 @@ +do + [] diff --git a/ReSharper.FSharp/test/data/parsing/Expr - List - Empty 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Expr - List - Empty 01.fs.gold new file mode 100644 index 0000000000..0cc66e1d5f --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Expr - List - Empty 01.fs.gold @@ -0,0 +1,13 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + IAnonModuleDeclaration + IDo + FSharpTokenType+DoTokenElement(type:DO, text:do) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IChameleonExpression + IArrayOrListExpr + FSharpTokenType+LbrackTokenElement(type:LBRACK, text:[) + FSharpTokenType+RbrackTokenElement(type:RBRACK, text:]) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/Expr - List - Range sequence 01.fs b/ReSharper.FSharp/test/data/parsing/Expr - List - Range sequence 01.fs new file mode 100644 index 0000000000..81882d3b14 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Expr - List - Range sequence 01.fs @@ -0,0 +1,2 @@ +do + [ 1 .. 2 ] diff --git a/ReSharper.FSharp/test/data/parsing/Expr - List - Range sequence 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Expr - List - Range sequence 01.fs.gold new file mode 100644 index 0000000000..e095ec5785 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Expr - List - Range sequence 01.fs.gold @@ -0,0 +1,23 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + IAnonModuleDeclaration + IDo + FSharpTokenType+DoTokenElement(type:DO, text:do) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IChameleonExpression + IArrayOrListExpr + FSharpTokenType+LbrackTokenElement(type:LBRACK, text:[) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IRangeSequenceExpr + ILiteralExpr + FSharpToken(type:INT32, text:1) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+DotDotTokenElement(type:DOT_DOT, text:..) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ILiteralExpr + FSharpToken(type:INT32, text:2) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+RbrackTokenElement(type:RBRACK, text:]) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/Expr - List - Seq 01.fs b/ReSharper.FSharp/test/data/parsing/Expr - List - Seq 01.fs new file mode 100644 index 0000000000..d379b4dc71 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Expr - List - Seq 01.fs @@ -0,0 +1,2 @@ +do + [ 1; 2 ] diff --git a/ReSharper.FSharp/test/data/parsing/Expr - List - Seq 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Expr - List - Seq 01.fs.gold new file mode 100644 index 0000000000..d8a1dc3662 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Expr - List - Seq 01.fs.gold @@ -0,0 +1,22 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + IAnonModuleDeclaration + IDo + FSharpTokenType+DoTokenElement(type:DO, text:do) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IChameleonExpression + IArrayOrListExpr + FSharpTokenType+LbrackTokenElement(type:LBRACK, text:[) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ISequentialExpr + ILiteralExpr + FSharpToken(type:INT32, text:1) + FSharpTokenType+SemicolonTokenElement(type:SEMICOLON, text:;) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ILiteralExpr + FSharpToken(type:INT32, text:2) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+RbrackTokenElement(type:RBRACK, text:]) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/Expr - List - Seq 02 - Implicit semi.fs b/ReSharper.FSharp/test/data/parsing/Expr - List - Seq 02 - Implicit semi.fs new file mode 100644 index 0000000000..fff10bc9d2 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Expr - List - Seq 02 - Implicit semi.fs @@ -0,0 +1,3 @@ +do + [ 1 + 2 ] diff --git a/ReSharper.FSharp/test/data/parsing/Expr - List - Seq 02 - Implicit semi.fs.gold b/ReSharper.FSharp/test/data/parsing/Expr - List - Seq 02 - Implicit semi.fs.gold new file mode 100644 index 0000000000..381f4d9231 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Expr - List - Seq 02 - Implicit semi.fs.gold @@ -0,0 +1,22 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + IAnonModuleDeclaration + IDo + FSharpTokenType+DoTokenElement(type:DO, text:do) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IChameleonExpression + IArrayOrListExpr + FSharpTokenType+LbrackTokenElement(type:LBRACK, text:[) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ISequentialExpr + ILiteralExpr + FSharpToken(type:INT32, text:1) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ILiteralExpr + FSharpToken(type:INT32, text:2) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+RbrackTokenElement(type:RBRACK, text:]) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/Expr - List - Seq 03 - Implicit yield.fs b/ReSharper.FSharp/test/data/parsing/Expr - List - Seq 03 - Implicit yield.fs new file mode 100644 index 0000000000..0126867bb9 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Expr - List - Seq 03 - Implicit yield.fs @@ -0,0 +1,5 @@ +do + [ 1 + if true then + 2 + 3 ] diff --git a/ReSharper.FSharp/test/data/parsing/Expr - List - Seq 03 - Implicit yield.fs.gold b/ReSharper.FSharp/test/data/parsing/Expr - List - Seq 03 - Implicit yield.fs.gold new file mode 100644 index 0000000000..6449ba9626 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Expr - List - Seq 03 - Implicit yield.fs.gold @@ -0,0 +1,35 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + IAnonModuleDeclaration + IDo + FSharpTokenType+DoTokenElement(type:DO, text:do) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IChameleonExpression + IArrayOrListExpr + FSharpTokenType+LbrackTokenElement(type:LBRACK, text:[) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ISequentialExpr + ILiteralExpr + FSharpToken(type:INT32, text:1) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IIfThenElseExpr + FSharpTokenType+IfTokenElement(type:IF, text:if) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ILiteralExpr + FSharpTokenType+TrueTokenElement(type:TRUE, text:true) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+ThenTokenElement(type:THEN, text:then) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ILiteralExpr + FSharpToken(type:INT32, text:2) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ILiteralExpr + FSharpToken(type:INT32, text:3) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+RbrackTokenElement(type:RBRACK, text:]) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/Expr - List - Seq 04 - Yield.fs b/ReSharper.FSharp/test/data/parsing/Expr - List - Seq 04 - Yield.fs new file mode 100644 index 0000000000..29fb0a1193 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Expr - List - Seq 04 - Yield.fs @@ -0,0 +1,5 @@ +do + [ 1 + if true then + yield 2 + 3 ] diff --git a/ReSharper.FSharp/test/data/parsing/Expr - List - Seq 04 - Yield.fs.gold b/ReSharper.FSharp/test/data/parsing/Expr - List - Seq 04 - Yield.fs.gold new file mode 100644 index 0000000000..cc14e4fde0 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Expr - List - Seq 04 - Yield.fs.gold @@ -0,0 +1,38 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + IAnonModuleDeclaration + IDo + FSharpTokenType+DoTokenElement(type:DO, text:do) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IChameleonExpression + IArrayOrListExpr + FSharpTokenType+LbrackTokenElement(type:LBRACK, text:[) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ISequentialExpr + ILiteralExpr + FSharpToken(type:INT32, text:1) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IIfThenElseExpr + FSharpTokenType+IfTokenElement(type:IF, text:if) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ILiteralExpr + FSharpTokenType+TrueTokenElement(type:TRUE, text:true) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+ThenTokenElement(type:THEN, text:then) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IYieldOrReturnExpr + FSharpTokenType+YieldTokenElement(type:YIELD, text:yield) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ILiteralExpr + FSharpToken(type:INT32, text:2) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ILiteralExpr + FSharpToken(type:INT32, text:3) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+RbrackTokenElement(type:RBRACK, text:]) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/Expr - List - Seq 05 - ForEach.fs b/ReSharper.FSharp/test/data/parsing/Expr - List - Seq 05 - ForEach.fs new file mode 100644 index 0000000000..b3ac21d0c6 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Expr - List - Seq 05 - ForEach.fs @@ -0,0 +1,3 @@ +do + [ for a in 1 .. 10 do + yield a ] diff --git a/ReSharper.FSharp/test/data/parsing/Expr - List - Seq 05 - ForEach.fs.gold b/ReSharper.FSharp/test/data/parsing/Expr - List - Seq 05 - ForEach.fs.gold new file mode 100644 index 0000000000..e06c186959 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Expr - List - Seq 05 - ForEach.fs.gold @@ -0,0 +1,41 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + IAnonModuleDeclaration + IDo + FSharpTokenType+DoTokenElement(type:DO, text:do) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IChameleonExpression + IArrayOrListExpr + FSharpTokenType+LbrackTokenElement(type:LBRACK, text:[) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IForEachExpr + FSharpTokenType+ForTokenElement(type:FOR, text:for) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ILocalReferencePat + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:a) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+InTokenElement(type:IN, text:in) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IRangeSequenceExpr + ILiteralExpr + FSharpToken(type:INT32, text:1) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+DotDotTokenElement(type:DOT_DOT, text:..) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ILiteralExpr + FSharpToken(type:INT32, text:10) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+DoTokenElement(type:DO, text:do) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IYieldOrReturnExpr + FSharpTokenType+YieldTokenElement(type:YIELD, text:yield) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IReferenceExpr + FSharpIdentifierToken(type:IDENTIFIER, text:a) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+RbrackTokenElement(type:RBRACK, text:]) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/Expr - Match 03 - When Expr.fs.gold b/ReSharper.FSharp/test/data/parsing/Expr - Match 03 - When Expr.fs.gold index 44fd1f9f03..f3b7479fa0 100644 --- a/ReSharper.FSharp/test/data/parsing/Expr - Match 03 - When Expr.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Expr - Match 03 - When Expr.fs.gold @@ -19,7 +19,7 @@ IFSharpImplFile IExpressionReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:x) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IWhenExpr + IWhenExprClause FSharpTokenType+WhenTokenElement(type:WHEN, text:when) Whitespace(type:WHITE_SPACE, text: ) spaces:" " IBinaryAppExpr diff --git a/ReSharper.FSharp/test/data/parsing/Expr - Match 04 - Multiple When clauses.fs.gold b/ReSharper.FSharp/test/data/parsing/Expr - Match 04 - Multiple When clauses.fs.gold index 8ec1a86a86..7db253a8bd 100644 --- a/ReSharper.FSharp/test/data/parsing/Expr - Match 04 - Multiple When clauses.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Expr - Match 04 - Multiple When clauses.fs.gold @@ -19,7 +19,7 @@ IFSharpImplFile IExpressionReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:x) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IWhenExpr + IWhenExprClause FSharpTokenType+WhenTokenElement(type:WHEN, text:when) Whitespace(type:WHITE_SPACE, text: ) spaces:" " ILiteralExpr @@ -38,7 +38,7 @@ IFSharpImplFile IExpressionReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:x) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IWhenExpr + IWhenExprClause FSharpTokenType+WhenTokenElement(type:WHEN, text:when) Whitespace(type:WHITE_SPACE, text: ) spaces:" " IBinaryAppExpr diff --git a/ReSharper.FSharp/test/data/parsing/Expr - New 02 - Generics.fs.gold b/ReSharper.FSharp/test/data/parsing/Expr - New 02 - Generics.fs.gold index 40954a488f..39de41e04f 100644 --- a/ReSharper.FSharp/test/data/parsing/Expr - New 02 - Generics.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Expr - New 02 - Generics.fs.gold @@ -19,14 +19,14 @@ IFSharpImplFile FSharpIdentifierToken(type:IDENTIFIER, text:List) IPrefixAppTypeArgumentList FSharpTokenType+LessTokenElement(type:LESS, text:<) - ITupleType - INamedType + ITupleTypeUsage + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+StarTokenElement(type:STAR, text:*) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) FSharpTokenType+GreaterTokenElement(type:GREATER, text:>) diff --git a/ReSharper.FSharp/test/data/parsing/Expr - ObjExpr 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Expr - ObjExpr 01.fs.gold index 80055a62e3..d22b333bb4 100644 --- a/ReSharper.FSharp/test/data/parsing/Expr - ObjExpr 01.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Expr - ObjExpr 01.fs.gold @@ -24,7 +24,7 @@ IFSharpImplFile FSharpIdentifierToken(type:IDENTIFIER, text:x) FSharpTokenType+DotTokenElement(type:DOT, text:.) FSharpIdentifierToken(type:IDENTIFIER, text:Dispose) - IMemberParamDeclaration + IMemberParamsDeclaration IParenPat IConstPat FSharpTokenType+LparenTokenElement(type:LPAREN, text:() diff --git a/ReSharper.FSharp/test/data/parsing/Expr - ObjExpr 02 - Interface.fs.gold b/ReSharper.FSharp/test/data/parsing/Expr - ObjExpr 02 - Interface.fs.gold index 19097e35f4..5bd889e751 100644 --- a/ReSharper.FSharp/test/data/parsing/Expr - ObjExpr 02 - Interface.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Expr - ObjExpr 02 - Interface.fs.gold @@ -50,7 +50,7 @@ IFSharpImplFile FSharpIdentifierToken(type:IDENTIFIER, text:x) FSharpTokenType+DotTokenElement(type:DOT, text:.) FSharpIdentifierToken(type:IDENTIFIER, text:Dispose) - IMemberParamDeclaration + IMemberParamsDeclaration IParenPat IConstPat FSharpTokenType+LparenTokenElement(type:LPAREN, text:() diff --git a/ReSharper.FSharp/test/data/parsing/Expr - TypeApp 01 - Simple.fs.gold b/ReSharper.FSharp/test/data/parsing/Expr - TypeApp 01 - Simple.fs.gold index cf9b4ff21e..86308d9854 100644 --- a/ReSharper.FSharp/test/data/parsing/Expr - TypeApp 01 - Simple.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Expr - TypeApp 01 - Simple.fs.gold @@ -7,7 +7,7 @@ IFSharpImplFile FSharpIdentifierToken(type:IDENTIFIER, text:foo) IPrefixAppTypeArgumentList FSharpTokenType+LessTokenElement(type:LESS, text:<) - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) FSharpTokenType+GreaterTokenElement(type:GREATER, text:>) diff --git a/ReSharper.FSharp/test/data/parsing/Expr - TypeApp 02 - Lid.fs.gold b/ReSharper.FSharp/test/data/parsing/Expr - TypeApp 02 - Lid.fs.gold index 67a0c7312c..10c904d334 100644 --- a/ReSharper.FSharp/test/data/parsing/Expr - TypeApp 02 - Lid.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Expr - TypeApp 02 - Lid.fs.gold @@ -10,7 +10,7 @@ IFSharpImplFile FSharpIdentifierToken(type:IDENTIFIER, text:bar) IPrefixAppTypeArgumentList FSharpTokenType+LessTokenElement(type:LESS, text:<) - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) FSharpTokenType+GreaterTokenElement(type:GREATER, text:>) diff --git a/ReSharper.FSharp/test/data/parsing/Expr - TypeApp 03 - DotGet.fs.gold b/ReSharper.FSharp/test/data/parsing/Expr - TypeApp 03 - DotGet.fs.gold index a16ebdc7b1..b077d23953 100644 --- a/ReSharper.FSharp/test/data/parsing/Expr - TypeApp 03 - DotGet.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Expr - TypeApp 03 - DotGet.fs.gold @@ -13,7 +13,7 @@ IFSharpImplFile FSharpIdentifierToken(type:IDENTIFIER, text:bar) IPrefixAppTypeArgumentList FSharpTokenType+LessTokenElement(type:LESS, text:<) - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) FSharpTokenType+GreaterTokenElement(type:GREATER, text:>) diff --git a/ReSharper.FSharp/test/data/parsing/Expr - Typed 01 - Simple.fs.gold b/ReSharper.FSharp/test/data/parsing/Expr - Typed 01 - Simple.fs.gold index ae4761c509..ed449c1de0 100644 --- a/ReSharper.FSharp/test/data/parsing/Expr - Typed 01 - Simple.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Expr - Typed 01 - Simple.fs.gold @@ -10,7 +10,7 @@ IFSharpImplFile FSharpToken(type:INT32, text:123) FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) diff --git a/ReSharper.FSharp/test/data/parsing/Expr - Typeof 01 - Type parameter.fs.gold b/ReSharper.FSharp/test/data/parsing/Expr - Typeof 01 - Type parameter.fs.gold index 22ede19787..f577611b0b 100644 --- a/ReSharper.FSharp/test/data/parsing/Expr - Typeof 01 - Type parameter.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Expr - Typeof 01 - Type parameter.fs.gold @@ -8,7 +8,7 @@ IFSharpImplFile FSharpIdentifierToken(type:IDENTIFIER, text:typeof) IPrefixAppTypeArgumentList FSharpTokenType+LessTokenElement(type:LESS, text:<) - INamedType + INamedTypeUsage ITypeReferenceName ITypeParameterId FSharpTokenType+QuoteTokenElement(type:QUOTE, text:') diff --git a/ReSharper.FSharp/test/data/parsing/Let - Local 02 - Typed.fs.gold b/ReSharper.FSharp/test/data/parsing/Let - Local 02 - Typed.fs.gold index 71d281d26d..b1b534360e 100644 --- a/ReSharper.FSharp/test/data/parsing/Let - Local 02 - Typed.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Let - Local 02 - Typed.fs.gold @@ -23,7 +23,7 @@ IFSharpImplFile IReturnTypeInfo FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) Whitespace(type:WHITE_SPACE, text: ) spaces:" " diff --git a/ReSharper.FSharp/test/data/parsing/Let - Local 03 - Typed expr.fs.gold b/ReSharper.FSharp/test/data/parsing/Let - Local 03 - Typed expr.fs.gold index 17d84a32ba..9fb104a9ad 100644 --- a/ReSharper.FSharp/test/data/parsing/Let - Local 03 - Typed expr.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Let - Local 03 - Typed expr.fs.gold @@ -20,7 +20,7 @@ IFSharpImplFile FSharpToken(type:INT32, text:123) FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) NewLine(type:NEW_LINE, text:\n) spaces:"\n" diff --git a/ReSharper.FSharp/test/data/parsing/Let 02 - Typed.fs.gold b/ReSharper.FSharp/test/data/parsing/Let 02 - Typed.fs.gold index 1a0babd45b..43cc04da67 100644 --- a/ReSharper.FSharp/test/data/parsing/Let 02 - Typed.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Let 02 - Typed.fs.gold @@ -11,7 +11,7 @@ IFSharpImplFile IReturnTypeInfo FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) Whitespace(type:WHITE_SPACE, text: ) spaces:" " diff --git a/ReSharper.FSharp/test/data/parsing/Let 03 - Typed, var type.fs.gold b/ReSharper.FSharp/test/data/parsing/Let 03 - Typed, var type.fs.gold index 1fffd56957..c2d5c3ee6a 100644 --- a/ReSharper.FSharp/test/data/parsing/Let 03 - Typed, var type.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Let 03 - Typed, var type.fs.gold @@ -11,7 +11,7 @@ IFSharpImplFile IReturnTypeInfo FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName ITypeParameterId FSharpTokenType+QuoteTokenElement(type:QUOTE, text:') diff --git a/ReSharper.FSharp/test/data/parsing/Let 04 - Typed, var type, space.fs.gold b/ReSharper.FSharp/test/data/parsing/Let 04 - Typed, var type, space.fs.gold index 8340184c4c..6d821f0a87 100644 --- a/ReSharper.FSharp/test/data/parsing/Let 04 - Typed, var type, space.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Let 04 - Typed, var type, space.fs.gold @@ -11,7 +11,7 @@ IFSharpImplFile IReturnTypeInfo FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName ITypeParameterId FSharpTokenType+QuoteTokenElement(type:QUOTE, text:') diff --git a/ReSharper.FSharp/test/data/parsing/Let 05 - Typed, space.fs.gold b/ReSharper.FSharp/test/data/parsing/Let 05 - Typed, space.fs.gold index c79451022a..c87db5b0ab 100644 --- a/ReSharper.FSharp/test/data/parsing/Let 05 - Typed, space.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Let 05 - Typed, space.fs.gold @@ -12,7 +12,7 @@ IFSharpImplFile IReturnTypeInfo FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) Whitespace(type:WHITE_SPACE, text: ) spaces:" " diff --git a/ReSharper.FSharp/test/data/parsing/Namespace 05 - Global.fs.gold b/ReSharper.FSharp/test/data/parsing/Namespace 05 - Global.fs.gold index 19aab76841..eb52c50320 100644 --- a/ReSharper.FSharp/test/data/parsing/Namespace 05 - Global.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Namespace 05 - Global.fs.gold @@ -3,6 +3,6 @@ IFSharpImplFile IGlobalNamespaceDeclaration FSharpTokenType+NamespaceTokenElement(type:NAMESPACE, text:namespace) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - FSharpTokenType+GlobalTokenElement(type:GLOBAL, text:global) + FSharpIdentifierToken(type:GLOBAL, text:global) NewLine(type:NEW_LINE, text:\n) spaces:"\n" diff --git a/ReSharper.FSharp/test/data/parsing/Namespace 06 - Global, type.fs.gold b/ReSharper.FSharp/test/data/parsing/Namespace 06 - Global, type.fs.gold index 766a580974..31da29781c 100644 --- a/ReSharper.FSharp/test/data/parsing/Namespace 06 - Global, type.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Namespace 06 - Global, type.fs.gold @@ -3,7 +3,7 @@ IFSharpImplFile IGlobalNamespaceDeclaration FSharpTokenType+NamespaceTokenElement(type:NAMESPACE, text:namespace) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - FSharpTokenType+GlobalTokenElement(type:GLOBAL, text:global) + FSharpIdentifierToken(type:GLOBAL, text:global) NewLine(type:NEW_LINE, text:\n) spaces:"\n" NewLine(type:NEW_LINE, text:\n) spaces:"\n" ITypeDeclarationGroup @@ -15,7 +15,7 @@ IFSharpImplFile FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) Whitespace(type:WHITE_SPACE, text: ) spaces:" " IAbbreviatedTypeOrUnionCaseDeclaration - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) NewLine(type:NEW_LINE, text:\n) spaces:"\n" diff --git a/ReSharper.FSharp/test/data/parsing/Namespace 07 - Global, Multiple.fs.gold b/ReSharper.FSharp/test/data/parsing/Namespace 07 - Global, Multiple.fs.gold index f8f7b3b852..95a7081d8b 100644 --- a/ReSharper.FSharp/test/data/parsing/Namespace 07 - Global, Multiple.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Namespace 07 - Global, Multiple.fs.gold @@ -9,6 +9,6 @@ IFSharpImplFile IGlobalNamespaceDeclaration FSharpTokenType+NamespaceTokenElement(type:NAMESPACE, text:namespace) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - FSharpTokenType+GlobalTokenElement(type:GLOBAL, text:global) + FSharpIdentifierToken(type:GLOBAL, text:global) NewLine(type:NEW_LINE, text:\n) spaces:"\n" diff --git a/ReSharper.FSharp/test/data/parsing/Pattern - Named args 01.fs b/ReSharper.FSharp/test/data/parsing/Pattern - Named args 01.fs new file mode 100644 index 0000000000..4f86740343 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Pattern - Named args 01.fs @@ -0,0 +1 @@ +let (UnionCase(namedFieldArg = namedFieldPat)) = () diff --git a/ReSharper.FSharp/test/data/parsing/Pattern - Named args 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Pattern - Named args 01.fs.gold new file mode 100644 index 0000000000..2e2d561052 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Pattern - Named args 01.fs.gold @@ -0,0 +1,33 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + IAnonModuleDeclaration + ILetModuleDecl + FSharpTokenType+LetTokenElement(type:LET, text:let) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ITopBinding + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + ITopParametersOwnerPat + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:UnionCase) + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + IFieldPat + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:namedFieldArg) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ITopReferencePat + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:namedFieldPat) + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IChameleonExpression + IUnitExpr + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/Pattern - Named args 02 - Multiple.fs b/ReSharper.FSharp/test/data/parsing/Pattern - Named args 02 - Multiple.fs new file mode 100644 index 0000000000..b54c94a44f --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Pattern - Named args 02 - Multiple.fs @@ -0,0 +1 @@ +let (Union.UnionCase(namedFieldArg1 = namedFieldPat1; namedFieldArg2 = namedFieldPat2)) = () diff --git a/ReSharper.FSharp/test/data/parsing/Pattern - Named args 02 - Multiple.fs.gold b/ReSharper.FSharp/test/data/parsing/Pattern - Named args 02 - Multiple.fs.gold new file mode 100644 index 0000000000..f196e626b3 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Pattern - Named args 02 - Multiple.fs.gold @@ -0,0 +1,47 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + IAnonModuleDeclaration + ILetModuleDecl + FSharpTokenType+LetTokenElement(type:LET, text:let) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ITopBinding + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + ITopParametersOwnerPat + IExpressionReferenceName + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:Union) + FSharpTokenType+DotTokenElement(type:DOT, text:.) + FSharpIdentifierToken(type:IDENTIFIER, text:UnionCase) + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + IFieldPat + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:namedFieldArg1) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ITopReferencePat + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:namedFieldPat1) + FSharpTokenType+SemicolonTokenElement(type:SEMICOLON, text:;) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IFieldPat + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:namedFieldArg2) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ITopReferencePat + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:namedFieldPat2) + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IChameleonExpression + IUnitExpr + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/Pattern - Parameters owner 01.fs b/ReSharper.FSharp/test/data/parsing/Pattern - Parameters owner 01.fs new file mode 100644 index 0000000000..eb2918350c --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Pattern - Parameters owner 01.fs @@ -0,0 +1,2 @@ +match () with +| A b -> () diff --git a/ReSharper.FSharp/test/data/parsing/Pattern - Parameters owner 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Pattern - Parameters owner 01.fs.gold new file mode 100644 index 0000000000..a37d5a1cf1 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Pattern - Parameters owner 01.fs.gold @@ -0,0 +1,32 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + IAnonModuleDeclaration + IDo + IChameleonExpression + IMatchExpr + FSharpTokenType+MatchTokenElement(type:MATCH, text:match) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IUnitExpr + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+WithTokenElement(type:WITH, text:with) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + IMatchClause + FSharpTokenType+BarTokenElement(type:BAR, text:|) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ILocalParametersOwnerPat + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:A) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ILocalReferencePat + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:b) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+RarrowTokenElement(type:RARROW, text:->) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IUnitExpr + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/Pattern - Parameters owner 02 - Qualified.fs b/ReSharper.FSharp/test/data/parsing/Pattern - Parameters owner 02 - Qualified.fs new file mode 100644 index 0000000000..b9f8698cbf --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Pattern - Parameters owner 02 - Qualified.fs @@ -0,0 +1,2 @@ +match () with +| A.B c -> () diff --git a/ReSharper.FSharp/test/data/parsing/Pattern - Parameters owner 02 - Qualified.fs.gold b/ReSharper.FSharp/test/data/parsing/Pattern - Parameters owner 02 - Qualified.fs.gold new file mode 100644 index 0000000000..ec8b21815b --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Pattern - Parameters owner 02 - Qualified.fs.gold @@ -0,0 +1,35 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + IAnonModuleDeclaration + IDo + IChameleonExpression + IMatchExpr + FSharpTokenType+MatchTokenElement(type:MATCH, text:match) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IUnitExpr + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+WithTokenElement(type:WITH, text:with) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + IMatchClause + FSharpTokenType+BarTokenElement(type:BAR, text:|) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ILocalParametersOwnerPat + IExpressionReferenceName + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:A) + FSharpTokenType+DotTokenElement(type:DOT, text:.) + FSharpIdentifierToken(type:IDENTIFIER, text:B) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ILocalReferencePat + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:c) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+RarrowTokenElement(type:RARROW, text:->) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IUnitExpr + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/Pattern - Reference 01.fs b/ReSharper.FSharp/test/data/parsing/Pattern - Reference 01.fs new file mode 100644 index 0000000000..d29d8b7a1c --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Pattern - Reference 01.fs @@ -0,0 +1,2 @@ +match () with +| x -> () diff --git a/ReSharper.FSharp/test/data/parsing/Pattern - Reference 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Pattern - Reference 01.fs.gold new file mode 100644 index 0000000000..78f08a0c25 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Pattern - Reference 01.fs.gold @@ -0,0 +1,28 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + IAnonModuleDeclaration + IDo + IChameleonExpression + IMatchExpr + FSharpTokenType+MatchTokenElement(type:MATCH, text:match) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IUnitExpr + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+WithTokenElement(type:WITH, text:with) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + IMatchClause + FSharpTokenType+BarTokenElement(type:BAR, text:|) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ILocalReferencePat + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:x) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+RarrowTokenElement(type:RARROW, text:->) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IUnitExpr + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/Pattern - Reference 02 - Upper.fs b/ReSharper.FSharp/test/data/parsing/Pattern - Reference 02 - Upper.fs new file mode 100644 index 0000000000..6ed6b2ea57 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Pattern - Reference 02 - Upper.fs @@ -0,0 +1,2 @@ +match () with +| X -> () diff --git a/ReSharper.FSharp/test/data/parsing/Pattern - Reference 02 - Upper.fs.gold b/ReSharper.FSharp/test/data/parsing/Pattern - Reference 02 - Upper.fs.gold new file mode 100644 index 0000000000..155023c0a9 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Pattern - Reference 02 - Upper.fs.gold @@ -0,0 +1,28 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + IAnonModuleDeclaration + IDo + IChameleonExpression + IMatchExpr + FSharpTokenType+MatchTokenElement(type:MATCH, text:match) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IUnitExpr + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+WithTokenElement(type:WITH, text:with) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + IMatchClause + FSharpTokenType+BarTokenElement(type:BAR, text:|) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ILocalReferencePat + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:X) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+RarrowTokenElement(type:RARROW, text:->) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IUnitExpr + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/Pattern - Reference 03 - Qualified.fs b/ReSharper.FSharp/test/data/parsing/Pattern - Reference 03 - Qualified.fs new file mode 100644 index 0000000000..fc2bd0911a --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Pattern - Reference 03 - Qualified.fs @@ -0,0 +1,2 @@ +match () with +| A.B -> () diff --git a/ReSharper.FSharp/test/data/parsing/Pattern - Reference 03 - Qualified.fs.gold b/ReSharper.FSharp/test/data/parsing/Pattern - Reference 03 - Qualified.fs.gold new file mode 100644 index 0000000000..a8bab3391f --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Pattern - Reference 03 - Qualified.fs.gold @@ -0,0 +1,31 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + IAnonModuleDeclaration + IDo + IChameleonExpression + IMatchExpr + FSharpTokenType+MatchTokenElement(type:MATCH, text:match) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IUnitExpr + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+WithTokenElement(type:WITH, text:with) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + IMatchClause + FSharpTokenType+BarTokenElement(type:BAR, text:|) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ILocalReferencePat + IExpressionReferenceName + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:A) + FSharpTokenType+DotTokenElement(type:DOT, text:.) + FSharpIdentifierToken(type:IDENTIFIER, text:B) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+RarrowTokenElement(type:RARROW, text:->) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IUnitExpr + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/Record field 01 - Attribute.fs.gold b/ReSharper.FSharp/test/data/parsing/Record field 01 - Attribute.fs.gold index 4ab233e821..47a4b7c9c7 100644 --- a/ReSharper.FSharp/test/data/parsing/Record field 01 - Attribute.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Record field 01 - Attribute.fs.gold @@ -31,7 +31,7 @@ IFSharpImplFile FSharpIdentifierToken(type:IDENTIFIER, text:Field) FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) Whitespace(type:WHITE_SPACE, text: ) spaces:" " diff --git a/ReSharper.FSharp/test/data/parsing/Type decl - Attributes 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Type decl - Attributes 01.fs.gold index 9cba4b5389..d1d242f0d7 100644 --- a/ReSharper.FSharp/test/data/parsing/Type decl - Attributes 01.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Type decl - Attributes 01.fs.gold @@ -14,9 +14,10 @@ IFSharpImplFile IClassDeclaration FSharpIdentifierToken(type:IDENTIFIER, text:T) IImplicitConstructorDeclaration - IMemberParamDeclarationGroup - FSharpTokenType+LparenTokenElement(type:LPAREN, text:() - FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + IMemberParamsDeclaration + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) NewLine(type:NEW_LINE, text:\n) spaces:"\n" diff --git a/ReSharper.FSharp/test/data/parsing/Type decl - Attributes 02.fs.gold b/ReSharper.FSharp/test/data/parsing/Type decl - Attributes 02.fs.gold index cb0542ef81..4c9ae377a2 100644 --- a/ReSharper.FSharp/test/data/parsing/Type decl - Attributes 02.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Type decl - Attributes 02.fs.gold @@ -21,9 +21,10 @@ IFSharpImplFile Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpIdentifierToken(type:IDENTIFIER, text:T) IImplicitConstructorDeclaration - IMemberParamDeclarationGroup - FSharpTokenType+LparenTokenElement(type:LPAREN, text:() - FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + IMemberParamsDeclaration + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) NewLine(type:NEW_LINE, text:\n) spaces:"\n" diff --git a/ReSharper.FSharp/test/data/parsing/Type decl - Delegate - Ctor 01.fs b/ReSharper.FSharp/test/data/parsing/Type decl - Delegate - Ctor 01.fs new file mode 100644 index 0000000000..98a7a3cc5a --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type decl - Delegate - Ctor 01.fs @@ -0,0 +1 @@ +type D() = delegate of int -> int diff --git a/ReSharper.FSharp/test/data/parsing/Type decl - Delegate 03 - Ctor.fs.gold b/ReSharper.FSharp/test/data/parsing/Type decl - Delegate - Ctor 01.fs.gold similarity index 66% rename from ReSharper.FSharp/test/data/parsing/Type decl - Delegate 03 - Ctor.fs.gold rename to ReSharper.FSharp/test/data/parsing/Type decl - Delegate - Ctor 01.fs.gold index fc3b42d0b0..f28a4d70e7 100644 --- a/ReSharper.FSharp/test/data/parsing/Type decl - Delegate 03 - Ctor.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Type decl - Delegate - Ctor 01.fs.gold @@ -7,17 +7,10 @@ IFSharpImplFile IDelegateDeclaration FSharpIdentifierToken(type:IDENTIFIER, text:D) IImplicitConstructorDeclaration - IMemberParamDeclarationGroup - FSharpTokenType+LparenTokenElement(type:LPAREN, text:() - IMemberParamDeclaration - ILocalDeclaration - FSharpIdentifierToken(type:IDENTIFIER, text:x) - FSharpTokenType+ColonTokenElement(type:COLON, text::) - Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType - ITypeReferenceName - FSharpIdentifierToken(type:IDENTIFIER, text:int) - FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + IMemberParamsDeclaration + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) Whitespace(type:WHITE_SPACE, text: ) spaces:" " @@ -26,14 +19,14 @@ IFSharpImplFile Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+OfTokenElement(type:OF, text:of) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IFunType - INamedType + IFunctionTypeUsage + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+RarrowTokenElement(type:RARROW, text:->) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) NewLine(type:NEW_LINE, text:\n) spaces:"\n" diff --git a/ReSharper.FSharp/test/data/parsing/Type decl - Delegate 03 - Ctor.fs b/ReSharper.FSharp/test/data/parsing/Type decl - Delegate - Ctor 02.fs similarity index 100% rename from ReSharper.FSharp/test/data/parsing/Type decl - Delegate 03 - Ctor.fs rename to ReSharper.FSharp/test/data/parsing/Type decl - Delegate - Ctor 02.fs diff --git a/ReSharper.FSharp/test/data/parsing/Type decl - Delegate - Ctor 02.fs.gold b/ReSharper.FSharp/test/data/parsing/Type decl - Delegate - Ctor 02.fs.gold new file mode 100644 index 0000000000..0935c045eb --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type decl - Delegate - Ctor 02.fs.gold @@ -0,0 +1,42 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + IAnonModuleDeclaration + ITypeDeclarationGroup + FSharpTokenType+TypeTokenElement(type:TYPE, text:type) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IDelegateDeclaration + FSharpIdentifierToken(type:IDENTIFIER, text:D) + IImplicitConstructorDeclaration + IMemberParamsDeclaration + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + ITypedPat + ILocalReferencePat + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:x) + FSharpTokenType+ColonTokenElement(type:COLON, text::) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + INamedTypeUsage + ITypeReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:int) + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IDelegateRepresentation + FSharpTokenType+DelegateTokenElement(type:DELEGATE, text:delegate) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+OfTokenElement(type:OF, text:of) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IFunctionTypeUsage + INamedTypeUsage + ITypeReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:int) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+RarrowTokenElement(type:RARROW, text:->) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + INamedTypeUsage + ITypeReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:int) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/Type decl - Delegate 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Type decl - Delegate 01.fs.gold index aa2a72e01e..25d567b98e 100644 --- a/ReSharper.FSharp/test/data/parsing/Type decl - Delegate 01.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Type decl - Delegate 01.fs.gold @@ -14,14 +14,14 @@ IFSharpImplFile Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+OfTokenElement(type:OF, text:of) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IFunType - INamedType + IFunctionTypeUsage + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+RarrowTokenElement(type:RARROW, text:->) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) NewLine(type:NEW_LINE, text:\n) spaces:"\n" diff --git a/ReSharper.FSharp/test/data/parsing/Type decl - Delegate 02.fs.gold b/ReSharper.FSharp/test/data/parsing/Type decl - Delegate 02.fs.gold index cfe6bf6663..cc95863864 100644 --- a/ReSharper.FSharp/test/data/parsing/Type decl - Delegate 02.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Type decl - Delegate 02.fs.gold @@ -14,7 +14,7 @@ IFSharpImplFile Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+OfTokenElement(type:OF, text:of) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) NewLine(type:NEW_LINE, text:\n) spaces:"\n" diff --git a/ReSharper.FSharp/test/data/parsing/Type decl - Enum 01 - With first bar.fs.gold b/ReSharper.FSharp/test/data/parsing/Type decl - Enum 01 - With first bar.fs.gold index b335c09776..0dc6f3ce6a 100644 --- a/ReSharper.FSharp/test/data/parsing/Type decl - Enum 01 - With first bar.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Type decl - Enum 01 - With first bar.fs.gold @@ -10,23 +10,24 @@ IFSharpImplFile FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) NewLine(type:NEW_LINE, text:\n) spaces:"\n" Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IEnumMemberDeclaration - FSharpTokenType+BarTokenElement(type:BAR, text:|) - Whitespace(type:WHITE_SPACE, text: ) spaces:" " - FSharpIdentifierToken(type:IDENTIFIER, text:B) - Whitespace(type:WHITE_SPACE, text: ) spaces:" " - FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) - Whitespace(type:WHITE_SPACE, text: ) spaces:" " - FSharpToken(type:INT32, text:0) - NewLine(type:NEW_LINE, text:\n) spaces:"\n" - Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IEnumMemberDeclaration - FSharpTokenType+BarTokenElement(type:BAR, text:|) - Whitespace(type:WHITE_SPACE, text: ) spaces:" " - FSharpIdentifierToken(type:IDENTIFIER, text:C) - Whitespace(type:WHITE_SPACE, text: ) spaces:" " - FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) - Whitespace(type:WHITE_SPACE, text: ) spaces:" " - FSharpToken(type:INT32, text:1) + IEnumRepresentation + IEnumMemberDeclaration + FSharpTokenType+BarTokenElement(type:BAR, text:|) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpIdentifierToken(type:IDENTIFIER, text:B) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpToken(type:INT32, text:0) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IEnumMemberDeclaration + FSharpTokenType+BarTokenElement(type:BAR, text:|) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpIdentifierToken(type:IDENTIFIER, text:C) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpToken(type:INT32, text:1) NewLine(type:NEW_LINE, text:\n) spaces:"\n" diff --git a/ReSharper.FSharp/test/data/parsing/Type decl - Enum 02 - Without first bar.fs.gold b/ReSharper.FSharp/test/data/parsing/Type decl - Enum 02 - Without first bar.fs.gold index a9fcc5c440..565cfb02bc 100644 --- a/ReSharper.FSharp/test/data/parsing/Type decl - Enum 02 - Without first bar.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Type decl - Enum 02 - Without first bar.fs.gold @@ -9,16 +9,17 @@ IFSharpImplFile Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IEnumMemberDeclaration - FSharpIdentifierToken(type:IDENTIFIER, text:B) - FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) - FSharpToken(type:INT32, text:0) - Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IEnumMemberDeclaration - FSharpTokenType+BarTokenElement(type:BAR, text:|) + IEnumRepresentation + IEnumMemberDeclaration + FSharpIdentifierToken(type:IDENTIFIER, text:B) + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + FSharpToken(type:INT32, text:0) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - FSharpIdentifierToken(type:IDENTIFIER, text:C) - FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) - FSharpToken(type:INT32, text:1) + IEnumMemberDeclaration + FSharpTokenType+BarTokenElement(type:BAR, text:|) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpIdentifierToken(type:IDENTIFIER, text:C) + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + FSharpToken(type:INT32, text:1) NewLine(type:NEW_LINE, text:\n) spaces:"\n" diff --git a/ReSharper.FSharp/test/data/parsing/Type decl - Exception 02.fs.gold b/ReSharper.FSharp/test/data/parsing/Type decl - Exception 02.fs.gold index 15f86bc5db..b534185a4c 100644 --- a/ReSharper.FSharp/test/data/parsing/Type decl - Exception 02.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Type decl - Exception 02.fs.gold @@ -9,7 +9,7 @@ IFSharpImplFile FSharpTokenType+OfTokenElement(type:OF, text:of) Whitespace(type:WHITE_SPACE, text: ) spaces:" " IExceptionFieldDeclaration - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) diff --git a/ReSharper.FSharp/test/data/parsing/Type decl - Let binding - Function 01.fs b/ReSharper.FSharp/test/data/parsing/Type decl - Let binding - Function 01.fs new file mode 100644 index 0000000000..b6183539b5 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type decl - Let binding - Function 01.fs @@ -0,0 +1,2 @@ +type T() = + let f x = 123 diff --git a/ReSharper.FSharp/test/data/parsing/Type decl - Let binding - Function 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Type decl - Let binding - Function 01.fs.gold new file mode 100644 index 0000000000..0c31cc91a5 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type decl - Let binding - Function 01.fs.gold @@ -0,0 +1,36 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + IAnonModuleDeclaration + ITypeDeclarationGroup + FSharpTokenType+TypeTokenElement(type:TYPE, text:type) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IObjectTypeDeclaration + FSharpIdentifierToken(type:IDENTIFIER, text:T) + IImplicitConstructorDeclaration + IMemberParamsDeclaration + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ILetModuleDecl + FSharpTokenType+LetTokenElement(type:LET, text:let) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ITopBinding + ITopParametersOwnerPat + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:f) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ILocalReferencePat + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:x) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IChameleonExpression + ILiteralExpr + FSharpToken(type:INT32, text:123) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/Type decl - Let binding - Value 01.fs b/ReSharper.FSharp/test/data/parsing/Type decl - Let binding - Value 01.fs new file mode 100644 index 0000000000..266ea7632e --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type decl - Let binding - Value 01.fs @@ -0,0 +1,2 @@ +type T() = + let x = 123 diff --git a/ReSharper.FSharp/test/data/parsing/Type decl - Let binding - Value 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Type decl - Let binding - Value 01.fs.gold new file mode 100644 index 0000000000..b5c504f2f1 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type decl - Let binding - Value 01.fs.gold @@ -0,0 +1,32 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + IAnonModuleDeclaration + ITypeDeclarationGroup + FSharpTokenType+TypeTokenElement(type:TYPE, text:type) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IObjectTypeDeclaration + FSharpIdentifierToken(type:IDENTIFIER, text:T) + IImplicitConstructorDeclaration + IMemberParamsDeclaration + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ILetModuleDecl + FSharpTokenType+LetTokenElement(type:LET, text:let) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ITopBinding + ITopReferencePat + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:x) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IChameleonExpression + ILiteralExpr + FSharpToken(type:INT32, text:123) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/Type decl - Let binding - Value 02 - Upper.fs b/ReSharper.FSharp/test/data/parsing/Type decl - Let binding - Value 02 - Upper.fs new file mode 100644 index 0000000000..14e5b4ed76 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type decl - Let binding - Value 02 - Upper.fs @@ -0,0 +1,2 @@ +type T() = + let X = 123 diff --git a/ReSharper.FSharp/test/data/parsing/Type decl - Let binding - Value 02 - Upper.fs.gold b/ReSharper.FSharp/test/data/parsing/Type decl - Let binding - Value 02 - Upper.fs.gold new file mode 100644 index 0000000000..3910c3079e --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type decl - Let binding - Value 02 - Upper.fs.gold @@ -0,0 +1,32 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + IAnonModuleDeclaration + ITypeDeclarationGroup + FSharpTokenType+TypeTokenElement(type:TYPE, text:type) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IObjectTypeDeclaration + FSharpIdentifierToken(type:IDENTIFIER, text:T) + IImplicitConstructorDeclaration + IMemberParamsDeclaration + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ILetModuleDecl + FSharpTokenType+LetTokenElement(type:LET, text:let) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ITopBinding + ITopReferencePat + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:X) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IChameleonExpression + ILiteralExpr + FSharpToken(type:INT32, text:123) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/Type decl - Union 01.fs b/ReSharper.FSharp/test/data/parsing/Type decl - Union 01.fs new file mode 100644 index 0000000000..b8159c7bef --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type decl - Union 01.fs @@ -0,0 +1,3 @@ +type Foo = + | A + | B diff --git a/ReSharper.FSharp/test/data/parsing/Type decl - Union 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Type decl - Union 01.fs.gold new file mode 100644 index 0000000000..0333b9e390 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type decl - Union 01.fs.gold @@ -0,0 +1,26 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + IAnonModuleDeclaration + ITypeDeclarationGroup + FSharpTokenType+TypeTokenElement(type:TYPE, text:type) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IUnionDeclaration + FSharpIdentifierToken(type:IDENTIFIER, text:Foo) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IUnionRepresentation + IUnionCaseList + ISingletonCaseDeclaration + FSharpTokenType+BarTokenElement(type:BAR, text:|) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpIdentifierToken(type:IDENTIFIER, text:A) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ISingletonCaseDeclaration + FSharpTokenType+BarTokenElement(type:BAR, text:|) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpIdentifierToken(type:IDENTIFIER, text:B) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/Type decl - Union 02 - Modifier.fs b/ReSharper.FSharp/test/data/parsing/Type decl - Union 02 - Modifier.fs new file mode 100644 index 0000000000..4039187f0d --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type decl - Union 02 - Modifier.fs @@ -0,0 +1,4 @@ +type Foo = + private + | A + | B diff --git a/ReSharper.FSharp/test/data/parsing/Type decl - Union 02 - Modifier.fs.gold b/ReSharper.FSharp/test/data/parsing/Type decl - Union 02 - Modifier.fs.gold new file mode 100644 index 0000000000..8640b441b8 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type decl - Union 02 - Modifier.fs.gold @@ -0,0 +1,29 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + IAnonModuleDeclaration + ITypeDeclarationGroup + FSharpTokenType+TypeTokenElement(type:TYPE, text:type) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IUnionDeclaration + FSharpIdentifierToken(type:IDENTIFIER, text:Foo) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IUnionRepresentation + FSharpTokenType+PrivateTokenElement(type:PRIVATE, text:private) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IUnionCaseList + ISingletonCaseDeclaration + FSharpTokenType+BarTokenElement(type:BAR, text:|) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpIdentifierToken(type:IDENTIFIER, text:A) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ISingletonCaseDeclaration + FSharpTokenType+BarTokenElement(type:BAR, text:|) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpIdentifierToken(type:IDENTIFIER, text:B) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/Type decl - Union 03 - No first bar.fs b/ReSharper.FSharp/test/data/parsing/Type decl - Union 03 - No first bar.fs new file mode 100644 index 0000000000..f403cf1f60 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type decl - Union 03 - No first bar.fs @@ -0,0 +1 @@ +type Foo = A | B diff --git a/ReSharper.FSharp/test/data/parsing/Type decl - Union 03 - No first bar.fs.gold b/ReSharper.FSharp/test/data/parsing/Type decl - Union 03 - No first bar.fs.gold new file mode 100644 index 0000000000..5a6c63073f --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type decl - Union 03 - No first bar.fs.gold @@ -0,0 +1,22 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + IAnonModuleDeclaration + ITypeDeclarationGroup + FSharpTokenType+TypeTokenElement(type:TYPE, text:type) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IUnionDeclaration + FSharpIdentifierToken(type:IDENTIFIER, text:Foo) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IUnionRepresentation + IUnionCaseList + ISingletonCaseDeclaration + FSharpIdentifierToken(type:IDENTIFIER, text:A) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ISingletonCaseDeclaration + FSharpTokenType+BarTokenElement(type:BAR, text:|) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpIdentifierToken(type:IDENTIFIER, text:B) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/Type decl - Union 04 - No first bar with modifier.fs b/ReSharper.FSharp/test/data/parsing/Type decl - Union 04 - No first bar with modifier.fs new file mode 100644 index 0000000000..216077bd94 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type decl - Union 04 - No first bar with modifier.fs @@ -0,0 +1 @@ +type Foo = private A | B diff --git a/ReSharper.FSharp/test/data/parsing/Type decl - Union 04 - No first bar with modifier.fs.gold b/ReSharper.FSharp/test/data/parsing/Type decl - Union 04 - No first bar with modifier.fs.gold new file mode 100644 index 0000000000..a91cc32b87 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type decl - Union 04 - No first bar with modifier.fs.gold @@ -0,0 +1,24 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + IAnonModuleDeclaration + ITypeDeclarationGroup + FSharpTokenType+TypeTokenElement(type:TYPE, text:type) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IUnionDeclaration + FSharpIdentifierToken(type:IDENTIFIER, text:Foo) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IUnionRepresentation + FSharpTokenType+PrivateTokenElement(type:PRIVATE, text:private) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IUnionCaseList + ISingletonCaseDeclaration + FSharpIdentifierToken(type:IDENTIFIER, text:A) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ISingletonCaseDeclaration + FSharpTokenType+BarTokenElement(type:BAR, text:|) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpIdentifierToken(type:IDENTIFIER, text:B) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary - Parameters 01.fs b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary - Parameters 01.fs new file mode 100644 index 0000000000..36044f0eec --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary - Parameters 01.fs @@ -0,0 +1,4 @@ +module Module + +type T(a) = + class end diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary - Parameters 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary - Parameters 01.fs.gold new file mode 100644 index 0000000000..1f5b3bf17e --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary - Parameters 01.fs.gold @@ -0,0 +1,30 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + INamedModuleDeclaration + FSharpTokenType+ModuleTokenElement(type:MODULE, text:module) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpIdentifierToken(type:IDENTIFIER, text:Module) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + ITypeDeclarationGroup + FSharpTokenType+TypeTokenElement(type:TYPE, text:type) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IClassDeclaration + FSharpIdentifierToken(type:IDENTIFIER, text:T) + IImplicitConstructorDeclaration + IMemberParamsDeclaration + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + ILocalReferencePat + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:a) + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+ClassTokenElement(type:CLASS, text:class) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EndTokenElement(type:END, text:end) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary - Parameters 02 - Typed.fs b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary - Parameters 02 - Typed.fs new file mode 100644 index 0000000000..61fc69b3c5 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary - Parameters 02 - Typed.fs @@ -0,0 +1,4 @@ +module Module + +type T(a: int) = + class end diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary - Parameters 02 - Typed.fs.gold b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary - Parameters 02 - Typed.fs.gold new file mode 100644 index 0000000000..213bfa49af --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary - Parameters 02 - Typed.fs.gold @@ -0,0 +1,36 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + INamedModuleDeclaration + FSharpTokenType+ModuleTokenElement(type:MODULE, text:module) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpIdentifierToken(type:IDENTIFIER, text:Module) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + ITypeDeclarationGroup + FSharpTokenType+TypeTokenElement(type:TYPE, text:type) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IClassDeclaration + FSharpIdentifierToken(type:IDENTIFIER, text:T) + IImplicitConstructorDeclaration + IMemberParamsDeclaration + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + ITypedPat + ILocalReferencePat + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:a) + FSharpTokenType+ColonTokenElement(type:COLON, text::) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + INamedTypeUsage + ITypeReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:int) + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+ClassTokenElement(type:CLASS, text:class) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EndTokenElement(type:END, text:end) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary - Parameters 03.fs b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary - Parameters 03.fs new file mode 100644 index 0000000000..a42eba61ad --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary - Parameters 03.fs @@ -0,0 +1,4 @@ +module Module + +type T(a: int, b: int) = + class end diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary - Parameters 03.fs.gold b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary - Parameters 03.fs.gold new file mode 100644 index 0000000000..ef34a1fc32 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary - Parameters 03.fs.gold @@ -0,0 +1,48 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + INamedModuleDeclaration + FSharpTokenType+ModuleTokenElement(type:MODULE, text:module) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpIdentifierToken(type:IDENTIFIER, text:Module) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + ITypeDeclarationGroup + FSharpTokenType+TypeTokenElement(type:TYPE, text:type) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IClassDeclaration + FSharpIdentifierToken(type:IDENTIFIER, text:T) + IImplicitConstructorDeclaration + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + IMemberParamsDeclaration + IParenPat + ITuplePat + ITypedPat + ILocalReferencePat + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:a) + FSharpTokenType+ColonTokenElement(type:COLON, text::) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + INamedTypeUsage + ITypeReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:int) + FSharpTokenType+CommaTokenElement(type:COMMA, text:,) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ITypedPat + ILocalReferencePat + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:b) + FSharpTokenType+ColonTokenElement(type:COLON, text::) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + INamedTypeUsage + ITypeReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:int) + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+ClassTokenElement(type:CLASS, text:class) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EndTokenElement(type:END, text:end) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary - Parameters 04 - Attributes.fs b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary - Parameters 04 - Attributes.fs new file mode 100644 index 0000000000..a68eb055fc --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary - Parameters 04 - Attributes.fs @@ -0,0 +1,4 @@ +module Module + +type T([] a) = + class end diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary - Parameters 04 - Attributes.fs.gold b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary - Parameters 04 - Attributes.fs.gold new file mode 100644 index 0000000000..d11e1842a7 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary - Parameters 04 - Attributes.fs.gold @@ -0,0 +1,38 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + INamedModuleDeclaration + FSharpTokenType+ModuleTokenElement(type:MODULE, text:module) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpIdentifierToken(type:IDENTIFIER, text:Module) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + ITypeDeclarationGroup + FSharpTokenType+TypeTokenElement(type:TYPE, text:type) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IClassDeclaration + FSharpIdentifierToken(type:IDENTIFIER, text:T) + IImplicitConstructorDeclaration + IMemberParamsDeclaration + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + IAttribPat + IAttributeList + FSharpTokenType+LbrackLessTokenElement(type:LBRACK_LESS, text:[<) + IAttribute + ITypeReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:Attr) + FSharpTokenType+GreaterRbrackTokenElement(type:GREATER_RBRACK, text:>]) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ILocalReferencePat + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:a) + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+ClassTokenElement(type:CLASS, text:class) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EndTokenElement(type:END, text:end) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary - Parameters 05 - Attributes.fs b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary - Parameters 05 - Attributes.fs new file mode 100644 index 0000000000..2f1a370c2b --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary - Parameters 05 - Attributes.fs @@ -0,0 +1,4 @@ +module Module + +type T([] a: int) = + class end diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary - Parameters 05 - Attributes.fs.gold b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary - Parameters 05 - Attributes.fs.gold new file mode 100644 index 0000000000..fa820aa232 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary - Parameters 05 - Attributes.fs.gold @@ -0,0 +1,44 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + INamedModuleDeclaration + FSharpTokenType+ModuleTokenElement(type:MODULE, text:module) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpIdentifierToken(type:IDENTIFIER, text:Module) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + ITypeDeclarationGroup + FSharpTokenType+TypeTokenElement(type:TYPE, text:type) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IClassDeclaration + FSharpIdentifierToken(type:IDENTIFIER, text:T) + IImplicitConstructorDeclaration + IMemberParamsDeclaration + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + IAttribPat + IAttributeList + FSharpTokenType+LbrackLessTokenElement(type:LBRACK_LESS, text:[<) + IAttribute + ITypeReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:Attr) + FSharpTokenType+GreaterRbrackTokenElement(type:GREATER_RBRACK, text:>]) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ITypedPat + ILocalReferencePat + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:a) + FSharpTokenType+ColonTokenElement(type:COLON, text::) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + INamedTypeUsage + ITypeReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:int) + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+ClassTokenElement(type:CLASS, text:class) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EndTokenElement(type:END, text:end) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary 01.fs.gold index b96c521952..4350c94b5e 100644 --- a/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary 01.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary 01.fs.gold @@ -7,9 +7,10 @@ IFSharpImplFile IClassDeclaration FSharpIdentifierToken(type:IDENTIFIER, text:T) IImplicitConstructorDeclaration - IMemberParamDeclarationGroup - FSharpTokenType+LparenTokenElement(type:LPAREN, text:() - FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + IMemberParamsDeclaration + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) NewLine(type:NEW_LINE, text:\n) spaces:"\n" diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary 02 - Modifier.fs.gold b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary 02 - Modifier.fs.gold index d69a10f0e8..0877cbac7e 100644 --- a/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary 02 - Modifier.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary 02 - Modifier.fs.gold @@ -10,9 +10,10 @@ IFSharpImplFile IImplicitConstructorDeclaration FSharpTokenType+InternalTokenElement(type:INTERNAL, text:internal) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IMemberParamDeclarationGroup - FSharpTokenType+LparenTokenElement(type:LPAREN, text:() - FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + IMemberParamsDeclaration + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) NewLine(type:NEW_LINE, text:\n) spaces:"\n" diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary 03 - Attributes.fs.gold b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary 03 - Attributes.fs.gold index d15fca7467..5273159686 100644 --- a/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary 03 - Attributes.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Primary 03 - Attributes.fs.gold @@ -21,9 +21,10 @@ IFSharpImplFile FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) FSharpTokenType+GreaterRbrackTokenElement(type:GREATER_RBRACK, text:>]) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IMemberParamDeclarationGroup - FSharpTokenType+LparenTokenElement(type:LPAREN, text:() - FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + IMemberParamsDeclaration + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) NewLine(type:NEW_LINE, text:\n) spaces:"\n" diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Secondary - Parameters 01.fs b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Secondary - Parameters 01.fs new file mode 100644 index 0000000000..b879820afb --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Secondary - Parameters 01.fs @@ -0,0 +1,4 @@ +module Module + +type T = + new (a: int) = () diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Secondary - Parameters 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Secondary - Parameters 01.fs.gold new file mode 100644 index 0000000000..67a27f3c7c --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Secondary - Parameters 01.fs.gold @@ -0,0 +1,42 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + INamedModuleDeclaration + FSharpTokenType+ModuleTokenElement(type:MODULE, text:module) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpIdentifierToken(type:IDENTIFIER, text:Module) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + ITypeDeclarationGroup + FSharpTokenType+TypeTokenElement(type:TYPE, text:type) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IObjectTypeDeclaration + FSharpIdentifierToken(type:IDENTIFIER, text:T) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IMemberConstructorDeclaration + FSharpTokenType+NewTokenElement(type:NEW, text:new) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IMemberParamsDeclaration + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + ITypedPat + ILocalReferencePat + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:a) + FSharpTokenType+ColonTokenElement(type:COLON, text::) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + INamedTypeUsage + ITypeReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:int) + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IChameleonExpression + IUnitExpr + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Secondary - Parameters 02.fs b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Secondary - Parameters 02.fs new file mode 100644 index 0000000000..49dca4c476 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Secondary - Parameters 02.fs @@ -0,0 +1,4 @@ +module Module + +type T = + new (a: int, b: int) = () diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Secondary - Parameters 02.fs.gold b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Secondary - Parameters 02.fs.gold new file mode 100644 index 0000000000..a6394adb89 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Secondary - Parameters 02.fs.gold @@ -0,0 +1,54 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + INamedModuleDeclaration + FSharpTokenType+ModuleTokenElement(type:MODULE, text:module) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpIdentifierToken(type:IDENTIFIER, text:Module) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + ITypeDeclarationGroup + FSharpTokenType+TypeTokenElement(type:TYPE, text:type) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IObjectTypeDeclaration + FSharpIdentifierToken(type:IDENTIFIER, text:T) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IMemberConstructorDeclaration + FSharpTokenType+NewTokenElement(type:NEW, text:new) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IMemberParamsDeclaration + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + ITuplePat + ITypedPat + ILocalReferencePat + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:a) + FSharpTokenType+ColonTokenElement(type:COLON, text::) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + INamedTypeUsage + ITypeReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:int) + FSharpTokenType+CommaTokenElement(type:COMMA, text:,) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ITypedPat + ILocalReferencePat + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:b) + FSharpTokenType+ColonTokenElement(type:COLON, text::) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + INamedTypeUsage + ITypeReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:int) + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IChameleonExpression + IUnitExpr + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Secondary 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Secondary 01.fs.gold index 028ba3959e..52dcb83247 100644 --- a/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Secondary 01.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Secondary 01.fs.gold @@ -7,9 +7,10 @@ IFSharpImplFile IObjectTypeDeclaration FSharpIdentifierToken(type:IDENTIFIER, text:T) IImplicitConstructorDeclaration - IMemberParamDeclarationGroup - FSharpTokenType+LparenTokenElement(type:LPAREN, text:() - FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + IMemberParamsDeclaration + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) NewLine(type:NEW_LINE, text:\n) spaces:"\n" @@ -17,7 +18,7 @@ IFSharpImplFile IMemberConstructorDeclaration FSharpTokenType+NewTokenElement(type:NEW, text:new) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IMemberParamDeclaration + IMemberParamsDeclaration IParenPat FSharpTokenType+LparenTokenElement(type:LPAREN, text:() IWildPat diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Secondary 02 - Modifier.fs.gold b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Secondary 02 - Modifier.fs.gold index 90edc9646c..34460f7d9a 100644 --- a/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Secondary 02 - Modifier.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Secondary 02 - Modifier.fs.gold @@ -7,9 +7,10 @@ IFSharpImplFile IObjectTypeDeclaration FSharpIdentifierToken(type:IDENTIFIER, text:T) IImplicitConstructorDeclaration - IMemberParamDeclarationGroup - FSharpTokenType+LparenTokenElement(type:LPAREN, text:() - FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + IMemberParamsDeclaration + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) NewLine(type:NEW_LINE, text:\n) spaces:"\n" @@ -19,7 +20,7 @@ IFSharpImplFile Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+NewTokenElement(type:NEW, text:new) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IMemberParamDeclaration + IMemberParamsDeclaration IParenPat FSharpTokenType+LparenTokenElement(type:LPAREN, text:() IWildPat diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Secondary 03 - Attributes.fs b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Secondary 03 - Attributes.fs new file mode 100644 index 0000000000..fdc33c33a0 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Secondary 03 - Attributes.fs @@ -0,0 +1,2 @@ +type T() = + [] new (_) = T() diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Secondary 03 - Attributes.fs.gold b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Secondary 03 - Attributes.fs.gold new file mode 100644 index 0000000000..01f8f60a20 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Secondary 03 - Attributes.fs.gold @@ -0,0 +1,45 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + IAnonModuleDeclaration + ITypeDeclarationGroup + FSharpTokenType+TypeTokenElement(type:TYPE, text:type) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IObjectTypeDeclaration + FSharpIdentifierToken(type:IDENTIFIER, text:T) + IImplicitConstructorDeclaration + IMemberParamsDeclaration + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IMemberConstructorDeclaration + IAttributeList + FSharpTokenType+LbrackLessTokenElement(type:LBRACK_LESS, text:[<) + IAttribute + ITypeReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:A) + FSharpTokenType+GreaterRbrackTokenElement(type:GREATER_RBRACK, text:>]) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+NewTokenElement(type:NEW, text:new) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IMemberParamsDeclaration + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + IWildPat + FSharpTokenType+UnderscoreTokenElement(type:UNDERSCORE, text:_) + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IChameleonExpression + IPrefixAppExpr + IReferenceExpr + FSharpIdentifierToken(type:IDENTIFIER, text:T) + IUnitExpr + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Secondary 04 - Self id.fs b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Secondary 04 - Self id.fs new file mode 100644 index 0000000000..4251c7c9c4 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Secondary 04 - Self id.fs @@ -0,0 +1,2 @@ +type T() = + new (_) as t = T() diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Secondary 04 - Self id.fs.gold b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Secondary 04 - Self id.fs.gold new file mode 100644 index 0000000000..5bd686130a --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type member - Ctor - Secondary 04 - Self id.fs.gold @@ -0,0 +1,43 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + IAnonModuleDeclaration + ITypeDeclarationGroup + FSharpTokenType+TypeTokenElement(type:TYPE, text:type) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IObjectTypeDeclaration + FSharpIdentifierToken(type:IDENTIFIER, text:T) + IImplicitConstructorDeclaration + IMemberParamsDeclaration + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IMemberConstructorDeclaration + FSharpTokenType+NewTokenElement(type:NEW, text:new) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IMemberParamsDeclaration + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + IWildPat + FSharpTokenType+UnderscoreTokenElement(type:UNDERSCORE, text:_) + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ICtorSelfId + FSharpTokenType+AsTokenElement(type:AS, text:as) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpIdentifierToken(type:IDENTIFIER, text:t) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IChameleonExpression + IPrefixAppExpr + IReferenceExpr + FSharpIdentifierToken(type:IDENTIFIER, text:T) + IUnitExpr + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Do 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Type member - Do 01.fs.gold index 2273017181..c983587f67 100644 --- a/ReSharper.FSharp/test/data/parsing/Type member - Do 01.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Type member - Do 01.fs.gold @@ -7,9 +7,10 @@ IFSharpImplFile IObjectTypeDeclaration FSharpIdentifierToken(type:IDENTIFIER, text:T) IImplicitConstructorDeclaration - IMemberParamDeclarationGroup - FSharpTokenType+LparenTokenElement(type:LPAREN, text:() - FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + IMemberParamsDeclaration + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) NewLine(type:NEW_LINE, text:\n) spaces:"\n" diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Inherit - Type 01 - Simple.fs.gold b/ReSharper.FSharp/test/data/parsing/Type member - Inherit - Type 01 - Simple.fs.gold index 111d7ea539..41eb34e881 100644 --- a/ReSharper.FSharp/test/data/parsing/Type member - Inherit - Type 01 - Simple.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Type member - Inherit - Type 01 - Simple.fs.gold @@ -7,9 +7,10 @@ IFSharpImplFile IObjectTypeDeclaration FSharpIdentifierToken(type:IDENTIFIER, text:T) IImplicitConstructorDeclaration - IMemberParamDeclarationGroup - FSharpTokenType+LparenTokenElement(type:LPAREN, text:() - FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + IMemberParamsDeclaration + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) NewLine(type:NEW_LINE, text:\n) spaces:"\n" diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Inherit - Type 02 - Qualified.fs.gold b/ReSharper.FSharp/test/data/parsing/Type member - Inherit - Type 02 - Qualified.fs.gold index b520ed7a48..31110c7c27 100644 --- a/ReSharper.FSharp/test/data/parsing/Type member - Inherit - Type 02 - Qualified.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Type member - Inherit - Type 02 - Qualified.fs.gold @@ -7,9 +7,10 @@ IFSharpImplFile IObjectTypeDeclaration FSharpIdentifierToken(type:IDENTIFIER, text:T) IImplicitConstructorDeclaration - IMemberParamDeclarationGroup - FSharpTokenType+LparenTokenElement(type:LPAREN, text:() - FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + IMemberParamsDeclaration + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) NewLine(type:NEW_LINE, text:\n) spaces:"\n" diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Inherit - Type 03 - Arguments.fs.gold b/ReSharper.FSharp/test/data/parsing/Type member - Inherit - Type 03 - Arguments.fs.gold index 3358ca32f7..736499ed80 100644 --- a/ReSharper.FSharp/test/data/parsing/Type member - Inherit - Type 03 - Arguments.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Type member - Inherit - Type 03 - Arguments.fs.gold @@ -7,9 +7,10 @@ IFSharpImplFile IObjectTypeDeclaration FSharpIdentifierToken(type:IDENTIFIER, text:T) IImplicitConstructorDeclaration - IMemberParamDeclarationGroup - FSharpTokenType+LparenTokenElement(type:LPAREN, text:() - FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + IMemberParamsDeclaration + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) NewLine(type:NEW_LINE, text:\n) spaces:"\n" diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Inherit - Type 04 - Type parameters 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Type member - Inherit - Type 04 - Type parameters 01.fs.gold index 01ff0fdae0..a4897c5776 100644 --- a/ReSharper.FSharp/test/data/parsing/Type member - Inherit - Type 04 - Type parameters 01.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Type member - Inherit - Type 04 - Type parameters 01.fs.gold @@ -7,9 +7,10 @@ IFSharpImplFile IObjectTypeDeclaration FSharpIdentifierToken(type:IDENTIFIER, text:T) IImplicitConstructorDeclaration - IMemberParamDeclarationGroup - FSharpTokenType+LparenTokenElement(type:LPAREN, text:() - FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + IMemberParamsDeclaration + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) NewLine(type:NEW_LINE, text:\n) spaces:"\n" @@ -21,7 +22,7 @@ IFSharpImplFile FSharpIdentifierToken(type:IDENTIFIER, text:Foo) IPrefixAppTypeArgumentList FSharpTokenType+LessTokenElement(type:LESS, text:<) - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) FSharpTokenType+GreaterTokenElement(type:GREATER, text:>) diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Let bindings 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Type member - Let bindings 01.fs.gold index a202732d08..b5c504f2f1 100644 --- a/ReSharper.FSharp/test/data/parsing/Type member - Let bindings 01.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Type member - Let bindings 01.fs.gold @@ -7,9 +7,10 @@ IFSharpImplFile IObjectTypeDeclaration FSharpIdentifierToken(type:IDENTIFIER, text:T) IImplicitConstructorDeclaration - IMemberParamDeclarationGroup - FSharpTokenType+LparenTokenElement(type:LPAREN, text:() - FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + IMemberParamsDeclaration + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) NewLine(type:NEW_LINE, text:\n) spaces:"\n" diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Member - Method - Parameters 01.fs b/ReSharper.FSharp/test/data/parsing/Type member - Member - Method - Parameters 01.fs new file mode 100644 index 0000000000..dd4b6badc1 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type member - Member - Method - Parameters 01.fs @@ -0,0 +1,4 @@ +module Module + +type T = + static member M(a: int) = () diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Member - Method - Parameters 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Type member - Member - Method - Parameters 01.fs.gold new file mode 100644 index 0000000000..429e72cecc --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type member - Member - Method - Parameters 01.fs.gold @@ -0,0 +1,45 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + INamedModuleDeclaration + FSharpTokenType+ModuleTokenElement(type:MODULE, text:module) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpIdentifierToken(type:IDENTIFIER, text:Module) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + ITypeDeclarationGroup + FSharpTokenType+TypeTokenElement(type:TYPE, text:type) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IObjectTypeDeclaration + FSharpIdentifierToken(type:IDENTIFIER, text:T) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IMemberDeclaration + FSharpTokenType+StaticTokenElement(type:STATIC, text:static) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+MemberTokenElement(type:MEMBER, text:member) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpIdentifierToken(type:IDENTIFIER, text:M) + IMemberParamsDeclaration + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + ITypedPat + ILocalReferencePat + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:a) + FSharpTokenType+ColonTokenElement(type:COLON, text::) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + INamedTypeUsage + ITypeReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:int) + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IChameleonExpression + IUnitExpr + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Member - Method - Parameters 02.fs b/ReSharper.FSharp/test/data/parsing/Type member - Member - Method - Parameters 02.fs new file mode 100644 index 0000000000..5d793e5867 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type member - Member - Method - Parameters 02.fs @@ -0,0 +1,4 @@ +module Module + +type T = + static member M(a: int, b: int) = () diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Member - Method - Parameters 02.fs.gold b/ReSharper.FSharp/test/data/parsing/Type member - Member - Method - Parameters 02.fs.gold new file mode 100644 index 0000000000..6382c5929e --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/Type member - Member - Method - Parameters 02.fs.gold @@ -0,0 +1,57 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + INamedModuleDeclaration + FSharpTokenType+ModuleTokenElement(type:MODULE, text:module) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpIdentifierToken(type:IDENTIFIER, text:Module) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + ITypeDeclarationGroup + FSharpTokenType+TypeTokenElement(type:TYPE, text:type) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IObjectTypeDeclaration + FSharpIdentifierToken(type:IDENTIFIER, text:T) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IMemberDeclaration + FSharpTokenType+StaticTokenElement(type:STATIC, text:static) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+MemberTokenElement(type:MEMBER, text:member) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpIdentifierToken(type:IDENTIFIER, text:M) + IMemberParamsDeclaration + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + ITuplePat + ITypedPat + ILocalReferencePat + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:a) + FSharpTokenType+ColonTokenElement(type:COLON, text::) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + INamedTypeUsage + ITypeReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:int) + FSharpTokenType+CommaTokenElement(type:COMMA, text:,) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ITypedPat + ILocalReferencePat + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:b) + FSharpTokenType+ColonTokenElement(type:COLON, text::) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + INamedTypeUsage + ITypeReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:int) + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IChameleonExpression + IUnitExpr + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Member - Method 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Type member - Member - Method 01.fs.gold index d820e64a3c..9867ff395a 100644 --- a/ReSharper.FSharp/test/data/parsing/Type member - Member - Method 01.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Type member - Member - Method 01.fs.gold @@ -22,7 +22,7 @@ IFSharpImplFile FSharpIdentifierToken(type:IDENTIFIER, text:x) FSharpTokenType+DotTokenElement(type:DOT, text:.) FSharpIdentifierToken(type:IDENTIFIER, text:M) - IMemberParamDeclaration + IMemberParamsDeclaration IParenPat FSharpTokenType+LparenTokenElement(type:LPAREN, text:() IWildPat diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Member - Method 02 - Static.fs.gold b/ReSharper.FSharp/test/data/parsing/Type member - Member - Method 02 - Static.fs.gold index 2945c1c81c..63ef39c130 100644 --- a/ReSharper.FSharp/test/data/parsing/Type member - Member - Method 02 - Static.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Type member - Member - Method 02 - Static.fs.gold @@ -21,7 +21,7 @@ IFSharpImplFile FSharpTokenType+MemberTokenElement(type:MEMBER, text:member) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpIdentifierToken(type:IDENTIFIER, text:M) - IMemberParamDeclaration + IMemberParamsDeclaration IParenPat FSharpTokenType+LparenTokenElement(type:LPAREN, text:() IWildPat diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Member - Operator 01 - Add.fs.gold b/ReSharper.FSharp/test/data/parsing/Type member - Member - Operator 01 - Add.fs.gold index b33e0ab121..777c011a6f 100644 --- a/ReSharper.FSharp/test/data/parsing/Type member - Member - Operator 01 - Add.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Type member - Member - Operator 01 - Add.fs.gold @@ -24,7 +24,7 @@ IFSharpImplFile FSharpIdentifierToken(type:PLUS, text:+) FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IMemberParamDeclaration + IMemberParamsDeclaration IParenPat FSharpTokenType+LparenTokenElement(type:LPAREN, text:() ITuplePat diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Member - Operator 02 - Multiply.fs.gold b/ReSharper.FSharp/test/data/parsing/Type member - Member - Operator 02 - Multiply.fs.gold index 37dafebcb9..8fd98e2958 100644 --- a/ReSharper.FSharp/test/data/parsing/Type member - Member - Operator 02 - Multiply.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Type member - Member - Operator 02 - Multiply.fs.gold @@ -22,7 +22,7 @@ IFSharpImplFile Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpIdentifierToken(type:LPAREN_STAR_RPAREN, text:(*)) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IMemberParamDeclaration + IMemberParamsDeclaration IParenPat FSharpTokenType+LparenTokenElement(type:LPAREN, text:() ITuplePat diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Member - Operator 03 - Subtract.fs.gold b/ReSharper.FSharp/test/data/parsing/Type member - Member - Operator 03 - Subtract.fs.gold index c41cbdba8f..3d4c353c13 100644 --- a/ReSharper.FSharp/test/data/parsing/Type member - Member - Operator 03 - Subtract.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Type member - Member - Operator 03 - Subtract.fs.gold @@ -24,7 +24,7 @@ IFSharpImplFile FSharpIdentifierToken(type:MINUS, text:-) FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IMemberParamDeclaration + IMemberParamsDeclaration IParenPat FSharpTokenType+LparenTokenElement(type:LPAREN, text:() ITuplePat diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Member - Operator 04 - Divide.fs.gold b/ReSharper.FSharp/test/data/parsing/Type member - Member - Operator 04 - Divide.fs.gold index 7b2a7470f0..e04f47e089 100644 --- a/ReSharper.FSharp/test/data/parsing/Type member - Member - Operator 04 - Divide.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Type member - Member - Operator 04 - Divide.fs.gold @@ -24,7 +24,7 @@ IFSharpImplFile FSharpIdentifierToken(type:SYMBOLIC_OP, text:/) FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IMemberParamDeclaration + IMemberParamsDeclaration IParenPat FSharpTokenType+LparenTokenElement(type:LPAREN, text:() ITuplePat diff --git a/ReSharper.FSharp/test/data/parsing/Type member - Member 01 - Wild self id.fs.gold b/ReSharper.FSharp/test/data/parsing/Type member - Member 01 - Wild self id.fs.gold index 49d761f420..73fffd9053 100644 --- a/ReSharper.FSharp/test/data/parsing/Type member - Member 01 - Wild self id.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Type member - Member 01 - Wild self id.fs.gold @@ -7,9 +7,10 @@ IFSharpImplFile IObjectTypeDeclaration FSharpIdentifierToken(type:IDENTIFIER, text:T) IImplicitConstructorDeclaration - IMemberParamDeclarationGroup - FSharpTokenType+LparenTokenElement(type:LPAREN, text:() - FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + IMemberParamsDeclaration + IParenPat + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) NewLine(type:NEW_LINE, text:\n) spaces:"\n" @@ -23,7 +24,7 @@ IFSharpImplFile FSharpTokenType+UnderscoreTokenElement(type:UNDERSCORE, text:_) FSharpTokenType+DotTokenElement(type:DOT, text:.) FSharpIdentifierToken(type:IDENTIFIER, text:Foo) - IMemberParamDeclaration + IMemberParamsDeclaration IParenPat FSharpTokenType+LparenTokenElement(type:LPAREN, text:() IWildPat diff --git a/ReSharper.FSharp/test/data/parsing/Type parameters - Constraints 02 - Member.fs.gold b/ReSharper.FSharp/test/data/parsing/Type parameters - Constraints 02 - Member.fs.gold index d4352f34b0..312710146e 100644 --- a/ReSharper.FSharp/test/data/parsing/Type parameters - Constraints 02 - Member.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Type parameters - Constraints 02 - Member.fs.gold @@ -15,7 +15,7 @@ IFSharpImplFile Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+WhenTokenElement(type:WHEN, text:when) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName ITypeParameterId FSharpIdentifierToken(type:SYMBOLIC_OP, text:^) @@ -28,7 +28,7 @@ IFSharpImplFile FSharpIdentifierToken(type:IDENTIFIER, text:P) FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) diff --git a/ReSharper.FSharp/test/data/parsing/Type parameters - Constraints 03 - Or.fs.gold b/ReSharper.FSharp/test/data/parsing/Type parameters - Constraints 03 - Or.fs.gold index 7368fa8aba..ca0a5b7b9b 100644 --- a/ReSharper.FSharp/test/data/parsing/Type parameters - Constraints 03 - Or.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Type parameters - Constraints 03 - Or.fs.gold @@ -21,7 +21,7 @@ IFSharpImplFile FSharpTokenType+WhenTokenElement(type:WHEN, text:when) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+LparenTokenElement(type:LPAREN, text:() - INamedType + INamedTypeUsage ITypeReferenceName ITypeParameterId FSharpIdentifierToken(type:SYMBOLIC_OP, text:^) @@ -29,7 +29,7 @@ IFSharpImplFile Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+OrTokenElement(type:OR, text:or) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName ITypeParameterId FSharpIdentifierToken(type:SYMBOLIC_OP, text:^) @@ -45,7 +45,7 @@ IFSharpImplFile FSharpIdentifierToken(type:IDENTIFIER, text:P) FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) diff --git a/ReSharper.FSharp/test/data/parsing/Type parameters - Constraints 04 - Or and member.fs.gold b/ReSharper.FSharp/test/data/parsing/Type parameters - Constraints 04 - Or and member.fs.gold index 8fe93d9211..29299348d5 100644 --- a/ReSharper.FSharp/test/data/parsing/Type parameters - Constraints 04 - Or and member.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Type parameters - Constraints 04 - Or and member.fs.gold @@ -21,7 +21,7 @@ IFSharpImplFile FSharpTokenType+WhenTokenElement(type:WHEN, text:when) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+LparenTokenElement(type:LPAREN, text:() - INamedType + INamedTypeUsage ITypeReferenceName ITypeParameterId FSharpIdentifierToken(type:SYMBOLIC_OP, text:^) @@ -29,7 +29,7 @@ IFSharpImplFile Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+OrTokenElement(type:OR, text:or) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName ITypeParameterId FSharpIdentifierToken(type:SYMBOLIC_OP, text:^) @@ -47,9 +47,9 @@ IFSharpImplFile FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IFunType - ITupleType - INamedType + IFunctionTypeUsage + ITupleTypeUsage + INamedTypeUsage ITypeReferenceName ITypeParameterId FSharpIdentifierToken(type:SYMBOLIC_OP, text:^) @@ -57,7 +57,7 @@ IFSharpImplFile Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+StarTokenElement(type:STAR, text:*) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName ITypeParameterId FSharpIdentifierToken(type:SYMBOLIC_OP, text:^) @@ -65,7 +65,7 @@ IFSharpImplFile Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+RarrowTokenElement(type:RARROW, text:->) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName ITypeParameterId FSharpIdentifierToken(type:SYMBOLIC_OP, text:^) diff --git a/ReSharper.FSharp/test/data/parsing/Types - Anon Record 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Types - Anon Record 01.fs.gold index ac68adf8c1..7e1fbefdf5 100644 --- a/ReSharper.FSharp/test/data/parsing/Types - Anon Record 01.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Types - Anon Record 01.fs.gold @@ -10,7 +10,7 @@ IFSharpImplFile IReturnTypeInfo FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IAnonRecordType + IAnonRecordTypeUsage FSharpTokenType+LbraceBarTokenElement(type:LBRACE_BAR, text:{|) Whitespace(type:WHITE_SPACE, text: ) spaces:" " IAnonRecordField @@ -18,7 +18,7 @@ IFSharpImplFile FSharpIdentifierToken(type:IDENTIFIER, text:A) FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) FSharpTokenType+SemicolonTokenElement(type:SEMICOLON, text:;) @@ -28,7 +28,7 @@ IFSharpImplFile FSharpIdentifierToken(type:IDENTIFIER, text:B) FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) Whitespace(type:WHITE_SPACE, text: ) spaces:" " diff --git a/ReSharper.FSharp/test/data/parsing/Types - Array 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Types - Array 01.fs.gold index 6d6158627b..0096a24df8 100644 --- a/ReSharper.FSharp/test/data/parsing/Types - Array 01.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Types - Array 01.fs.gold @@ -10,8 +10,8 @@ IFSharpImplFile IReturnTypeInfo FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IArrayType - INamedType + IArrayTypeUsage + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) FSharpTokenType+LbrackTokenElement(type:LBRACK, text:[) diff --git a/ReSharper.FSharp/test/data/parsing/Types - Constraints - Comparison 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Types - Constraints - Comparison 01.fs.gold index 9caaa0686b..0637e311a0 100644 --- a/ReSharper.FSharp/test/data/parsing/Types - Constraints - Comparison 01.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Types - Constraints - Comparison 01.fs.gold @@ -10,8 +10,8 @@ IFSharpImplFile IReturnTypeInfo FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IOtherType - INamedType + IUnsupportedTypeUsage + INamedTypeUsage ITypeReferenceName ITypeParameterId FSharpTokenType+QuoteTokenElement(type:QUOTE, text:') diff --git a/ReSharper.FSharp/test/data/parsing/Types - Constraints - Equality 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Types - Constraints - Equality 01.fs.gold index dd48caf624..7a04b1da57 100644 --- a/ReSharper.FSharp/test/data/parsing/Types - Constraints - Equality 01.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Types - Constraints - Equality 01.fs.gold @@ -10,8 +10,8 @@ IFSharpImplFile IReturnTypeInfo FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IOtherType - INamedType + IUnsupportedTypeUsage + INamedTypeUsage ITypeReferenceName ITypeParameterId FSharpTokenType+QuoteTokenElement(type:QUOTE, text:') diff --git a/ReSharper.FSharp/test/data/parsing/Types - Constraints - Null 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Types - Constraints - Null 01.fs.gold index 47a66ddb33..77f0e8f944 100644 --- a/ReSharper.FSharp/test/data/parsing/Types - Constraints - Null 01.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Types - Constraints - Null 01.fs.gold @@ -10,8 +10,8 @@ IFSharpImplFile IReturnTypeInfo FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IOtherType - INamedType + IUnsupportedTypeUsage + INamedTypeUsage ITypeReferenceName ITypeParameterId FSharpTokenType+QuoteTokenElement(type:QUOTE, text:') diff --git a/ReSharper.FSharp/test/data/parsing/Types - Constraints - Reference 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Types - Constraints - Reference 01.fs.gold index d2aea8dd79..e3ce121287 100644 --- a/ReSharper.FSharp/test/data/parsing/Types - Constraints - Reference 01.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Types - Constraints - Reference 01.fs.gold @@ -10,8 +10,8 @@ IFSharpImplFile IReturnTypeInfo FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IOtherType - INamedType + IUnsupportedTypeUsage + INamedTypeUsage ITypeReferenceName ITypeParameterId FSharpTokenType+QuoteTokenElement(type:QUOTE, text:') diff --git a/ReSharper.FSharp/test/data/parsing/Types - Constraints - Struct 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Types - Constraints - Struct 01.fs.gold index 459b343185..4cd6bd3b9e 100644 --- a/ReSharper.FSharp/test/data/parsing/Types - Constraints - Struct 01.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Types - Constraints - Struct 01.fs.gold @@ -10,8 +10,8 @@ IFSharpImplFile IReturnTypeInfo FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IOtherType - INamedType + IUnsupportedTypeUsage + INamedTypeUsage ITypeReferenceName ITypeParameterId FSharpTokenType+QuoteTokenElement(type:QUOTE, text:') diff --git a/ReSharper.FSharp/test/data/parsing/Types - Constraints - Type 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Types - Constraints - Type 01.fs.gold index 495f41fae7..a1f4b3acc0 100644 --- a/ReSharper.FSharp/test/data/parsing/Types - Constraints - Type 01.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Types - Constraints - Type 01.fs.gold @@ -10,8 +10,8 @@ IFSharpImplFile IReturnTypeInfo FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IOtherType - INamedType + IUnsupportedTypeUsage + INamedTypeUsage ITypeReferenceName ITypeParameterId FSharpTokenType+QuoteTokenElement(type:QUOTE, text:') @@ -26,7 +26,7 @@ IFSharpImplFile Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+ColonGreaterTokenElement(type:COLON_GREATER, text::>) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:obj) Whitespace(type:WHITE_SPACE, text: ) spaces:" " diff --git a/ReSharper.FSharp/test/data/parsing/Types - Fun 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Types - Fun 01.fs.gold index b634df56a9..1f80867512 100644 --- a/ReSharper.FSharp/test/data/parsing/Types - Fun 01.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Types - Fun 01.fs.gold @@ -10,14 +10,14 @@ IFSharpImplFile IReturnTypeInfo FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IFunType - INamedType + IFunctionTypeUsage + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+RarrowTokenElement(type:RARROW, text:->) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) Whitespace(type:WHITE_SPACE, text: ) spaces:" " diff --git a/ReSharper.FSharp/test/data/parsing/Types - Fun 02.fs.gold b/ReSharper.FSharp/test/data/parsing/Types - Fun 02.fs.gold index 63cf54f901..863407bed5 100644 --- a/ReSharper.FSharp/test/data/parsing/Types - Fun 02.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Types - Fun 02.fs.gold @@ -10,21 +10,21 @@ IFSharpImplFile IReturnTypeInfo FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IFunType - INamedType + IFunctionTypeUsage + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+RarrowTokenElement(type:RARROW, text:->) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IFunType - INamedType + IFunctionTypeUsage + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+RarrowTokenElement(type:RARROW, text:->) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) Whitespace(type:WHITE_SPACE, text: ) spaces:" " diff --git a/ReSharper.FSharp/test/data/parsing/Types - Measure 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Types - Measure 01.fs.gold index d99e1d9c8d..7f69d0bc83 100644 --- a/ReSharper.FSharp/test/data/parsing/Types - Measure 01.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Types - Measure 01.fs.gold @@ -10,17 +10,17 @@ IFSharpImplFile FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) Whitespace(type:WHITE_SPACE, text: ) spaces:" " IAbbreviatedTypeOrUnionCaseDeclaration - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:float) IPrefixAppTypeArgumentList FSharpTokenType+LessTokenElement(type:LESS, text:<) - ITupleType - INamedType + ITupleTypeUsage + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:g) FSharpIdentifierToken(type:SYMBOLIC_OP, text:/) - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:kg) FSharpTokenType+GreaterTokenElement(type:GREATER, text:>) diff --git a/ReSharper.FSharp/test/data/parsing/Types - Measure 02 - Negate.fs.gold b/ReSharper.FSharp/test/data/parsing/Types - Measure 02 - Negate.fs.gold index 44ad3939d3..d1782dc31c 100644 --- a/ReSharper.FSharp/test/data/parsing/Types - Measure 02 - Negate.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Types - Measure 02 - Negate.fs.gold @@ -10,15 +10,15 @@ IFSharpImplFile FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) Whitespace(type:WHITE_SPACE, text: ) spaces:" " IAbbreviatedTypeOrUnionCaseDeclaration - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:float) IPrefixAppTypeArgumentList FSharpTokenType+LessTokenElement(type:LESS, text:<) - INamedType + INamedTypeUsage ITypeReferenceName IPostfixAppTypeArgumentList - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:g) Whitespace(type:WHITE_SPACE, text: ) spaces:" " diff --git a/ReSharper.FSharp/test/data/parsing/Types - Simple 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Types - Simple 01.fs.gold index 1f2fb9d4b5..b908b3fc77 100644 --- a/ReSharper.FSharp/test/data/parsing/Types - Simple 01.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Types - Simple 01.fs.gold @@ -10,7 +10,7 @@ IFSharpImplFile IReturnTypeInfo FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) Whitespace(type:WHITE_SPACE, text: ) spaces:" " diff --git a/ReSharper.FSharp/test/data/parsing/Types - Simple 02 - Long ident.fs.gold b/ReSharper.FSharp/test/data/parsing/Types - Simple 02 - Long ident.fs.gold index 5972ee18bc..e25c5a37bc 100644 --- a/ReSharper.FSharp/test/data/parsing/Types - Simple 02 - Long ident.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Types - Simple 02 - Long ident.fs.gold @@ -10,7 +10,7 @@ IFSharpImplFile IReturnTypeInfo FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:System) diff --git a/ReSharper.FSharp/test/data/parsing/Types - Simple 03 - Type app.fs.gold b/ReSharper.FSharp/test/data/parsing/Types - Simple 03 - Type app.fs.gold index e460751a6e..708c96b3f5 100644 --- a/ReSharper.FSharp/test/data/parsing/Types - Simple 03 - Type app.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Types - Simple 03 - Type app.fs.gold @@ -10,7 +10,7 @@ IFSharpImplFile FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) Whitespace(type:WHITE_SPACE, text: ) spaces:" " IAbbreviatedTypeOrUnionCaseDeclaration - INamedType + INamedTypeUsage ITypeReferenceName ITypeReferenceName ITypeReferenceName @@ -24,7 +24,7 @@ IFSharpImplFile FSharpIdentifierToken(type:IDENTIFIER, text:List) IPrefixAppTypeArgumentList FSharpTokenType+LessTokenElement(type:LESS, text:<) - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) FSharpTokenType+GreaterTokenElement(type:GREATER, text:>) diff --git a/ReSharper.FSharp/test/data/parsing/Types - Simple 04 - Parens.fs.gold b/ReSharper.FSharp/test/data/parsing/Types - Simple 04 - Parens.fs.gold index 366b7760b9..ef771eb67d 100644 --- a/ReSharper.FSharp/test/data/parsing/Types - Simple 04 - Parens.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Types - Simple 04 - Parens.fs.gold @@ -10,11 +10,12 @@ IFSharpImplFile IReturnTypeInfo FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - FSharpTokenType+LparenTokenElement(type:LPAREN, text:() - INamedType - ITypeReferenceName - FSharpIdentifierToken(type:IDENTIFIER, text:int) - FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + IParenTypeUsage + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + INamedTypeUsage + ITypeReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:int) + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) Whitespace(type:WHITE_SPACE, text: ) spaces:" " diff --git a/ReSharper.FSharp/test/data/parsing/Types - Simple 05 - Nested parens.fs.gold b/ReSharper.FSharp/test/data/parsing/Types - Simple 05 - Nested parens.fs.gold index 57424108a5..3bf8b1d96b 100644 --- a/ReSharper.FSharp/test/data/parsing/Types - Simple 05 - Nested parens.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Types - Simple 05 - Nested parens.fs.gold @@ -10,13 +10,15 @@ IFSharpImplFile IReturnTypeInfo FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - FSharpTokenType+LparenTokenElement(type:LPAREN, text:() - FSharpTokenType+LparenTokenElement(type:LPAREN, text:() - INamedType - ITypeReferenceName - FSharpIdentifierToken(type:IDENTIFIER, text:int) - FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) - FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + IParenTypeUsage + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + IParenTypeUsage + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + INamedTypeUsage + ITypeReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:int) + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) Whitespace(type:WHITE_SPACE, text: ) spaces:" " diff --git a/ReSharper.FSharp/test/data/parsing/Types - Tuple 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Types - Tuple 01.fs.gold index 040e3f5a21..3b880afb83 100644 --- a/ReSharper.FSharp/test/data/parsing/Types - Tuple 01.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Types - Tuple 01.fs.gold @@ -10,14 +10,14 @@ IFSharpImplFile IReturnTypeInfo FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - ITupleType - INamedType + ITupleTypeUsage + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+StarTokenElement(type:STAR, text:*) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) Whitespace(type:WHITE_SPACE, text: ) spaces:" " diff --git a/ReSharper.FSharp/test/data/parsing/Types - Tuple 02 - Nested.fs.gold b/ReSharper.FSharp/test/data/parsing/Types - Tuple 02 - Nested.fs.gold index bf1c3ba0b3..7e080a545a 100644 --- a/ReSharper.FSharp/test/data/parsing/Types - Tuple 02 - Nested.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Types - Tuple 02 - Nested.fs.gold @@ -10,25 +10,26 @@ IFSharpImplFile IReturnTypeInfo FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - ITupleType - INamedType + ITupleTypeUsage + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+StarTokenElement(type:STAR, text:*) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - FSharpTokenType+LparenTokenElement(type:LPAREN, text:() - ITupleType - INamedType - ITypeReferenceName - FSharpIdentifierToken(type:IDENTIFIER, text:int) - Whitespace(type:WHITE_SPACE, text: ) spaces:" " - FSharpTokenType+StarTokenElement(type:STAR, text:*) - Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType - ITypeReferenceName - FSharpIdentifierToken(type:IDENTIFIER, text:int) - FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + IParenTypeUsage + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + ITupleTypeUsage + INamedTypeUsage + ITypeReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:int) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+StarTokenElement(type:STAR, text:*) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + INamedTypeUsage + ITypeReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:int) + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) Whitespace(type:WHITE_SPACE, text: ) spaces:" " diff --git a/ReSharper.FSharp/test/data/parsing/Types - Tuple 03 - Nested 2.fs.gold b/ReSharper.FSharp/test/data/parsing/Types - Tuple 03 - Nested 2.fs.gold index b43bc85db7..8d5743c1ad 100644 --- a/ReSharper.FSharp/test/data/parsing/Types - Tuple 03 - Nested 2.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Types - Tuple 03 - Nested 2.fs.gold @@ -10,23 +10,24 @@ IFSharpImplFile IReturnTypeInfo FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - ITupleType - FSharpTokenType+LparenTokenElement(type:LPAREN, text:() - ITupleType - INamedType - ITypeReferenceName - FSharpIdentifierToken(type:IDENTIFIER, text:int) - Whitespace(type:WHITE_SPACE, text: ) spaces:" " - FSharpTokenType+StarTokenElement(type:STAR, text:*) - Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType - ITypeReferenceName - FSharpIdentifierToken(type:IDENTIFIER, text:int) - FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + ITupleTypeUsage + IParenTypeUsage + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + ITupleTypeUsage + INamedTypeUsage + ITypeReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:int) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+StarTokenElement(type:STAR, text:*) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + INamedTypeUsage + ITypeReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:int) + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+StarTokenElement(type:STAR, text:*) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) Whitespace(type:WHITE_SPACE, text: ) spaces:" " diff --git a/ReSharper.FSharp/test/data/parsing/Types - Tuple 04 - Struct.fs.gold b/ReSharper.FSharp/test/data/parsing/Types - Tuple 04 - Struct.fs.gold index 98f18c0cfd..fd4627486f 100644 --- a/ReSharper.FSharp/test/data/parsing/Types - Tuple 04 - Struct.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Types - Tuple 04 - Struct.fs.gold @@ -10,17 +10,17 @@ IFSharpImplFile IReturnTypeInfo FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - ITupleType + ITupleTypeUsage FSharpTokenType+StructTokenElement(type:STRUCT, text:struct) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+LparenTokenElement(type:LPAREN, text:() - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+StarTokenElement(type:STAR, text:*) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) diff --git a/ReSharper.FSharp/test/data/parsing/Types - Tuple 05 - More items.fs.gold b/ReSharper.FSharp/test/data/parsing/Types - Tuple 05 - More items.fs.gold index 3f634cc35f..cc2f70dccc 100644 --- a/ReSharper.FSharp/test/data/parsing/Types - Tuple 05 - More items.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Types - Tuple 05 - More items.fs.gold @@ -10,26 +10,26 @@ IFSharpImplFile IReturnTypeInfo FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - ITupleType - INamedType + ITupleTypeUsage + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+StarTokenElement(type:STAR, text:*) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+StarTokenElement(type:STAR, text:*) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+StarTokenElement(type:STAR, text:*) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) Whitespace(type:WHITE_SPACE, text: ) spaces:" " diff --git a/ReSharper.FSharp/test/data/parsing/Types - Tuple 06 - Parens.fs.gold b/ReSharper.FSharp/test/data/parsing/Types - Tuple 06 - Parens.fs.gold index 5fdac05556..658a9eb37f 100644 --- a/ReSharper.FSharp/test/data/parsing/Types - Tuple 06 - Parens.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Types - Tuple 06 - Parens.fs.gold @@ -10,18 +10,19 @@ IFSharpImplFile IReturnTypeInfo FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - FSharpTokenType+LparenTokenElement(type:LPAREN, text:() - ITupleType - INamedType - ITypeReferenceName - FSharpIdentifierToken(type:IDENTIFIER, text:int) - Whitespace(type:WHITE_SPACE, text: ) spaces:" " - FSharpTokenType+StarTokenElement(type:STAR, text:*) - Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType - ITypeReferenceName - FSharpIdentifierToken(type:IDENTIFIER, text:int) - FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + IParenTypeUsage + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + ITupleTypeUsage + INamedTypeUsage + ITypeReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:int) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+StarTokenElement(type:STAR, text:*) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + INamedTypeUsage + ITypeReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:int) + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) Whitespace(type:WHITE_SPACE, text: ) spaces:" " diff --git a/ReSharper.FSharp/test/data/parsing/Types - Type app 01.fs.gold b/ReSharper.FSharp/test/data/parsing/Types - Type app 01.fs.gold index 7128b82035..96701dbcf4 100644 --- a/ReSharper.FSharp/test/data/parsing/Types - Type app 01.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Types - Type app 01.fs.gold @@ -10,12 +10,12 @@ IFSharpImplFile IReturnTypeInfo FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:list) IPrefixAppTypeArgumentList FSharpTokenType+LessTokenElement(type:LESS, text:<) - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) FSharpTokenType+GreaterTokenElement(type:GREATER, text:>) diff --git a/ReSharper.FSharp/test/data/parsing/Types - Type app 02 - ML-style.fs.gold b/ReSharper.FSharp/test/data/parsing/Types - Type app 02 - ML-style.fs.gold index af68ff902f..09fcaf1a87 100644 --- a/ReSharper.FSharp/test/data/parsing/Types - Type app 02 - ML-style.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Types - Type app 02 - ML-style.fs.gold @@ -10,10 +10,10 @@ IFSharpImplFile IReturnTypeInfo FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName IPostfixAppTypeArgumentList - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) Whitespace(type:WHITE_SPACE, text: ) spaces:" " diff --git a/ReSharper.FSharp/test/data/parsing/Types - Type app 03 - tuple.fs.gold b/ReSharper.FSharp/test/data/parsing/Types - Type app 03 - tuple.fs.gold index 5962e3b321..97ca54e1cb 100644 --- a/ReSharper.FSharp/test/data/parsing/Types - Type app 03 - tuple.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Types - Type app 03 - tuple.fs.gold @@ -10,21 +10,22 @@ IFSharpImplFile IReturnTypeInfo FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName - FSharpTokenType+LparenTokenElement(type:LPAREN, text:() IPostfixAppTypeArgumentList - ITupleType - INamedType - ITypeReferenceName - FSharpIdentifierToken(type:IDENTIFIER, text:int) - Whitespace(type:WHITE_SPACE, text: ) spaces:" " - FSharpTokenType+StarTokenElement(type:STAR, text:*) - Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType - ITypeReferenceName - FSharpIdentifierToken(type:IDENTIFIER, text:int) - FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + IParenTypeUsage + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + ITupleTypeUsage + INamedTypeUsage + ITypeReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:int) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+StarTokenElement(type:STAR, text:*) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + INamedTypeUsage + ITypeReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:int) + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpIdentifierToken(type:IDENTIFIER, text:list) Whitespace(type:WHITE_SPACE, text: ) spaces:" " diff --git a/ReSharper.FSharp/test/data/parsing/Types - Type app 04 - ML-style tuple.fs.gold b/ReSharper.FSharp/test/data/parsing/Types - Type app 04 - ML-style tuple.fs.gold index 9ddb4fa10d..cb9c6f40b9 100644 --- a/ReSharper.FSharp/test/data/parsing/Types - Type app 04 - ML-style tuple.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Types - Type app 04 - ML-style tuple.fs.gold @@ -10,16 +10,16 @@ IFSharpImplFile IReturnTypeInfo FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpTokenType+LparenTokenElement(type:LPAREN, text:() IPostfixAppTypeArgumentList - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) FSharpTokenType+CommaTokenElement(type:COMMA, text:,) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) diff --git a/ReSharper.FSharp/test/data/parsing/Types - Type app 05 - Qualifier and generics.fs.gold b/ReSharper.FSharp/test/data/parsing/Types - Type app 05 - Qualifier and generics.fs.gold index 92650eb8f3..2edd84cde0 100644 --- a/ReSharper.FSharp/test/data/parsing/Types - Type app 05 - Qualifier and generics.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Types - Type app 05 - Qualifier and generics.fs.gold @@ -16,7 +16,7 @@ IFSharpImplFile FSharpIdentifierToken(type:IDENTIFIER, text:A) IPrefixAppTypeArgumentList FSharpTokenType+LessTokenElement(type:LESS, text:<) - IAnonType + IAnonTypeUsage FSharpIdentifierToken(type:IDENTIFIER, text:_) FSharpTokenType+GreaterTokenElement(type:GREATER, text:>) FSharpTokenType+DotTokenElement(type:DOT, text:.) diff --git a/ReSharper.FSharp/test/data/parsing/Types - Type app 06 - Multiple qualifiers and generics.fs.gold b/ReSharper.FSharp/test/data/parsing/Types - Type app 06 - Multiple qualifiers and generics.fs.gold index f7e1f71398..b91a2a2c67 100644 --- a/ReSharper.FSharp/test/data/parsing/Types - Type app 06 - Multiple qualifiers and generics.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/Types - Type app 06 - Multiple qualifiers and generics.fs.gold @@ -17,18 +17,18 @@ IFSharpImplFile FSharpIdentifierToken(type:IDENTIFIER, text:A) IPrefixAppTypeArgumentList FSharpTokenType+LessTokenElement(type:LESS, text:<) - IAnonType + IAnonTypeUsage FSharpIdentifierToken(type:IDENTIFIER, text:_) FSharpTokenType+GreaterTokenElement(type:GREATER, text:>) FSharpTokenType+DotTokenElement(type:DOT, text:.) FSharpIdentifierToken(type:IDENTIFIER, text:B) IPrefixAppTypeArgumentList FSharpTokenType+LessTokenElement(type:LESS, text:<) - IAnonType + IAnonTypeUsage FSharpIdentifierToken(type:IDENTIFIER, text:_) FSharpTokenType+CommaTokenElement(type:COMMA, text:,) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IAnonType + IAnonTypeUsage FSharpIdentifierToken(type:IDENTIFIER, text:_) FSharpTokenType+GreaterTokenElement(type:GREATER, text:>) FSharpTokenType+DotTokenElement(type:DOT, text:.) diff --git a/ReSharper.FSharp/test/data/parsing/errors/Expr - CompExpr - Range 01.fs.gold b/ReSharper.FSharp/test/data/parsing/errors/Expr - CompExpr - Range 01.fs.gold index 7749e4397f..210d675115 100644 --- a/ReSharper.FSharp/test/data/parsing/errors/Expr - CompExpr - Range 01.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/errors/Expr - CompExpr - Range 01.fs.gold @@ -7,10 +7,10 @@ IFSharpImplFile IReferenceExpr FSharpIdentifierToken(type:IDENTIFIER, text:seq) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IRangeSequenceExpr + IComputationExpr FSharpTokenType+LbraceTokenElement(type:LBRACE, text:{) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IRangeSequence + IRangeSequenceExpr ILiteralExpr FSharpToken(type:INT32, text:1) Whitespace(type:WHITE_SPACE, text: ) spaces:" " diff --git a/ReSharper.FSharp/test/data/parsing/errors/Expr - CompExpr - Range 02 - Step.fs.gold b/ReSharper.FSharp/test/data/parsing/errors/Expr - CompExpr - Range 02 - Step.fs.gold index efd9a3d066..05607da8ae 100644 --- a/ReSharper.FSharp/test/data/parsing/errors/Expr - CompExpr - Range 02 - Step.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/errors/Expr - CompExpr - Range 02 - Step.fs.gold @@ -7,10 +7,10 @@ IFSharpImplFile IReferenceExpr FSharpIdentifierToken(type:IDENTIFIER, text:seq) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IRangeSequenceExpr + IComputationExpr FSharpTokenType+LbraceTokenElement(type:LBRACE, text:{) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IRangeSequence + IRangeSequenceExpr ILiteralExpr FSharpToken(type:INT32, text:1) Whitespace(type:WHITE_SPACE, text: ) spaces:" " diff --git a/ReSharper.FSharp/test/data/parsing/errors/Expr - CompExpr - Range 03.fs.gold b/ReSharper.FSharp/test/data/parsing/errors/Expr - CompExpr - Range 03.fs.gold index 180ccb2734..ecd17be423 100644 --- a/ReSharper.FSharp/test/data/parsing/errors/Expr - CompExpr - Range 03.fs.gold +++ b/ReSharper.FSharp/test/data/parsing/errors/Expr - CompExpr - Range 03.fs.gold @@ -7,10 +7,10 @@ IFSharpImplFile IReferenceExpr FSharpIdentifierToken(type:IDENTIFIER, text:seq) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IRangeSequenceExpr + IComputationExpr FSharpTokenType+LbraceTokenElement(type:LBRACE, text:{) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IRangeSequence + IRangeSequenceExpr ILiteralExpr FSharpToken(type:INT32, text:1) Whitespace(type:WHITE_SPACE, text: ) spaces:" " diff --git a/ReSharper.FSharp/test/data/parsing/errors/Expr - For 01 - Rarrow.fs b/ReSharper.FSharp/test/data/parsing/errors/Expr - For 01 - Rarrow.fs new file mode 100644 index 0000000000..fa0faee020 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/errors/Expr - For 01 - Rarrow.fs @@ -0,0 +1 @@ +for a in 1 .. 10 -> a diff --git a/ReSharper.FSharp/test/data/parsing/errors/Expr - For 01 - Rarrow.fs.gold b/ReSharper.FSharp/test/data/parsing/errors/Expr - For 01 - Rarrow.fs.gold new file mode 100644 index 0000000000..d06bd56e33 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/errors/Expr - For 01 - Rarrow.fs.gold @@ -0,0 +1,29 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + IAnonModuleDeclaration + IDo + IChameleonExpression + IForEachExpr + FSharpTokenType+ForTokenElement(type:FOR, text:for) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ILocalReferencePat + IExpressionReferenceName + FSharpIdentifierToken(type:IDENTIFIER, text:a) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+InTokenElement(type:IN, text:in) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IRangeSequenceExpr + ILiteralExpr + FSharpToken(type:INT32, text:1) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+DotDotTokenElement(type:DOT_DOT, text:..) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ILiteralExpr + FSharpToken(type:INT32, text:10) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+RarrowTokenElement(type:RARROW, text:->) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IReferenceExpr + FSharpIdentifierToken(type:IDENTIFIER, text:a) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/errors/Expr - If 01.fs b/ReSharper.FSharp/test/data/parsing/errors/Expr - If 01.fs new file mode 100644 index 0000000000..d6836d0465 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/errors/Expr - If 01.fs @@ -0,0 +1 @@ +if x diff --git a/ReSharper.FSharp/test/data/parsing/errors/Expr - If 01.fs.gold b/ReSharper.FSharp/test/data/parsing/errors/Expr - If 01.fs.gold new file mode 100644 index 0000000000..888d2e51dd --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/errors/Expr - If 01.fs.gold @@ -0,0 +1,12 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + IAnonModuleDeclaration + FSharpTokenType+IfTokenElement(type:IF, text:if) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IDo + IChameleonExpression + IFromErrorExpr + IReferenceExpr + FSharpIdentifierToken(type:IDENTIFIER, text:x) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/errors/Expr - If 02.fs b/ReSharper.FSharp/test/data/parsing/errors/Expr - If 02.fs new file mode 100644 index 0000000000..5f95327dfb --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/errors/Expr - If 02.fs @@ -0,0 +1 @@ +if x then diff --git a/ReSharper.FSharp/test/data/parsing/errors/Expr - If 02.fs.gold b/ReSharper.FSharp/test/data/parsing/errors/Expr - If 02.fs.gold new file mode 100644 index 0000000000..0f109e35a5 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/errors/Expr - If 02.fs.gold @@ -0,0 +1,14 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + IAnonModuleDeclaration + FSharpTokenType+IfTokenElement(type:IF, text:if) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IDo + IChameleonExpression + IFromErrorExpr + IReferenceExpr + FSharpIdentifierToken(type:IDENTIFIER, text:x) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+ThenTokenElement(type:THEN, text:then) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/errors/Expr - List - Comprehension 01 - ForExpr.fs b/ReSharper.FSharp/test/data/parsing/errors/Expr - List - Comprehension 01 - ForExpr.fs new file mode 100644 index 0000000000..b1018ba408 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/errors/Expr - List - Comprehension 01 - ForExpr.fs @@ -0,0 +1 @@ +[ for a = 1 to 10 -> a ] diff --git a/ReSharper.FSharp/test/data/parsing/errors/Expr - List - Comprehension 01 - ForExpr.fs.gold b/ReSharper.FSharp/test/data/parsing/errors/Expr - List - Comprehension 01 - ForExpr.fs.gold new file mode 100644 index 0000000000..30de4971dc --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/errors/Expr - List - Comprehension 01 - ForExpr.fs.gold @@ -0,0 +1,33 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + IAnonModuleDeclaration + IDo + IChameleonExpression + IArrayOrListExpr + FSharpTokenType+LbrackTokenElement(type:LBRACK, text:[) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + IFromErrorExpr + IForExpr + FSharpTokenType+ForTokenElement(type:FOR, text:for) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ILocalDeclaration + FSharpIdentifierToken(type:IDENTIFIER, text:a) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ILiteralExpr + FSharpToken(type:INT32, text:1) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+ToTokenElement(type:TO, text:to) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ILiteralExpr + FSharpToken(type:INT32, text:10) + IFromErrorExpr + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+RarrowTokenElement(type:RARROW, text:->) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpIdentifierToken(type:IDENTIFIER, text:a) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+RbrackTokenElement(type:RBRACK, text:]) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/errors/Expr - New 01.fs b/ReSharper.FSharp/test/data/parsing/errors/Expr - New 01.fs new file mode 100644 index 0000000000..91483147b9 --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/errors/Expr - New 01.fs @@ -0,0 +1 @@ +new (a, _) = Base(a) diff --git a/ReSharper.FSharp/test/data/parsing/errors/Expr - New 01.fs.gold b/ReSharper.FSharp/test/data/parsing/errors/Expr - New 01.fs.gold new file mode 100644 index 0000000000..3712711e0a --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/errors/Expr - New 01.fs.gold @@ -0,0 +1,24 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + IAnonModuleDeclaration + IDo + IChameleonExpression + INewExpr + FSharpTokenType+NewTokenElement(type:NEW, text:new) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpIdentifierToken(type:IDENTIFIER, text:a) + FSharpTokenType+CommaTokenElement(type:COMMA, text:,) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+UnderscoreTokenElement(type:UNDERSCORE, text:_) + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpTokenType+EqualsTokenElement(type:EQUALS, text:=) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + FSharpIdentifierToken(type:IDENTIFIER, text:Base) + FSharpTokenType+LparenTokenElement(type:LPAREN, text:() + FSharpIdentifierToken(type:IDENTIFIER, text:a) + FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) + IFromErrorExpr + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/errors/Expr - Yield 01.fs b/ReSharper.FSharp/test/data/parsing/errors/Expr - Yield 01.fs new file mode 100644 index 0000000000..a4a28ff33c --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/errors/Expr - Yield 01.fs @@ -0,0 +1 @@ +yield 1 diff --git a/ReSharper.FSharp/test/data/parsing/errors/Expr - Yield 01.fs.gold b/ReSharper.FSharp/test/data/parsing/errors/Expr - Yield 01.fs.gold new file mode 100644 index 0000000000..a5f05896ab --- /dev/null +++ b/ReSharper.FSharp/test/data/parsing/errors/Expr - Yield 01.fs.gold @@ -0,0 +1,12 @@ +Language: PsiLanguageType:F# +IFSharpImplFile + IAnonModuleDeclaration + IDo + IChameleonExpression + IYieldOrReturnExpr + FSharpTokenType+YieldTokenElement(type:YIELD, text:yield) + Whitespace(type:WHITE_SPACE, text: ) spaces:" " + ILiteralExpr + FSharpToken(type:INT32, text:1) + NewLine(type:NEW_LINE, text:\n) spaces:"\n" + diff --git a/ReSharper.FSharp/test/data/parsing/signatures/Type member - Constructor 01.fsi.gold b/ReSharper.FSharp/test/data/parsing/signatures/Type member - Constructor 01.fsi.gold index 73f9dafc15..194940845b 100644 --- a/ReSharper.FSharp/test/data/parsing/signatures/Type member - Constructor 01.fsi.gold +++ b/ReSharper.FSharp/test/data/parsing/signatures/Type member - Constructor 01.fsi.gold @@ -19,14 +19,14 @@ IFSharpSigFile FSharpTokenType+NewTokenElement(type:NEW, text:new) FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IFunType - INamedType + IFunctionTypeUsage + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+RarrowTokenElement(type:RARROW, text:->) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:T) NewLine(type:NEW_LINE, text:\n) spaces:"\n" diff --git a/ReSharper.FSharp/test/data/parsing/signatures/Type member - Inherit 03 - Generic.fsi.gold b/ReSharper.FSharp/test/data/parsing/signatures/Type member - Inherit 03 - Generic.fsi.gold index 5afdbcefef..d90ab6538d 100644 --- a/ReSharper.FSharp/test/data/parsing/signatures/Type member - Inherit 03 - Generic.fsi.gold +++ b/ReSharper.FSharp/test/data/parsing/signatures/Type member - Inherit 03 - Generic.fsi.gold @@ -22,7 +22,7 @@ IFSharpSigFile FSharpIdentifierToken(type:IDENTIFIER, text:List) IPrefixAppTypeArgumentList FSharpTokenType+LessTokenElement(type:LESS, text:<) - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) FSharpTokenType+GreaterTokenElement(type:GREATER, text:>) diff --git a/ReSharper.FSharp/test/data/parsing/signatures/Type repr - Record 01.fsi.gold b/ReSharper.FSharp/test/data/parsing/signatures/Type repr - Record 01.fsi.gold index 48c729e3f2..bbff719a16 100644 --- a/ReSharper.FSharp/test/data/parsing/signatures/Type repr - Record 01.fsi.gold +++ b/ReSharper.FSharp/test/data/parsing/signatures/Type repr - Record 01.fsi.gold @@ -22,7 +22,7 @@ IFSharpSigFile FSharpIdentifierToken(type:IDENTIFIER, text:Field) FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) Whitespace(type:WHITE_SPACE, text: ) spaces:" " diff --git a/ReSharper.FSharp/test/data/parsing/signatures/Type repr - Record 03 - Field attributes.fsi.gold b/ReSharper.FSharp/test/data/parsing/signatures/Type repr - Record 03 - Field attributes.fsi.gold index 85738775ac..d093902e63 100644 --- a/ReSharper.FSharp/test/data/parsing/signatures/Type repr - Record 03 - Field attributes.fsi.gold +++ b/ReSharper.FSharp/test/data/parsing/signatures/Type repr - Record 03 - Field attributes.fsi.gold @@ -29,7 +29,7 @@ IFSharpSigFile FSharpIdentifierToken(type:IDENTIFIER, text:Field) FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) Whitespace(type:WHITE_SPACE, text: ) spaces:" " diff --git a/ReSharper.FSharp/test/data/parsing/signatures/Val - Active pattern 01.fsi.gold b/ReSharper.FSharp/test/data/parsing/signatures/Val - Active pattern 01.fsi.gold index 786b67d3c8..8554377b1d 100644 --- a/ReSharper.FSharp/test/data/parsing/signatures/Val - Active pattern 01.fsi.gold +++ b/ReSharper.FSharp/test/data/parsing/signatures/Val - Active pattern 01.fsi.gold @@ -24,14 +24,14 @@ IFSharpSigFile FSharpTokenType+RparenTokenElement(type:RPAREN, text:)) FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IFunType - INamedType + IFunctionTypeUsage + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:bool) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+RarrowTokenElement(type:RARROW, text:->) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:bool) NewLine(type:NEW_LINE, text:\n) spaces:"\n" diff --git a/ReSharper.FSharp/test/data/parsing/signatures/Val - Function 01.fsi.gold b/ReSharper.FSharp/test/data/parsing/signatures/Val - Function 01.fsi.gold index fea3c9132c..c26aa7661d 100644 --- a/ReSharper.FSharp/test/data/parsing/signatures/Val - Function 01.fsi.gold +++ b/ReSharper.FSharp/test/data/parsing/signatures/Val - Function 01.fsi.gold @@ -15,14 +15,14 @@ IFSharpSigFile FSharpIdentifierToken(type:IDENTIFIER, text:f) FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IFunType - INamedType + IFunctionTypeUsage + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+RarrowTokenElement(type:RARROW, text:->) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:unit) NewLine(type:NEW_LINE, text:\n) spaces:"\n" diff --git a/ReSharper.FSharp/test/data/parsing/signatures/Val - Function 02 - Named param.fsi.gold b/ReSharper.FSharp/test/data/parsing/signatures/Val - Function 02 - Named param.fsi.gold index 450e061e83..9b66b64558 100644 --- a/ReSharper.FSharp/test/data/parsing/signatures/Val - Function 02 - Named param.fsi.gold +++ b/ReSharper.FSharp/test/data/parsing/signatures/Val - Function 02 - Named param.fsi.gold @@ -15,17 +15,17 @@ IFSharpSigFile FSharpIdentifierToken(type:IDENTIFIER, text:f) FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IFunType + IFunctionTypeUsage FSharpIdentifierToken(type:IDENTIFIER, text:x) FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+RarrowTokenElement(type:RARROW, text:->) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:unit) NewLine(type:NEW_LINE, text:\n) spaces:"\n" diff --git a/ReSharper.FSharp/test/data/parsing/signatures/Val - Function 03 - Multiple named params.fsi.gold b/ReSharper.FSharp/test/data/parsing/signatures/Val - Function 03 - Multiple named params.fsi.gold index 12c4015f4d..8fb668e886 100644 --- a/ReSharper.FSharp/test/data/parsing/signatures/Val - Function 03 - Multiple named params.fsi.gold +++ b/ReSharper.FSharp/test/data/parsing/signatures/Val - Function 03 - Multiple named params.fsi.gold @@ -15,27 +15,27 @@ IFSharpSigFile FSharpIdentifierToken(type:IDENTIFIER, text:f) FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IFunType + IFunctionTypeUsage FSharpIdentifierToken(type:IDENTIFIER, text:x) FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+RarrowTokenElement(type:RARROW, text:->) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IFunType + IFunctionTypeUsage FSharpIdentifierToken(type:IDENTIFIER, text:y) FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+RarrowTokenElement(type:RARROW, text:->) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:unit) NewLine(type:NEW_LINE, text:\n) spaces:"\n" diff --git a/ReSharper.FSharp/test/data/parsing/signatures/Val - Function 04 - Named tuple param.fsi.gold b/ReSharper.FSharp/test/data/parsing/signatures/Val - Function 04 - Named tuple param.fsi.gold index 81ff7af185..baad97a0d9 100644 --- a/ReSharper.FSharp/test/data/parsing/signatures/Val - Function 04 - Named tuple param.fsi.gold +++ b/ReSharper.FSharp/test/data/parsing/signatures/Val - Function 04 - Named tuple param.fsi.gold @@ -15,12 +15,12 @@ IFSharpSigFile FSharpIdentifierToken(type:IDENTIFIER, text:f) FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - IFunType - ITupleType + IFunctionTypeUsage + ITupleTypeUsage FSharpIdentifierToken(type:IDENTIFIER, text:x) FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) Whitespace(type:WHITE_SPACE, text: ) spaces:" " @@ -29,13 +29,13 @@ IFSharpSigFile FSharpIdentifierToken(type:IDENTIFIER, text:y) FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) Whitespace(type:WHITE_SPACE, text: ) spaces:" " FSharpTokenType+RarrowTokenElement(type:RARROW, text:->) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:unit) NewLine(type:NEW_LINE, text:\n) spaces:"\n" diff --git a/ReSharper.FSharp/test/data/parsing/signatures/Val - Value 01.fsi.gold b/ReSharper.FSharp/test/data/parsing/signatures/Val - Value 01.fsi.gold index ea3273a330..f1f10a517d 100644 --- a/ReSharper.FSharp/test/data/parsing/signatures/Val - Value 01.fsi.gold +++ b/ReSharper.FSharp/test/data/parsing/signatures/Val - Value 01.fsi.gold @@ -15,7 +15,7 @@ IFSharpSigFile FSharpIdentifierToken(type:IDENTIFIER, text:x) FSharpTokenType+ColonTokenElement(type:COLON, text::) Whitespace(type:WHITE_SPACE, text: ) spaces:" " - INamedType + INamedTypeUsage ITypeReferenceName FSharpIdentifierToken(type:IDENTIFIER, text:int) NewLine(type:NEW_LINE, text:\n) spaces:"\n" diff --git a/ReSharper.FSharp/test/src/FSharp.Common.Tests/FSharp.Common.Tests.fsproj b/ReSharper.FSharp/test/src/FSharp.Common.Tests/FSharp.Common.Tests.fsproj index 8d2fdba9cf..374a08862d 100644 --- a/ReSharper.FSharp/test/src/FSharp.Common.Tests/FSharp.Common.Tests.fsproj +++ b/ReSharper.FSharp/test/src/FSharp.Common.Tests/FSharp.Common.Tests.fsproj @@ -8,6 +8,7 @@ + diff --git a/ReSharper.FSharp/test/src/FSharp.Common.Tests/ItemsContainerTest.fs b/ReSharper.FSharp/test/src/FSharp.Common.Tests/ItemsContainerTest.fs index a3b2cb15a8..13b0a0e4e6 100644 --- a/ReSharper.FSharp/test/src/FSharp.Common.Tests/ItemsContainerTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Common.Tests/ItemsContainerTest.fs @@ -61,7 +61,7 @@ let createContainer items writer = RdProjectDescription(projectDirectory.FullPath, projectMark.Location.FullPath, null, List(), List(), List()) let msBuildProject = MsBuildProject(projectMark, Dictionary(), [rdProject].ToList(id), rdProjectDescription) let projectProperties = FSharpProjectPropertiesFactory.CreateProjectProperties(List()) - let projectDescriptor = ProjectDescriptor.CreateByProjectName(Guid(), projectProperties, null, projectMark.Name) + let projectDescriptor = ProjectDescriptor.CreateByProjectName(Guid.NewGuid(), projectProperties, null, projectMark.Name) (container :> IFSharpItemsContainer).OnProjectLoaded(projectMark, msBuildProject, projectDescriptor) container diff --git a/ReSharper.FSharp/test/src/FSharp.Common.Tests/Stubs.fs b/ReSharper.FSharp/test/src/FSharp.Common.Tests/Stubs.fs new file mode 100644 index 0000000000..aab0eaa125 --- /dev/null +++ b/ReSharper.FSharp/test/src/FSharp.Common.Tests/Stubs.fs @@ -0,0 +1,9 @@ +namespace JetBrains.ReSharper.Plugins.FSharp.Common.Tests.Stubs + +open JetBrains.Application.Components +open JetBrains.ProjectModel +open JetBrains.ReSharper.Plugins.FSharp + +[] +type TestFcsReactorMonitor() = + interface IHideImplementation diff --git a/ReSharper.FSharp/test/src/FSharp.Tests.Host/FSharp.Tests.Host.fsproj b/ReSharper.FSharp/test/src/FSharp.Tests.Host/FSharp.Tests.Host.fsproj index 7849afbbf7..729a684925 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests.Host/FSharp.Tests.Host.fsproj +++ b/ReSharper.FSharp/test/src/FSharp.Tests.Host/FSharp.Tests.Host.fsproj @@ -8,7 +8,7 @@ - + diff --git a/ReSharper.FSharp/test/src/FSharp.Tests.Host/FcsHost.fs b/ReSharper.FSharp/test/src/FSharp.Tests.Host/TestFcsHost.fs similarity index 83% rename from ReSharper.FSharp/test/src/FSharp.Tests.Host/FcsHost.fs rename to ReSharper.FSharp/test/src/FSharp.Tests.Host/TestFcsHost.fs index ba6707c2ed..6947674c01 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests.Host/FcsHost.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests.Host/TestFcsHost.fs @@ -12,21 +12,21 @@ open JetBrains.ReSharper.Plugins.FSharp.ProjectModel.ProjectItems.ItemsContainer open JetBrains.ReSharper.Plugins.FSharp.Shim.FileSystem [] -type FcsHost - (lifetime: Lifetime, solution: ISolution, checkerService: FSharpCheckerService, - sourceCache: FSharpSourceCache, itemsContainer: FSharpItemsContainer) = +type TestFcsHost + (lifetime: Lifetime, solution: ISolution, checkerService: FSharpCheckerService, sourceCache: FSharpSourceCache, + itemsContainer: FSharpItemsContainer) = - let dumpSingleProjectMapping (rdVoid: Unit) = + let dumpSingleProjectMapping (_: Unit) = let projectMapping = itemsContainer.ProjectMappings.Values.SingleOrDefault().NotNull("Expected single project mapping.") projectMapping.DumpToString() do - let fcsHost = solution.RdFSharpModel().FSharpCompilerServiceHost + let fcsHost = solution.RdFSharpModel().FcsHost // We want to get events published by background checker. checkerService.Checker.ImplicitlyStartBackgroundWork <- true - + let subscription = checkerService.Checker.ProjectChecked.Subscribe(fun (projectFilePath, _) -> fcsHost.ProjectChecked(projectFilePath)) lifetime.OnTermination(fun _ -> subscription.Dispose()) |> ignore diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/Actions/CommentActionTests.fs b/ReSharper.FSharp/test/src/FSharp.Tests/Actions/CommentActionTests.fs index 20801f234e..c2129e3e25 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/Actions/CommentActionTests.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/Actions/CommentActionTests.fs @@ -1,7 +1,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features.Actions open JetBrains.ReSharper.Plugins.FSharp.Services.Formatter -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Tests open JetBrains.ReSharper.TestFramework open NUnit.Framework diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/Actions/FSharpExtendSelectionTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/Actions/FSharpExtendSelectionTest.fs index 23228cac0f..a08b5b0a12 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/Actions/FSharpExtendSelectionTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/Actions/FSharpExtendSelectionTest.fs @@ -1,7 +1,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features open JetBrains.ReSharper.Feature.Services.Tests.FeatureServices.SelectEmbracingConstruct -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Tests open NUnit.Framework [] diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/Common.fs b/ReSharper.FSharp/test/src/FSharp.Tests/Common.fs index c1dafc489c..f256a88abb 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/Common.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/Common.fs @@ -1,5 +1,4 @@ -[] -module JetBrains.ReSharper.Plugins.FSharp.Tests.Common +namespace JetBrains.ReSharper.Plugins.FSharp.Tests open System open System.Threading @@ -13,7 +12,6 @@ open JetBrains.ProjectModel.MSBuild open JetBrains.ProjectModel.Properties.Managed open JetBrains.ReSharper.Plugins.FSharp open JetBrains.ReSharper.Plugins.FSharp.Checker -open JetBrains.ReSharper.Plugins.FSharp.Checker.ProjectOptions open JetBrains.ReSharper.Plugins.FSharp.ProjectModel.ProjectProperties open JetBrains.ReSharper.Psi open JetBrains.ReSharper.TestFramework @@ -54,34 +52,34 @@ type FSharpScriptTestAttribute() = [] -type FSharpTestProjectOptionsBuilder(checkerService, logger) = - inherit FSharpProjectOptionsBuilder(checkerService, logger, Mock<_>().Object) +type TestFcsProjectBuilder(checkerService: FSharpCheckerService, logger: ILogger) = + inherit FcsProjectBuilder(checkerService, Mock<_>().Object, logger) override x.GetProjectItemsPaths(_, _) = [||] - interface IHideImplementation + interface IHideImplementation [] -type FSharpTestProjectOptionsProvider - (lifetime: Lifetime, checkerService: FSharpCheckerService, projectOptionsBuilder: IFSharpProjectOptionsBuilder, - scriptOptionsProvider: IFSharpScriptProjectOptionsProvider) as this = +type TestFcsProjectProvider + (lifetime: Lifetime, checkerService: FSharpCheckerService, fcsProjectBuilder: FcsProjectBuilder, + scriptFcsProjectProvider: IScriptFcsProjectProvider) as this = do - checkerService.OptionsProvider <- this - lifetime.OnTermination(fun _ -> checkerService.OptionsProvider <- Unchecked.defaultof<_>) |> ignore + checkerService.FcsProjectProvider <- this + lifetime.OnTermination(fun _ -> checkerService.FcsProjectProvider <- Unchecked.defaultof<_>) |> ignore let getProjectOptions (sourceFile: IPsiSourceFile) = - let fsProject = projectOptionsBuilder.BuildSingleFSharpProject(sourceFile.GetProject(), sourceFile.PsiModule) - Some { fsProject.ProjectOptions with SourceFiles = [| sourceFile.GetLocation().FullPath |] } + let fcsProject = fcsProjectBuilder.BuildFcsProject(sourceFile.PsiModule, sourceFile.GetProject()) + Some { fcsProject.ProjectOptions with SourceFiles = [| sourceFile.GetLocation().FullPath |] } - interface IHideImplementation + interface IHideImplementation - interface IFSharpProjectOptionsProvider with + interface IFcsProjectProvider with member x.HasPairFile _ = false member x.GetProjectOptions(sourceFile) = if sourceFile.LanguageType.Is() then - scriptOptionsProvider.GetScriptOptions(sourceFile) else + scriptFcsProjectProvider.GetScriptOptions(sourceFile) else getProjectOptions sourceFile @@ -109,5 +107,5 @@ type FSharpTestProjectOptionsProvider member x.GetFileIndex _ = 0 member x.ModuleInvalidated = new Signal<_>("Todo") :> _ - member x.Invalidate _ = false - member x.HasFSharpProjects = false + member x.InvalidateReferencesToProject _ = false + member x.HasFcsProjects = false diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/Daemon/InferredTypeHintStageTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/Daemon/InferredTypeHintStageTest.fs new file mode 100644 index 0000000000..9d9e31702a --- /dev/null +++ b/ReSharper.FSharp/test/src/FSharp.Tests/Daemon/InferredTypeHintStageTest.fs @@ -0,0 +1,84 @@ +namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features.Daemon + +open JetBrains.ReSharper.Feature.Services.TypeNameHints +open JetBrains.ReSharper.FeaturesTestFramework.Daemon +open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings +open JetBrains.ReSharper.Plugins.FSharp.Settings +open JetBrains.ReSharper.TestFramework +open NUnit.Framework + +[)>] +[] +[)>] +[, "ShowPipeReturnTypes", "false")>] +type InferredTypeHintStageTest() = + inherit FSharpHighlightingTestBase() + + override x.RelativeTestDataPath = "features/daemon/inferredTypeHints" + + [] + member x.``Function 01 - No arguments``() = x.DoNamedTest() + + [] + member x.``Function 02 - Curried arguments``() = x.DoNamedTest() + + [] member x.``Function 03 - Generic arguments``() = x.DoNamedTest() + [] member x.``Function 04 - Tupled arguments``() = x.DoNamedTest() + + [] + member x.``Function 05 - Type annotated - Curried``() = x.DoNamedTest() + + [] + member x.``Function 06 - Type annotated - Tupled``() = x.DoNamedTest() + + [] member x.``Function 07 - Local function``() = x.DoNamedTest() + [] member x.``Function 08 - Function arguments``() = x.DoNamedTest() + + [] + member x.``Function 09 - Pattern match argument``() = x.DoNamedTest() + + [] member x.``Function 10 - Arguments in parentheses``() = x.DoNamedTest() + + [] + member x.``Method 01 - No arguments``() = x.DoNamedTest() + + [] + member x.``Method 02 - Curried arguments``() = x.DoNamedTest() + + [] + member x.``Method 03 - Type annotated - Curried``() = x.DoNamedTest() + + [] + member x.``Method 04 - Type annotated - Tupled``() = x.DoNamedTest() + + [] + member x.``Pattern match 01 - Option``() = x.DoNamedTest() + + [] + member x.``Pattern match 02 - Record``() = x.DoNamedTest() + + [] + member x.``Pattern match 03 - Wildcard``() = x.DoNamedTest() + + [] + member x.``Pattern match 04 - Function``() = x.DoNamedTest() + + [] + member x.``Pattern match 05 - Active pattern``() = x.DoNamedTest() + + [] + member x.``Pattern match 06 - Type match``() = x.DoNamedTest() + + [] + member x.``Pattern match 07 - Lists and arrays``() = x.DoNamedTest() + + [] + member x.``Value 01 - Literals``() = x.DoNamedTest() + + [] + member x.``Value 02 - Non literals``() = x.DoNamedTest() + + [] + member x.``Value 03 - Pattern match``() = x.DoNamedTest() + + [] member x.``Nested 01``() = x.DoNamedTest() diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/Daemon/RedundantParensTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/Daemon/RedundantParensTest.fs index 8797d09efa..1bd8115f48 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/Daemon/RedundantParensTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/Daemon/RedundantParensTest.fs @@ -1,7 +1,6 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features.Daemon open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common open JetBrains.ReSharper.Plugins.FSharp.Tests.Features.Daemon open NUnit.Framework diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/Daemon/RedundantQualifiersTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/Daemon/RedundantQualifiersTest.fs new file mode 100644 index 0000000000..b646ac3527 --- /dev/null +++ b/ReSharper.FSharp/test/src/FSharp.Tests/Daemon/RedundantQualifiersTest.fs @@ -0,0 +1,41 @@ +namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features.Daemon + +open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings +open JetBrains.ReSharper.Plugins.FSharp.Tests.Features.Daemon +open JetBrains.ReSharper.TestFramework +open NUnit.Framework + +[] +type RedundantQualifiersTest() = + inherit FSharpHighlightingTestBase() + + override x.RelativeTestDataPath = "features/daemon/redundantQualifiers" + + override x.HighlightingPredicate(highlighting, _, _) = + highlighting :? RedundantQualifierWarning + + [] member x.``AutoOpen - Assembly 01``() = x.DoNamedTest() + [] member x.``AutoOpen - Assembly 02 - Implicit FSharp``() = x.DoNamedTest() + + [] member x.``AutoOpen - Global 01``() = x.DoNamedTest() + + [] member x.``AutoOpen - Nested 01``() = x.DoNamedTest() + [] member x.``AutoOpen - Nested 02 - Qualified``() = x.DoNamedTest() // todo: overlapped + + [] member x.``AutoOpen 01``() = x.DoNamedTest() + [] member x.``AutoOpen 02 - Qualified``() = x.DoNamedTest() + + [] member x.``Namespace 01``() = x.DoNamedTest() + [] member x.``Namespace 02 - Qualified``() = x.DoNamedTest() + [] member x.``Namespace 03 - Multiple import``() = x.DoNamedTest() + [] member x.``Namespace 04 - Global``() = x.DoNamedTest() + [] member x.``Namespace 05 - Prefix``() = x.DoNamedTest() + + [] member x.``Type extension 01``() = x.DoNamedTest() + + [] member x.``Compiled names - ModuleSuffix 01``() = x.DoNamedTest() + + [] + [] member x.``Compiled names - ModuleSuffix 02 - Implicit``() = x.DoNamedTest() + + [] member x.``Opens 01``() = x.DoNamedTest() diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/Debugger/ExpressionEvaluationInfoTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/Debugger/ExpressionEvaluationInfoTest.fs index 81e07a7488..e2fbcb3ebc 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/Debugger/ExpressionEvaluationInfoTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/Debugger/ExpressionEvaluationInfoTest.fs @@ -3,7 +3,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features.Debugger open JetBrains.ReSharper.Feature.Services.Util open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree open JetBrains.ReSharper.Plugins.FSharp.Services.Debugger -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Tests open JetBrains.ReSharper.TestFramework open NUnit.Framework @@ -16,7 +16,7 @@ type ExpressionEvaluationInfoTest() = override x.DoTest(lifetime, project) = let textControl = x.OpenTextControl(lifetime) - let expr = TextControlToPsi.GetElementFromCaretPosition(x.Solution, textControl) + let expr = TextControlToPsi.GetElementFromCaretPosition(x.Solution, textControl) let textToEvaluate = FSharpExpressionEvaluationInfoProvider.GetTextToEvaluate(expr) x.ExecuteWithGold(fun writer -> writer.WriteLine(textToEvaluate)) |> ignore diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/FSharp.Tests.fsproj b/ReSharper.FSharp/test/src/FSharp.Tests/FSharp.Tests.fsproj index 371453884a..c81ffc471d 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/FSharp.Tests.fsproj +++ b/ReSharper.FSharp/test/src/FSharp.Tests/FSharp.Tests.fsproj @@ -21,6 +21,7 @@ + @@ -31,6 +32,7 @@ + @@ -38,6 +40,7 @@ + @@ -69,6 +72,8 @@ + + diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/FSharpCompletionTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/FSharpCompletionTest.fs index ceba7dfe8e..c56edefbc2 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/FSharpCompletionTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/FSharpCompletionTest.fs @@ -2,7 +2,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features open JetBrains.ReSharper.FeaturesTestFramework.Completion open JetBrains.ReSharper.Plugins.FSharp.Settings -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Tests open JetBrains.ReSharper.TestFramework open NUnit.Framework diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/FSharpOccurenceKindTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/FSharpOccurenceKindTest.fs index b556654958..2208d6450c 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/FSharpOccurenceKindTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/FSharpOccurenceKindTest.fs @@ -15,6 +15,7 @@ type FSharpOccurenceKindTest() = [] member x.``New instance 01``() = x.DoNamedTest() [] member x.``New instance 02``() = x.DoNamedTest() [] member x.``New instance 03 - New``() = x.DoNamedTest() + [] member x.``New instance 04 - Attribute``() = x.DoNamedTest() [] member x.``Unions 01``() = x.DoNamedTest() [] member x.``Unions 02 - Single empty case``() = x.DoNamedTest() diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/Intentions/ElifToIfTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/Intentions/ElifToIfTest.fs index e848d70de0..4860882c46 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/Intentions/ElifToIfTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/Intentions/ElifToIfTest.fs @@ -1,7 +1,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Intentions -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Tests open JetBrains.ReSharper.TestFramework open NUnit.Framework diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/Intentions/IfToElifTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/Intentions/IfToElifTest.fs index 7b8e46d091..a375b66e04 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/Intentions/IfToElifTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/Intentions/IfToElifTest.fs @@ -1,7 +1,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Intentions -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Tests open JetBrains.ReSharper.TestFramework open NUnit.Framework diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/Intentions/IntentionsTestBase.fs b/ReSharper.FSharp/test/src/FSharp.Tests/Intentions/IntentionsTestBase.fs index fab0b6ee4f..c731ae1d11 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/Intentions/IntentionsTestBase.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/Intentions/IntentionsTestBase.fs @@ -2,7 +2,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features open JetBrains.ReSharper.Feature.Services.ContextActions open JetBrains.ReSharper.FeaturesTestFramework.Intentions -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Tests [] type FSharpContextActionExecuteTestBase<'T when 'T :> IContextAction and 'T: not struct>() = diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/Intentions/NegateConditionTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/Intentions/NegateConditionTest.fs index 49608e3ad0..c216effc5f 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/Intentions/NegateConditionTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/Intentions/NegateConditionTest.fs @@ -1,7 +1,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Intentions -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Tests open JetBrains.ReSharper.TestFramework open NUnit.Framework diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/Intentions/ToRecursiveLetBindings.fs b/ReSharper.FSharp/test/src/FSharp.Tests/Intentions/ToRecursiveLetBindings.fs index 9b27a50185..3936454434 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/Intentions/ToRecursiveLetBindings.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/Intentions/ToRecursiveLetBindings.fs @@ -12,6 +12,7 @@ type ToRecursiveLetBindingsActionExecuteTest() = [] member x.``Module - Space 01``() = x.DoNamedTest() [] member x.``Module - Next line 01``() = x.DoNamedTest() [] member x.``Module - Next line 02``() = x.DoNamedTest() + [] member x.``Module - Alignment 01``() = x.DoNamedTest() [] member x.``Expression - Simple 01``() = x.DoNamedTest() [] member x.``Expression - Next line 01``() = x.DoNamedTest() diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/NavigationTests.fs b/ReSharper.FSharp/test/src/FSharp.Tests/NavigationTests.fs index 87d295b809..9ad5b2fa89 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/NavigationTests.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/NavigationTests.fs @@ -35,6 +35,8 @@ type FSharpGoToUsagesTest() = [] member x.``Anon record 02 - Type``() = x.DoNamedTest() [] member x.``Anon record 03 - Getter``() = x.DoNamedTest() + [] member x.``Module suffix 01 - Compiled``() = x.DoNamedTest() + type FSharpGoToInheritorsTest() = inherit FSharpContextSearchTestBase("inheritors") @@ -88,6 +90,7 @@ type FSharpGoToDeclarationTest() = |> Seq.filter (fun p -> p :? IGotoDeclarationProvider) [] member x.``Own member vs interface``() = x.DoNamedTest() + [] member x.``Ctor 01 - Modifier``() = x.DoNamedTest() [] [] member x.``Same type from different assemblies``() = x.DoNamedTest() diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/Parsing/FSharpLexerTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/Parsing/FSharpLexerTest.fs index 89448a5859..ec15da5355 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/Parsing/FSharpLexerTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/Parsing/FSharpLexerTest.fs @@ -28,6 +28,7 @@ type FSharpLexerTest() = [] member x.``Strings 05 - Escape characters 4 - Verbatim``() = x.DoNamedTest() [] member x.``Strings 06 - Keyword``() = x.DoNamedTest() [] member x.``Strings 07 - Backslash``() = x.DoNamedTest() + [] member x.``Strings 08 - Quotes``() = x.DoNamedTest() [] member x.``Multiline strings 01 - Simple``() = x.DoNamedTest() [] member x.``Multiline strings 02 - Triple quoted``() = x.DoNamedTest() diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/Parsing/FSharpParserTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/Parsing/FSharpParserTest.fs index 117b2287e6..fbf153f983 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/Parsing/FSharpParserTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/Parsing/FSharpParserTest.fs @@ -28,9 +28,10 @@ type FSharpParserTest() = [] member x.``Type decl - Extension 01``() = x.DoNamedTest() + [] member x.``Type decl - Delegate - Ctor 01``() = x.DoNamedTest() + [] member x.``Type decl - Delegate - Ctor 02``() = x.DoNamedTest() [] member x.``Type decl - Delegate 01``() = x.DoNamedTest() [] member x.``Type decl - Delegate 02``() = x.DoNamedTest() - [] member x.``Type decl - Delegate 03 - Ctor``() = x.DoNamedTest() [] member x.``Type parameters - Constraints 01 - Struct``() = x.DoNamedTest() [] member x.``Type parameters - Constraints 02 - Member``() = x.DoNamedTest() @@ -39,10 +40,19 @@ type FSharpParserTest() = [] member x.``Type decl - Attributes 01``() = x.DoNamedTest() [] member x.``Type decl - Attributes 02``() = x.DoNamedTest() - + + [] member x.``Type decl - Let binding - Function 01``() = x.DoNamedTest() + [] member x.``Type decl - Let binding - Value 01``() = x.DoNamedTest() + [] member x.``Type decl - Let binding - Value 02 - Upper``() = x.DoNamedTest() + [] member x.``Type decl - Enum 01 - With first bar``() = x.DoNamedTest() [] member x.``Type decl - Enum 02 - Without first bar``() = x.DoNamedTest() + [] member x.``Type decl - Union 01``() = x.DoNamedTest() + [] member x.``Type decl - Union 02 - Modifier``() = x.DoNamedTest() + [] member x.``Type decl - Union 03 - No first bar``() = x.DoNamedTest() + [] member x.``Type decl - Union 04 - No first bar with modifier``() = x.DoNamedTest() + [] member x.``Let 01 - Simple``() = x.DoNamedTest() [] member x.``Let 02 - Typed``() = x.DoNamedTest() [] member x.``Let 03 - Typed, var type``() = x.DoNamedTest() @@ -179,6 +189,7 @@ type FSharpParserTest() = [] member x.``Expr - DotIndexerGet 02``() = x.DoNamedTest() [] member x.``Expr - DotIndexerGet 03``() = x.DoNamedTest() [] member x.``Expr - DotIndexerGet 04 - Multiple args``() = x.DoNamedTest() + [] member x.``Expr - DotIndexerGet 05 - Typed``() = x.DoNamedTest() [] member x.``Expr - DotIndexerSet 01``() = x.DoNamedTest() [] member x.``Expr - DotIndexerSet 02 - Record``() = x.DoNamedTest() @@ -196,6 +207,15 @@ type FSharpParserTest() = [] member x.``Expr - Sequential 05 - Let``() = x.DoNamedTest() [] member x.``Expr - Sequential 06 - Let``() = x.DoNamedTest() + [] member x.``Expr - List - Empty 01``() = x.DoNamedTest() + [] member x.``Expr - List - Comprehension 01``() = x.DoNamedTest() + [] member x.``Expr - List - Range sequence 01``() = x.DoNamedTest() + [] member x.``Expr - List - Seq 01``() = x.DoNamedTest() + [] member x.``Expr - List - Seq 02 - Implicit semi``() = x.DoNamedTest() + [] member x.``Expr - List - Seq 03 - Implicit yield``() = x.DoNamedTest() + [] member x.``Expr - List - Seq 04 - Yield``() = x.DoNamedTest() + [] member x.``Expr - List - Seq 05 - ForEach``() = x.DoNamedTest() + [] member x.``Expr - New 01 - Lid``() = x.DoNamedTest() [] member x.``Expr - New 02 - Generics``() = x.DoNamedTest() [] member x.``Expr - New 03 - Type parameter``() = x.DoNamedTest() @@ -206,6 +226,7 @@ type FSharpParserTest() = [] member x.``Expr - ImplicitZero 01``() = x.DoNamedTest() [] member x.``Expr - LetOrUseBang 01``() = x.DoNamedTest() + [] member x.``Expr - LetOrUseBang 02 - Group``() = x.DoNamedTest() [] member x.``Expr - Typeof 01 - Type parameter``() = x.DoNamedTest() @@ -271,11 +292,20 @@ type FSharpParserTest() = [] member x.``Types - Constraints - Comparison 01``() = x.DoNamedTest() [] member x.``Types - Constraints - Equality 01``() = x.DoNamedTest() + [] member x.``Type member - Ctor - Primary - Parameters 01``() = x.DoNamedTest() + [] member x.``Type member - Ctor - Primary - Parameters 02 - Typed``() = x.DoNamedTest() + [] member x.``Type member - Ctor - Primary - Parameters 03``() = x.DoNamedTest() + [] member x.``Type member - Ctor - Primary - Parameters 04 - Attributes``() = x.DoNamedTest() + [] member x.``Type member - Ctor - Primary - Parameters 05 - Attributes``() = x.DoNamedTest() [] member x.``Type member - Ctor - Primary 01``() = x.DoNamedTest() [] member x.``Type member - Ctor - Primary 02 - Modifier``() = x.DoNamedTest() [] member x.``Type member - Ctor - Primary 03 - Attributes``() = x.DoNamedTest() + [] member x.``Type member - Ctor - Secondary - Parameters 01``() = x.DoNamedTest() + [] member x.``Type member - Ctor - Secondary - Parameters 02``() = x.DoNamedTest() [] member x.``Type member - Ctor - Secondary 01``() = x.DoNamedTest() [] member x.``Type member - Ctor - Secondary 02 - Modifier``() = x.DoNamedTest() + [] member x.``Type member - Ctor - Secondary 03 - Attributes``() = x.DoNamedTest() + [] member x.``Type member - Ctor - Secondary 04 - Self id``() = x.DoNamedTest() [] member x.``Type member - Inherit - Type 01 - Simple``() = x.DoNamedTest() [] member x.``Type member - Inherit - Type 02 - Qualified``() = x.DoNamedTest() @@ -287,6 +317,8 @@ type FSharpParserTest() = [] member x.``Type member - Member 01 - Wild self id``() = x.DoNamedTest() + [] member x.``Type member - Member - Method - Parameters 01``() = x.DoNamedTest() + [] member x.``Type member - Member - Method - Parameters 02``() = x.DoNamedTest() [] member x.``Type member - Member - Method 01``() = x.DoNamedTest() [] member x.``Type member - Member - Method 02 - Static``() = x.DoNamedTest() @@ -303,6 +335,16 @@ type FSharpParserTest() = [] member x.``Pattern - As - Wild 01``() = x.DoNamedTest() + [] member x.``Pattern - Named args 01``() = x.DoNamedTest() + [] member x.``Pattern - Named args 02 - Multiple``() = x.DoNamedTest() + + [] member x.``Pattern - Reference 01``() = x.DoNamedTest() + [] member x.``Pattern - Reference 02 - Upper``() = x.DoNamedTest() + [] member x.``Pattern - Reference 03 - Qualified``() = x.DoNamedTest() + + [] member x.``Pattern - Parameters owner 01``() = x.DoNamedTest() + [] member x.``Pattern - Parameters owner 02 - Qualified``() = x.DoNamedTest() + [] member x.``Record field 01 - Attribute``() = x.DoNamedTest() @@ -351,3 +393,12 @@ type FSharpErrorsParserTest() = [] member x.``Expr - CompExpr - Range 01``() = x.DoNamedTest() [] member x.``Expr - CompExpr - Range 02 - Step``() = x.DoNamedTest() [] member x.``Expr - CompExpr - Range 03``() = x.DoNamedTest() + + [] member x.``Expr - Yield 01``() = x.DoNamedTest() + [] member x.``Expr - For 01 - Rarrow``() = x.DoNamedTest() + [] member x.``Expr - List - Comprehension 01 - ForExpr``() = x.DoNamedTest() + + [] member x.``Expr - If 01``() = x.DoNamedTest() + [] member x.``Expr - If 02``() = x.DoNamedTest() + + [] member x.``Expr - New 01``() = x.DoNamedTest() diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/AddIgnoreTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/AddIgnoreTest.fs index 8d70bc6bc3..af25c280b4 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/AddIgnoreTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/AddIgnoreTest.fs @@ -4,7 +4,7 @@ open JetBrains.ProjectModel open JetBrains.ReSharper.FeaturesTestFramework.Intentions open JetBrains.ReSharper.FeaturesTestFramework.Refactorings open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Tests open NUnit.Framework [] diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/AddParensTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/AddParensTest.fs index b3ca492bce..695ecd2a72 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/AddParensTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/AddParensTest.fs @@ -2,7 +2,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features open JetBrains.ReSharper.FeaturesTestFramework.Intentions open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Tests open NUnit.Framework [] diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/GenerateMissingRecordFieldsTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/GenerateMissingRecordFieldsTest.fs index d7eed9e168..4eb2d53d02 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/GenerateMissingRecordFieldsTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/GenerateMissingRecordFieldsTest.fs @@ -2,7 +2,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features open JetBrains.ReSharper.FeaturesTestFramework.Intentions open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Tests open NUnit.Framework [] diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/ImportTypeTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/ImportTypeTest.fs index 890cd85502..d642cb9042 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/ImportTypeTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/ImportTypeTest.fs @@ -27,4 +27,12 @@ type ImportTypeTest() = [] member x.``Type arguments - Count 01``() = x.DoNamedTest() [] member x.``Module name - Escaped 01``() = x.DoNamedTest() + [] member x.``Qualifiers - Expr - Imported 01``() = x.DoNamedTest() + [] member x.``Qualifiers - Expr - Imported 02 - Nested``() = x.DoNamedTest() + [] member x.``Qualifiers - Expr 01``() = x.DoNamedTest() + [] member x.``Qualifiers - Expr 02 - Nested``() = x.DoNamedTest() + [] member x.``Qualifiers - Reference name - Expression 01``() = x.DoNamedTest() + [] member x.``Qualifiers - Reference name - Type 01``() = x.DoNamedTest() + [] member x.``Qualifiers - Type extension 01``() = x.DoNamedTest() + [] member x.``Not available 01 - Open``() = x.DoNamedTest() diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/IntroduceVarTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/IntroduceVarTest.fs index 4ea4062e19..3a892387fd 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/IntroduceVarTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/IntroduceVarTest.fs @@ -2,7 +2,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features open JetBrains.ReSharper.FeaturesTestFramework.Intentions open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Tests open NUnit.Framework [] @@ -21,3 +21,9 @@ type IntroduceVarTest() = [] member x.``Local - Seq - Multiline 01``() = x.DoNamedTest() [] member x.``Local - Seq - Multiple occurrences 01``() = x.DoNamedTest() + + [] member x.``Local - Seq - Last 01``() = x.DoNamedTest() + + [] member x.``Do 01``() = x.DoNamedTest() + [] member x.``For 01``() = x.DoNamedTest() + [] member x.``If 01``() = x.DoNamedTest() diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveInlineTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveInlineTest.fs index 25606a8af4..059dfa4475 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveInlineTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveInlineTest.fs @@ -2,7 +2,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features open JetBrains.ReSharper.FeaturesTestFramework.Intentions open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Tests open NUnit.Framework [] diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveNeverMatchingRuleTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveNeverMatchingRuleTest.fs index f8d03f3106..e9b184244c 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveNeverMatchingRuleTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveNeverMatchingRuleTest.fs @@ -2,7 +2,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features open JetBrains.ReSharper.FeaturesTestFramework.Intentions open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Tests open NUnit.Framework [] diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveRedundantAttributeParensTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveRedundantAttributeParensTest.fs index 226fd42c80..d2d36869ab 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveRedundantAttributeParensTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveRedundantAttributeParensTest.fs @@ -2,7 +2,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features open JetBrains.ReSharper.FeaturesTestFramework.Intentions open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Tests open NUnit.Framework [] diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveRedundantAttributeSuffixTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveRedundantAttributeSuffixTest.fs index e1646a8695..37f34b3e03 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveRedundantAttributeSuffixTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveRedundantAttributeSuffixTest.fs @@ -2,7 +2,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features open JetBrains.ReSharper.FeaturesTestFramework.Intentions open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Tests open NUnit.Framework [] diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveRedundantBackticksTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveRedundantBackticksTest.fs index 88b02d56b3..7fce8f684a 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveRedundantBackticksTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveRedundantBackticksTest.fs @@ -2,7 +2,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features open JetBrains.ReSharper.FeaturesTestFramework.Intentions open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Tests open NUnit.Framework [] diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveRedundantNewTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveRedundantNewTest.fs index c73bbf6bb5..81e0c4bca5 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveRedundantNewTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveRedundantNewTest.fs @@ -2,7 +2,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features open JetBrains.ReSharper.FeaturesTestFramework.Intentions open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Tests open NUnit.Framework [] diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveRedundantQualifierTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveRedundantQualifierTest.fs new file mode 100644 index 0000000000..b2e550f32f --- /dev/null +++ b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveRedundantQualifierTest.fs @@ -0,0 +1,17 @@ +namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features + +open JetBrains.ReSharper.FeaturesTestFramework.Intentions +open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes +open JetBrains.ReSharper.Plugins.FSharp.Tests +open JetBrains.ReSharper.TestFramework +open NUnit.Framework + +[] +type RemoveRedundantQualifierTest() = + inherit QuickFixTestBase() + + override x.RelativeTestDataPath = "features/quickFixes/removeRedundantQualifier" + + [] member x.``Reference expr 01``() = x.DoNamedTest() + [] member x.``Reference name 01``() = x.DoNamedTest() + [] member x.``Type extension 01``() = x.DoNamedTest() diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveSubsequentTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveSubsequentTest.fs index b057e1688d..3f3eb6029f 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveSubsequentTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveSubsequentTest.fs @@ -2,7 +2,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features open JetBrains.ReSharper.FeaturesTestFramework.Intentions open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Tests open NUnit.Framework [] diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveUnexpectedArgumentsTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveUnexpectedArgumentsTest.fs index 11bb7b0a5e..a2d949260a 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveUnexpectedArgumentsTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveUnexpectedArgumentsTest.fs @@ -2,7 +2,7 @@ open JetBrains.ReSharper.FeaturesTestFramework.Intentions open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Tests open NUnit.Framework [] diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveUnnecessaryUpcastTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveUnnecessaryUpcastTest.fs index 57a9f008f2..31daad6b8a 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveUnnecessaryUpcastTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveUnnecessaryUpcastTest.fs @@ -2,7 +2,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features open JetBrains.ReSharper.FeaturesTestFramework.Intentions open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Tests open NUnit.Framework [] diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveUnusedLocalBindingTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveUnusedLocalBindingTest.fs index 5b08976986..ef8a05960f 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveUnusedLocalBindingTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveUnusedLocalBindingTest.fs @@ -2,7 +2,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features open JetBrains.ReSharper.FeaturesTestFramework.Intentions open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Tests open NUnit.Framework [] diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveUnusedNamedAsPatTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveUnusedNamedAsPatTest.fs index 6c2c8e9176..4561a6a2c3 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveUnusedNamedAsPatTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveUnusedNamedAsPatTest.fs @@ -2,7 +2,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features open JetBrains.ReSharper.FeaturesTestFramework.Intentions open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Tests open NUnit.Framework [] diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveUnusedOpensTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveUnusedOpensTest.fs index f70ca35d18..60c836f23c 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveUnusedOpensTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveUnusedOpensTest.fs @@ -2,7 +2,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features open JetBrains.ReSharper.FeaturesTestFramework.Intentions open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Tests open NUnit.Framework [] diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveUnusedSelfIdVariableFix.fs b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveUnusedSelfIdVariableFix.fs index 79960c142e..b111de3e7a 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveUnusedSelfIdVariableFix.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveUnusedSelfIdVariableFix.fs @@ -2,7 +2,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features open JetBrains.ReSharper.FeaturesTestFramework.Intentions open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Tests open NUnit.Framework [] diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveYieldTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveYieldTest.fs new file mode 100644 index 0000000000..de34195aca --- /dev/null +++ b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/RemoveYieldTest.fs @@ -0,0 +1,23 @@ +namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features + +open JetBrains.ReSharper.FeaturesTestFramework.Intentions +open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes +open JetBrains.ReSharper.Plugins.FSharp.Tests +open JetBrains.ReSharper.TestFramework +open NUnit.Framework + +[] +type RemoveYieldTest() = + inherit QuickFixTestBase() + + override x.RelativeTestDataPath = "features/quickFixes/removeYield" + + [] member x.``Return 01``() = x.DoNamedTest() + [] member x.``Return 02 - Multiline``() = x.DoNamedTest() + [] member x.``Return 03 - New line``() = x.DoNamedTest() + + [] member x.``Yield 01``() = x.DoNamedTest() + [] member x.``Yield 02 - Comment``() = x.DoNamedTest() + + [] member x.``Return! 01``() = x.DoNamedTest() + [] member x.``Yield! 01``() = x.DoNamedTest() diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/ReplaceLetWithExpressionTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/ReplaceLetWithExpressionTest.fs index e501da6a1d..64e8279d32 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/ReplaceLetWithExpressionTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/ReplaceLetWithExpressionTest.fs @@ -2,7 +2,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features open JetBrains.ReSharper.FeaturesTestFramework.Intentions open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Tests open NUnit.Framework [] diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/ReplaceUseWithLetTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/ReplaceUseWithLetTest.fs index 83ef439e2b..369d431f58 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/ReplaceUseWithLetTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/ReplaceUseWithLetTest.fs @@ -2,7 +2,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features open JetBrains.ReSharper.FeaturesTestFramework.Intentions open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Tests open NUnit.Framework [] diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/ReplaceWithAssignmentExpressionTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/ReplaceWithAssignmentExpressionTest.fs index 2b1822f13c..d1937c8eec 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/ReplaceWithAssignmentExpressionTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/ReplaceWithAssignmentExpressionTest.fs @@ -2,7 +2,7 @@ open JetBrains.ReSharper.FeaturesTestFramework.Intentions open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Tests open JetBrains.ReSharper.TestFramework open NUnit.Framework diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/ReplaceWithWildPatTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/ReplaceWithWildPatTest.fs index cdf63725d2..ffd43d29e3 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/ReplaceWithWildPatTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/ReplaceWithWildPatTest.fs @@ -2,7 +2,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features open JetBrains.ReSharper.FeaturesTestFramework.Intentions open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Tests open NUnit.Framework [] @@ -32,3 +32,5 @@ type ReplaceWithWildPatAvailabilityTest() = [] member x.``Not available - Let - Attribute 01``() = x.DoNamedTest() [] member x.``Not available - Let - Attribute 02 - Parens``() = x.DoNamedTest() + [] member x.``Not available - Let - Attribute 03 - Typed``() = x.DoNamedTest() + [] member x.``Not available - Let - Attribute 04 - Typed``() = x.DoNamedTest() diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/ToRecursiveFunctionTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/ToRecursiveFunctionTest.fs index ba4a737a9e..d0ce64a02e 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/ToRecursiveFunctionTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/ToRecursiveFunctionTest.fs @@ -2,7 +2,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features open JetBrains.ReSharper.FeaturesTestFramework.Intentions open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Tests open NUnit.Framework [] @@ -12,4 +12,5 @@ type ToRecursiveFunctionTest() = override x.RelativeTestDataPath = "features/quickFixes/toRecursiveFunction" [] member x.``Top level 01``() = x.DoNamedTest() + [] member x.``Top level 02 - Alignment``() = x.DoNamedTest() [] member x.``Local 01``() = x.DoNamedTest() diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/ToRecursiveLetBindingsTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/ToRecursiveLetBindingsTest.fs index 3e3acf7f95..d8a466bd70 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/ToRecursiveLetBindingsTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/ToRecursiveLetBindingsTest.fs @@ -2,7 +2,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features open JetBrains.ReSharper.FeaturesTestFramework.Intentions open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Tests open NUnit.Framework [] @@ -13,3 +13,4 @@ type ToRecursiveLetBindingsTest() = [] member x.``Module 01 - Simple``() = x.DoNamedTest() [] member x.``Module 02 - Attributes``() = x.DoNamedTest() + [] member x.``Module 03 - Alignment``() = x.DoNamedTest() diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/ToUpcastTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/ToUpcastTest.fs index c8285c2ab0..ada6f05535 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/ToUpcastTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/QuickFixes/ToUpcastTest.fs @@ -2,7 +2,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features open JetBrains.ReSharper.FeaturesTestFramework.Intentions open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Tests open NUnit.Framework [] diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/Refactotings/IntroduceVarTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/Refactotings/IntroduceVarTest.fs index 5e887093b2..e3488f3723 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/Refactotings/IntroduceVarTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/Refactotings/IntroduceVarTest.fs @@ -16,24 +16,65 @@ type IntroduceVarTest() = [] member x.``Simple 01``() = x.DoNamedTest() [] member x.``Simple 02``() = x.DoNamedTest() + [] member x.``Simple 03``() = x.DoNamedTest() [] member x.``Let 01``() = x.DoNamedTest() [] member x.``Let 02 - Function``() = x.DoNamedTest() [] member x.``Let 03 - Inside other``() = x.DoNamedTest() + [] member x.``Let 04 - After other``() = x.DoNamedTest() [] member x.``Match 01``() = x.DoNamedTest() [] member x.``Match 02 - Multiline``() = x.DoNamedTest() + [] member x.``Match 03 - Multiline``() = x.DoNamedTest() + [] member x.``Match 04 - Multiline``() = x.DoNamedTest() + [] member x.``LetExpr 01``() = x.DoNamedTest() + + [] member x.``Seq 01``() = x.DoNamedTest() + [] member x.``Seq 02``() = x.DoNamedTest() + [] member x.``Seq 03 - Last``() = x.DoNamedTest() + [] member x.``Seq 04``() = x.DoNamedTest() + + [] member x.``LetDecl - Function 01``() = x.DoNamedTest() + [] member x.``LetDecl - Function 02``() = x.DoNamedTest() [] member x.``LetDecl 01``() = x.DoNamedTest() [] member x.``LetDecl 02 - Indent``() = x.DoNamedTest() [] member x.``Do decl - Implicit 01``() = x.DoNamedTest() [] member x.``Do decl - Implicit 02 - App``() = x.DoNamedTest() + [] member x.``Member - Decl 01``() = x.DoNamedTest() + [] member x.``Member - Auto property 01``() = x.DoNamedTest() + + [] member x.``Expr - Binary app 01``() = x.DoNamedTest() + [] member x.``Expr - Binary app - Same indent 01``() = x.DoNamedTest() + [] member x.``Expr - Binary app - Same indent 02``() = x.DoNamedTest() + [] member x.``Expr - Binary app - Same indent 03``() = x.DoNamedTest() + [] member x.``Expr - Binary app - Same indent 04``() = x.DoNamedTest() + [] member x.``Expr - Binary app - Same indent 05``() = x.DoNamedTest() + + [] member x.``Record field binding - Anon 01``() = x.DoNamedTest() + [] member x.``Record field binding - Anon 02 - In app``() = x.DoNamedTest() + [] member x.``Record field binding 01``() = x.DoNamedTest() + [] member x.``Record field binding 02 - In app``() = x.DoNamedTest() + [] member x.``Shift - Decl 01``() = x.DoNamedTest() [] member x.``Shift - Decl 02``() = x.DoNamedTest() [] member x.``Shift - Expr 01``() = x.DoNamedTest() [] member x.``Shift - Expr 02``() = x.DoNamedTest() + [] member x.``Single line - If 01``() = x.DoNamedTest() + [] member x.``Single line - Lambda 01``() = x.DoNamedTest() + [] member x.``Single line - Match 01``() = x.DoNamedTest() + [] member x.``Single line - Match 02 - Parens``() = x.DoNamedTest() + [] member x.``Single line - When 01``() = x.DoNamedTest() + [] member x.``Not allowed - Attribute 01``() = x.DoNamedTest() + [] member x.``Not allowed - CompExpr 01``() = x.DoNamedTest() + [] member x.``Not allowed - CompExpr 02 - Yield``() = x.DoNamedTest() + [] member x.``Not allowed - RangeSequenceExpr 01``() = x.DoNamedTest() + + [] member x.``Not allowed - Named arg 01``() = x.DoNamedTest() + [] member x.``Not allowed - Named arg 02 - Unit``() = x.DoNamedTest() + [] member x.``Not allowed - Named arg 03 - Union case field``() = x.DoNamedTest() diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/Refactotings/RenameTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/Refactotings/RenameTest.fs index 8dbc06b7c7..50fbbe89d4 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/Refactotings/RenameTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/Refactotings/RenameTest.fs @@ -13,7 +13,7 @@ type FSharpRenameTest() = override x.RelativeTestDataPath = "features/refactorings/rename" - override x.ProvideOccurrencesData(occurrences, context, control) = + override x.ProvideOccurrencesData(occurrences, _, _) = // When multiple overloads are available, we want to rename initial element. // Current occurrences are: // "Rename initial element" @@ -24,8 +24,8 @@ type FSharpRenameTest() = let testName = x.TestMethodName let csExtension = CSharpProjectFileType.CS_EXTENSION let fsExtension = FSharpProjectFileType.FsExtension - x.DoTestFiles(testName + csExtension, testName + fsExtension) - + x.DoTestSolution([| testName + csExtension; testName + fsExtension |]) + [] member x.``Inline - Declaration``() = x.DoNamedTest() [] member x.``Inline - Use``() = x.DoNamedTest() [] member x.``Inline - Member self id``() = x.DoNamedTest() @@ -73,6 +73,10 @@ type FSharpRenameTest() = [] member x.``Params - Attributes``() = x.DoNamedTest() [] member x.``Params - Optional param 01``() = x.DoNamedTest() + [] member x.``Ctor params 01``() = x.DoNamedTest() + [] member x.``Ctor params 02``() = x.DoNamedTest() + [] member x.``Ctor params 03``() = x.DoNamedTest() + [] member x.``Type private binding - function``() = x.DoNamedTest() [] member x.``Type private binding - value``() = x.DoNamedTest() @@ -170,7 +174,12 @@ type FSharpRenameTest() = [] member x.``Union Case Field - Creation param 01``() = x.DoNamedTest() [] member x.``Union Case Field - Creation param 02 - Tuple``() = x.DoNamedTest() + [] member x.``Union Case Field - Pattern param 01``() = x.DoNamedTest() + [] member x.``Union Case Field - Pattern param 02``() = x.DoNamedTest() + [] member x.``Union Case Field - Pattern param 03 - Pat``() = x.DoNamedTest() [] member x.``Anon record 01``() = x.DoNamedTest() [] member x.``Anon record 02 - Invalid name``() = x.DoNamedTest() + + [] member x.``Error - If 01``() = x.DoNamedTest() diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/Service/ArgumentsOwnerTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/Service/ArgumentsOwnerTest.fs new file mode 100644 index 0000000000..9e2df8e1ca --- /dev/null +++ b/ReSharper.FSharp/test/src/FSharp.Tests/Service/ArgumentsOwnerTest.fs @@ -0,0 +1,151 @@ +namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features + +open System +open JetBrains.Diagnostics +open JetBrains.ProjectModel +open JetBrains.ReSharper.FeaturesTestFramework.Utils +open JetBrains.ReSharper.Plugins.FSharp.Psi +open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.DeclaredElement +open JetBrains.ReSharper.Plugins.FSharp.Tests +open JetBrains.ReSharper.Plugins.FSharp.Util +open JetBrains.ReSharper.Psi +open JetBrains.ReSharper.Psi.Tree +open JetBrains.ReSharper.TestFramework +open JetBrains.TextControl +open NUnit.Framework + +[] +[] +[] +type ArgumentsOwnerTest() = + inherit BaseTestWithTextControl() + + let treeNodeSelection = FSharpTreeNodeSelectionProvider.Instance + + override x.RelativeTestDataPath = "features/service/arguments" + + override x.DoTest(lifetime, _) = + let textControl = x.OpenTextControl(lifetime) + let fsFile = textControl.GetFSharpFile(x.Solution) + + let document = textControl.Document + let filePath = fsFile.GetSourceFile().GetLocation() + + let selection = textControl.Selection.OneDocumentRangeWithCaret() + let expr = + treeNodeSelection + .GetExpressionInRange(fsFile, selection, true, null) + .NotNull("Failed to find IArgumentsOwner at selection") + + x.ExecuteWithGold(fun writer -> + let args = Array.ofSeq expr.Arguments + + let endTexts, ranges = + args + |> Array.indexed + |> Array.collect (fun (i, expr) -> + let matchingParam = expr.MatchingParameter + + let declRange = + if isNull matchingParam then None else + + match matchingParam.Element with + | :? FSharpMethodParameter as param when + FileSystemPath.TryParse(param.FSharpSymbol.DeclarationLocation.FileName) = filePath -> + Some (FSharpRangeUtil.getTextRange document param.FSharpSymbol.DeclarationLocation) + | _ -> + None + + let argRange = sprintf "|(arg #%d)" i, expr.GetDocumentRange().TextRange + match declRange with + | None -> [| argRange |] + | Some declRange -> [| argRange; sprintf "|(param #%d)" i, declRange |]) + |> Array.unzip + + let endText rangeIdx = endTexts.[rangeIdx] + + DocumentRangeUtil.DumpRanges(textControl.Document, ranges, (fun _ -> "|"), Func<_,_>(endText)).ToString() + |> writer.WriteLine + + writer.WriteLine("---------------------------------------------------------") + for i, arg in Seq.indexed args do + writer.Write(sprintf "(arg #%d) => " i) + let param = arg.MatchingParameter + if isNull param then writer.WriteLine("") else + writer.WriteLine(param.Element.ShortName)) |> ignore + + [] member x.``Attribute 01 - Multiple args``() = x.DoNamedTest() + [] member x.``Attribute 02 - Single arg - no parens``() = x.DoNamedTest() + [] member x.``Attribute 03 - Single arg - parens``() = x.DoNamedTest() + [] member x.``Attribute 04 - No args - no parens``() = x.DoNamedTest() + [] member x.``Attribute 05 - No args - parens``() = x.DoNamedTest() + + [] member x.``Compiled 01 - FSharpCore``() = x.DoNamedTest() + [] member x.``Compiled 02 - BCL``() = x.DoNamedTest() + + [] member x.``Constructor 01 - No args``() = x.DoNamedTest() + [] member x.``Constructor 02 - Single arg``() = x.DoNamedTest() + [] member x.``Constructor 03 - Multiple args``() = x.DoNamedTest() + + [] member x.``New 01 - Multiple args``() = x.DoNamedTest() + [] member x.``New 02 - No args - parens``() = x.DoNamedTest() + [] member x.``New 03 - Single arg - no paren``() = x.DoNamedTest() + [] member x.``New 04 - Single arg - parens``() = x.DoNamedTest() + + [] member x.``Extension BCL 01 - No args``() = x.DoNamedTest() + [] member x.``Extension BCL 02 - Single arg``() = x.DoNamedTest() + [] member x.``Extension BCL 03 - Tupled args``() = x.DoNamedTest() + + [] member x.``Extension BCL Direct 01 - No args``() = x.DoNamedTest() + [] member x.``Extension BCL Direct 02 - Single arg``() = x.DoNamedTest() + [] member x.``Extension BCL Direct 03 - Tupled args``() = x.DoNamedTest() + + [] member x.``Extension CSharp 01 - No args``() = x.DoNamedTest() + [] member x.``Extension CSharp 02 - Single arg``() = x.DoNamedTest() + [] member x.``Extension CSharp 03 - Tupled args``() = x.DoNamedTest() + + [] member x.``Extension CSharp Direct 01 - No args``() = x.DoNamedTest() + [] member x.``Extension CSharp Direct 02 - Single arg``() = x.DoNamedTest() + [] member x.``Extension CSharp Direct 03 - Tupled args``() = x.DoNamedTest() + + [] member x.``Extension FSharp 01 - No args``() = x.DoNamedTest() + [] member x.``Extension FSharp 02 - Single arg``() = x.DoNamedTest() + [] member x.``Extension FSharp 03 - Curried args``() = x.DoNamedTest() + [] member x.``Extension FSharp 04 - Tupled args``() = x.DoNamedTest() + + [] member x.``Generic 01 - Module``() = x.DoNamedTest() + [] member x.``Generic 02 - Static method``() = x.DoNamedTest() + + [] member x.``Misc 01 - No args``() = x.DoNamedTest() + [] member x.``Misc 02 - Too many args``() = x.DoNamedTest() + + [] member x.``Multiple 01 - Curried``() = x.DoNamedTest() + [] member x.``Multiple 02 - Tupled``() = x.DoNamedTest() + [] member x.``Multiple 03 - Curried fun in paren``() = x.DoNamedTest() + [] member x.``Multiple 04 - Curried arg in paren``() = x.DoNamedTest() + [] member x.``Multiple 05 - Tupled - too few``() = x.DoNamedTest() + [] member x.``Multiple 06 - Tupled - too many``() = x.DoNamedTest() + [] member x.``Multiple 07 - Curried - partial``() = x.DoNamedTest() + [] member x.``Multiple 08 - Curried - too many``() = x.DoNamedTest() + + [] member x.``Named arg 01 - BCL``() = x.DoNamedTest() + [] member x.``Named arg 02 - Partial``() = x.DoNamedTest() + [] member x.``Named arg 03 - Unordered``() = x.DoNamedTest() + [] member x.``Named arg 04 - Invalid name``() = x.DoNamedTest() + [] member x.``Named arg 05 - Boolean``() = x.DoNamedTest() + + [] member x.``Non IArgument 01 - Obj expression``() = x.DoNamedTest() + + [] member x.``Single 01 - Paren``() = x.DoNamedTest() + [] member x.``Single 02 - Space paren``() = x.DoNamedTest() + [] member x.``Single 03 - Bare``() = x.DoNamedTest() + + [] member x.``Tuple param 01 - Deconstructed``() = x.DoNamedTest() + [] member x.``Tuple param 02 - Variable tuple in arg``() = x.DoNamedTest() + [] member x.``Tuple param 03 - Param not deconstructed``() = x.DoNamedTest() + + [] member x.``Tuple param 04 - Mismatch - too few``() = x.DoNamedTest() + [] member x.``Tuple param 05 - Mismatch - too many``() = x.DoNamedTest() + + [] member x.``Unit 01 - Named``() = x.DoNamedTest() + [] member x.``Unit 02 - Unnamed``() = x.DoNamedTest() diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/Service/FSharpAssemblyAutoOpenTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/Service/FSharpAssemblyAutoOpenTest.fs index 212f56e1e7..3d205548c7 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/Service/FSharpAssemblyAutoOpenTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/Service/FSharpAssemblyAutoOpenTest.fs @@ -1,8 +1,8 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features open JetBrains.ProjectModel +open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Plugins.FSharp.Tests -open JetBrains.ReSharper.Plugins.FSharp.Util open JetBrains.ReSharper.Psi open JetBrains.ReSharper.Psi.Impl.Reflection2 open JetBrains.ReSharper.Psi.Modules diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/Service/FSharpCodeFormatterTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/Service/FSharpCodeFormatterTest.fs index 0598ee36aa..bd05851116 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/Service/FSharpCodeFormatterTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/Service/FSharpCodeFormatterTest.fs @@ -74,6 +74,9 @@ type FSharpCodeFormatterTest() = [] member x.``IfThenElse expr indent 02``() = x.DoNamedTest() [] member x.``IfThenElse expr indent 03 - Elif``() = x.DoNamedTest() + [] member x.``Match expr indent 01 - Expr at new line``() = x.DoNamedTest() + [] member x.``Match expr indent 02 - With at new line``() = x.DoNamedTest() + [] member x.``MatchClause expr indent 01``() = x.DoNamedTest() [] member x.``MatchClause expr indent 02 - TryWith``() = x.DoNamedTest() [] member x.``MatchClause expr indent 03 - TryWith - Clause on the same line``() = x.DoNamedTest() @@ -90,5 +93,15 @@ type FSharpCodeFormatterTest() = [] member x.``Enum declaration indent 01 - Correct indent``() = x.DoNamedTest() [] member x.``Union declaration indent 01 - Correct indent``() = x.DoNamedTest() + [] member x.``Union declaration indent 02 - Modifier``() = x.DoNamedTest() [] member x.``Type abbreviation declaration indent 01 - Correct indent``() = x.DoNamedTest() [] member x.``Module abbreviation declaration indent 01 - Correct indent``() = x.DoNamedTest() + + [] member x.``Match clauses alignment 01``() = x.DoNamedTest() + [] member x.``Union cases alignment 01``() = x.DoNamedTest() + [] member x.``Union cases alignment 02 - Modifier``() = x.DoNamedTest() + [] member x.``Union cases alignment 03 - Modifier and new line``() = x.DoNamedTest() + [] member x.``Enum cases alignment 01``() = x.DoNamedTest() + [] member x.``Sequential expr alignment 01 - No separators``() = x.DoNamedTest() + [] member x.``Sequential expr alignment 02 - Separators``() = x.DoNamedTest() + [] member x.``Binary expr alignment 01``() = x.DoNamedTest() diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/Service/FSharpElementFactoryTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/Service/FSharpElementFactoryTest.fs index 922cfd31b4..68c01d4730 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/Service/FSharpElementFactoryTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/Service/FSharpElementFactoryTest.fs @@ -8,7 +8,7 @@ open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Plugins.FSharp.Psi.Parsing -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Tests open JetBrains.ReSharper.TestFramework open JetBrains.ReSharper.Resources.Shell open NUnit.Framework @@ -22,7 +22,7 @@ type FSharpElementFactoryTest() = member x.DoTest(action: IFSharpElementFactory -> unit) = testAction <- action - x.DoTestSolution() + x.DoTestSolution Array.empty override x.DoTest(_, project: IProject) = let psiModule = project.GetPsiModules().Single() diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/Service/FSharpNamingTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/Service/FSharpNamingTest.fs index b620580e2e..5698b80a38 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/Service/FSharpNamingTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/Service/FSharpNamingTest.fs @@ -3,7 +3,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features open JetBrains.ReSharper.Feature.Services.Refactorings.Specific.Rename open JetBrains.ReSharper.Feature.Services.Util open JetBrains.ReSharper.Psi.Tree -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Tests open JetBrains.ReSharper.Psi open JetBrains.ReSharper.Psi.Naming.Extentions open JetBrains.ReSharper.Psi.Naming.Impl diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/Service/IsFSharpAssemblyTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/Service/IsFSharpAssemblyTest.fs index 0ba8389ab1..b22b77c697 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/Service/IsFSharpAssemblyTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/Service/IsFSharpAssemblyTest.fs @@ -1,8 +1,8 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features open JetBrains.ProjectModel -open JetBrains.ReSharper.Plugins.FSharp.Util -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Tests +open JetBrains.ReSharper.Plugins.FSharp.Util.FSharpAssemblyUtil open JetBrains.ReSharper.Psi.Modules open JetBrains.ReSharper.TestFramework open NUnit.Framework diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/Service/NameResolutionTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/Service/NameResolutionTest.fs index 529458335b..982c5f5264 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/Service/NameResolutionTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/Service/NameResolutionTest.fs @@ -4,7 +4,7 @@ open FSharp.Compiler.SourceCodeServices open JetBrains.Application.Components open JetBrains.Diagnostics open JetBrains.ReSharper.Plugins.FSharp.Checker -open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Tests open JetBrains.ReSharper.Psi open JetBrains.ReSharper.TestFramework open NUnit.Framework diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/Stubs.fs b/ReSharper.FSharp/test/src/FSharp.Tests/Stubs.fs index 1c0323d4dd..cba8b8f026 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/Stubs.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/Stubs.fs @@ -2,7 +2,10 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Tests open JetBrains.Application open JetBrains.Application.Components +open JetBrains.Lifetimes open JetBrains.ProjectModel +open JetBrains.ReSharper.Plugins.FSharp +open JetBrains.ReSharper.Plugins.FSharp.Checker open JetBrains.ReSharper.Plugins.FSharp.ProjectModel open JetBrains.ReSharper.Plugins.FSharp.ProjectModel.Scripts open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Fsi @@ -18,3 +21,14 @@ type FSharpFileServiceStub() = interface IFSharpFileService with member x.IsScratchFile(_) = false member x.IsScriptLike(_) = false + +[] +type TestFcsReactorMonitor(lifetime: Lifetime, checkerService: FSharpCheckerService) as this = + do + checkerService.FcsReactorMonitor <- this + lifetime.OnTermination(fun () -> + checkerService.FcsReactorMonitor <- Unchecked.defaultof<_>) |> ignore + + interface IHideImplementation + interface IFcsReactorMonitor with + member x.MonitorOperation opName = MonitoredReactorOperation.empty opName diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/TestWithTwoProjectsBase.fs b/ReSharper.FSharp/test/src/FSharp.Tests/TestWithTwoProjectsBase.fs index b698031240..81f03e25b0 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/TestWithTwoProjectsBase.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/TestWithTwoProjectsBase.fs @@ -24,11 +24,11 @@ type TestWithTwoProjectsBase() = override x.ProjectName = base.ProjectName + ".MainProject" member x.SecondProject = x.Solution.GetProjectByName(x.SecondProjectName) - member x.SecondProjectName = base.ProjectName + "SecondProject" + override x.SecondProjectName = base.ProjectName + "SecondProject" abstract DoTest: mainProject: IProject * secondProject: IProject -> unit - override x.DoTest(lifetime: Lifetime, project: IProject) = + override x.DoTest(_: Lifetime, project: IProject) = x.AddProjectReference(project) x.DoTest(project, x.SecondProject) @@ -42,7 +42,7 @@ type TestWithTwoProjectsBase() = let targetFrameworkId = x.GetTargetFrameworkId() x.CreateProjectDescriptor(targetFrameworkId, name, [| filePath |], libs, guid) - override x.DoTestSolution([] names: string[]) = + override x.DoTestSolution([] _names: string[]) = let baseFilePath = x.TestDataPath / x.TestName let mainFile = baseFilePath.ChangeExtension(x.MainFileExtension) let secondFile = baseFilePath.ChangeExtension(x.SecondFileExtension) diff --git a/rider-fsharp/build.gradle.kts b/rider-fsharp/build.gradle.kts index 284e79aeb0..5afc8e3da7 100644 --- a/rider-fsharp/build.gradle.kts +++ b/rider-fsharp/build.gradle.kts @@ -43,7 +43,7 @@ java { } -val baseVersion = "2020.1" +val baseVersion = "2020.2" val buildCounter = ext.properties["build.number"] ?: "9999" version = "$baseVersion.$buildCounter" diff --git a/rider-fsharp/protocol/src/kotlin/model/RdFSharpModel.kt b/rider-fsharp/protocol/src/kotlin/model/RdFSharpModel.kt index da06944c50..9b0bfd1ebf 100644 --- a/rider-fsharp/protocol/src/kotlin/model/RdFSharpModel.kt +++ b/rider-fsharp/protocol/src/kotlin/model/RdFSharpModel.kt @@ -22,14 +22,24 @@ object RdFSharpModel : Ext(SolutionModel.Solution) { field("fixArgsForAttach", bool) }) call("getProjectReferences", int, immutableList(string)) + field("fsiTools", aggregatedef("RdFSharpInteractiveTools") { + call("prepareCommands", structdef("RdFsiPrepareCommandsArgs") { + field("firstCommandIndex", int) + field("commands", immutableList(string)) + }, immutableList(string)) + }) property("moveCaretOnSendLine", bool).readonly property("moveCaretOnSendSelection", bool).readonly property("copyRecentToEditor", bool).readonly } - private val RdFSharpCompilerServiceHost = aggregatedef("RdFSharpCompilerServiceHost") { + private val RdFcsHost = aggregatedef("RdFcsHost") { sink("fileChecked", string).async sink("projectChecked", string).async + sink("fcsProjectInvalidated", structdef("RdFcsProject") { + field("projectName", string) + field("targetFramework", string) + }) call("getLastModificationStamp", string, dateTime) call("getSourceCache", string, structdef("RdFSharpSource") { field("source", string) @@ -40,8 +50,9 @@ object RdFSharpModel : Ext(SolutionModel.Solution) { init { field("fSharpInteractiveHost", RdFSharpInteractiveHost) - field("fSharpCompilerServiceHost", RdFSharpCompilerServiceHost) + field("fcsHost", RdFcsHost) property("enableExperimentalFeatures", bool) property("enableFormatter", bool) + property("fcsBusyDelayMs", int) } } diff --git a/rider-fsharp/src/main/java/com/jetbrains/rider/ideaInterop/fileTypes/fsharp/lexer/_FSharpLexer.flex b/rider-fsharp/src/main/java/com/jetbrains/rider/ideaInterop/fileTypes/fsharp/lexer/_FSharpLexer.flex index 525a3d885c..d5bbc76fdc 100644 --- a/rider-fsharp/src/main/java/com/jetbrains/rider/ideaInterop/fileTypes/fsharp/lexer/_FSharpLexer.flex +++ b/rider-fsharp/src/main/java/com/jetbrains/rider/ideaInterop/fileTypes/fsharp/lexer/_FSharpLexer.flex @@ -243,7 +243,7 @@ HEXGRAPH_SHORT=\\x{HEXDIGIT}{HEXDIGIT} UNICODEGRAPH_SHORT=\\u{HEXDIGIT}{HEXDIGIT}{HEXDIGIT}{HEXDIGIT} UNICODEGRAPH_LONG=\\U{HEXDIGIT}{HEXDIGIT}{HEXDIGIT}{HEXDIGIT}{HEXDIGIT}{HEXDIGIT}{HEXDIGIT}{HEXDIGIT} TRIGRAPH=\\{DIGIT}{DIGIT}{DIGIT} -CHARACTER=({SIMPLE_CHARACTER}|{ESCAPE_CHAR}|{TRIGRAPH}|{UNICODEGRAPH_SHORT}|{HEXGRAPH_SHORT}|{UNICODEGRAPH_LONG}|\") +CHARACTER=({SIMPLE_CHARACTER}|{ESCAPE_CHAR}|{TRIGRAPH}|{UNICODEGRAPH_SHORT}|{HEXGRAPH_SHORT}|{UNICODEGRAPH_LONG}|\"|\') STRING_CHAR=({SIMPLE_STRING_CHAR}|{ESCAPE_CHAR}|{NON_ESCAPE_CHARS}|{TRIGRAPH}|{UNICODEGRAPH_SHORT}|{UNICODEGRAPH_LONG}|\') CHARACTER_LITERAL=(\'{CHARACTER}\') UNFINISHED_STRING=(\"({STRING_CHAR})*) diff --git a/rider-fsharp/src/main/java/com/jetbrains/rider/plugins/fsharp/FSharpHost.kt b/rider-fsharp/src/main/java/com/jetbrains/rider/plugins/fsharp/FSharpHost.kt index 32c357f1c2..b970379be9 100644 --- a/rider-fsharp/src/main/java/com/jetbrains/rider/plugins/fsharp/FSharpHost.kt +++ b/rider-fsharp/src/main/java/com/jetbrains/rider/plugins/fsharp/FSharpHost.kt @@ -15,19 +15,21 @@ class FSharpHost(project: Project) : LifetimedProjectComponent(project) { companion object { const val experimentalFeaturesRegistryKey = "rider.fsharp.experimental" const val formatterRegistryKey = "rider.fsharp.formatter" + const val fcsBusyDelayRegistryKey = "rider.fsharp.fcsBusyDelay.ms" } init { - initRegistryValue(experimentalFeaturesRegistryKey, fSharpModel.enableExperimentalFeatures) - initRegistryValue(formatterRegistryKey, fSharpModel.enableFormatter) + initRegistryValue(experimentalFeaturesRegistryKey, RegistryValue::asBoolean, fSharpModel.enableExperimentalFeatures) + initRegistryValue(formatterRegistryKey, RegistryValue::asBoolean, fSharpModel.enableFormatter) + initRegistryValue(fcsBusyDelayRegistryKey, RegistryValue::asInteger, fSharpModel.fcsBusyDelayMs) } - private fun initRegistryValue(registryKey: String, property: IOptProperty) { + private fun initRegistryValue(registryKey: String, registryToValue: (registryValue: RegistryValue) -> T, property: IOptProperty) { val registryValue = Registry.get(registryKey) - property.set(registryValue.asBoolean()) + property.set(registryToValue(registryValue)) registryValue.addListener(object : RegistryValueListener.Adapter() { override fun afterValueChanged(value: RegistryValue) { - property.set(value.asBoolean()) + property.set(registryToValue(value)) } }, project) } diff --git a/rider-fsharp/src/main/java/com/jetbrains/rider/plugins/fsharp/logs/FSharpLogTraceScenarios.kt b/rider-fsharp/src/main/java/com/jetbrains/rider/plugins/fsharp/logs/FSharpLogTraceScenarios.kt new file mode 100644 index 0000000000..6853c60962 --- /dev/null +++ b/rider-fsharp/src/main/java/com/jetbrains/rider/plugins/fsharp/logs/FSharpLogTraceScenarios.kt @@ -0,0 +1,9 @@ +package com.jetbrains.rider.plugins.fsharp.logs + +import com.jetbrains.rdclient.diagnostics.LogTraceScenario + +object FSharpLogTraceScenarios { + object FcsReactorMonitor : LogTraceScenario( + "JetBrains.ReSharper.Plugins.FSharp.FcsReactorMonitor" + ) +} diff --git a/rider-fsharp/src/main/java/com/jetbrains/rider/plugins/fsharp/projectView/FSharpMoveProviderExtension.kt b/rider-fsharp/src/main/java/com/jetbrains/rider/plugins/fsharp/projectView/FSharpMoveProviderExtension.kt index 2134b96886..5e84b132b6 100644 --- a/rider-fsharp/src/main/java/com/jetbrains/rider/plugins/fsharp/projectView/FSharpMoveProviderExtension.kt +++ b/rider-fsharp/src/main/java/com/jetbrains/rider/plugins/fsharp/projectView/FSharpMoveProviderExtension.kt @@ -10,6 +10,29 @@ import com.jetbrains.rider.util.idea.application class FSharpMoveProviderExtension(project: Project) : MoveProviderExtension(project) { + private fun ProjectModelNode.prevSibling() = getSibling { index -> index - 1 } + private fun ProjectModelNode.nextSibling() = getSibling { index -> index + 1 } + + private fun ProjectModelNode.getSibling(indexFunc: (Int) -> Int): ProjectModelNode? { + val parent = parent ?: return null + val siblings = parent.getSortedChildren() + val index = siblings.indexOf(this) + val newIndex = indexFunc(index) + if (newIndex < 0 || newIndex > siblings.count() - 1) + return null + return siblings[newIndex] + } + + private fun ProjectModelNode.getSortedChildren(performExpand: Boolean = true): List { + val comparator = Comparator { p0, p1 -> + if (p0 == null && p1 == null) return@Comparator 0 + if (p0 == null) return@Comparator 1 + if (p1 == null) return@Comparator -1 + compareNodes(p0, p1) + } + return getChildren(performExpand = performExpand).sortedWith(comparator) + } + companion object { const val CompileBeforeType: String = "CompileBefore" const val CompileAfterType: String = "CompileAfter" diff --git a/rider-fsharp/src/main/java/com/jetbrains/rider/plugins/fsharp/services/completion/FSharpCompletionStrategy.kt b/rider-fsharp/src/main/java/com/jetbrains/rider/plugins/fsharp/services/completion/FSharpCompletionStrategy.kt index 716a4a419c..e80a591aba 100644 --- a/rider-fsharp/src/main/java/com/jetbrains/rider/plugins/fsharp/services/completion/FSharpCompletionStrategy.kt +++ b/rider-fsharp/src/main/java/com/jetbrains/rider/plugins/fsharp/services/completion/FSharpCompletionStrategy.kt @@ -3,10 +3,13 @@ package com.jetbrains.rider.plugins.fsharp.services.completion import com.intellij.codeInsight.completion.CompletionType import com.intellij.openapi.editor.Editor import com.intellij.psi.PsiFile -import com.jetbrains.rider.completion.ICompletionSessionStrategy +import com.jetbrains.rdclient.completion.CompletionSessionHeuristics +import com.jetbrains.rdclient.completion.ICompletionSessionStrategy class FSharpCompletionStrategy : ICompletionSessionStrategy { override fun shouldForbidCompletion(editor: Editor, type: CompletionType) = editor.selectionModel.hasSelection() - override fun shouldRescheduleCompletion(prefix: String, psiFile: PsiFile, char: Char, offset: Int) = - prefix.isEmpty() -} \ No newline at end of file + + override fun shouldRescheduleCompletion(prefix: String, psiFile: PsiFile, char: Char?, offset: Int) = + prefix.isEmpty() || + CompletionSessionHeuristics.getInstance(psiFile.project).shouldRescheduleDefaultStrategy(char) +} diff --git a/rider-fsharp/src/main/java/com/jetbrains/rider/plugins/fsharp/services/fsi/FsiConsoleRunner.kt b/rider-fsharp/src/main/java/com/jetbrains/rider/plugins/fsharp/services/fsi/FsiConsoleRunner.kt index b23c0ad3d1..4fd3714e29 100644 --- a/rider-fsharp/src/main/java/com/jetbrains/rider/plugins/fsharp/services/fsi/FsiConsoleRunner.kt +++ b/rider-fsharp/src/main/java/com/jetbrains/rider/plugins/fsharp/services/fsi/FsiConsoleRunner.kt @@ -1,6 +1,5 @@ package com.jetbrains.rider.plugins.fsharp.services.fsi -import com.intellij.execution.ExecutionManager import com.intellij.execution.Executor import com.intellij.execution.configurations.GeneralCommandLine import com.intellij.execution.console.LanguageConsoleBuilder @@ -23,11 +22,10 @@ import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.editor.colors.EditorColors import com.intellij.openapi.editor.ex.util.EditorUtil import com.intellij.openapi.extensions.Extensions -import com.intellij.openapi.fileTypes.PlainTextLanguage import com.intellij.openapi.options.ShowSettingsUtil import com.intellij.openapi.project.Project -import com.intellij.openapi.util.Key import com.intellij.openapi.util.UserDataHolderBase +import com.intellij.openapi.util.text.StringUtil import com.intellij.openapi.vfs.VfsUtil import com.intellij.openapi.wm.ToolWindowManager import com.intellij.project.isDirectoryBased @@ -38,12 +36,11 @@ import com.intellij.xdebugger.attach.LocalAttachHost import com.intellij.xdebugger.attach.XAttachDebuggerProvider import com.jetbrains.rdclient.util.idea.pumpMessages import com.jetbrains.rider.debugger.DotNetDebugProcess -import com.jetbrains.rider.model.RdFsiRuntime -import com.jetbrains.rider.model.RdFsiSessionInfo +import com.jetbrains.rider.ideaInterop.fileTypes.fsharp.FSharpScriptLanguage +import com.jetbrains.rider.model.* import com.jetbrains.rider.plugins.fsharp.FSharpIcons import com.jetbrains.rider.runtime.RiderDotNetActiveRuntimeHost import com.jetbrains.rider.runtime.mono.MonoRuntime -import com.jetbrains.rider.util.idea.application import com.jetbrains.rider.util.idea.getComponent import org.jetbrains.concurrency.AsyncPromise import org.jetbrains.concurrency.Promise @@ -53,6 +50,7 @@ import java.time.Duration import javax.swing.BorderFactory import javax.swing.event.HyperlinkEvent import kotlin.properties.Delegates +import com.jetbrains.rd.platform.util.application class FsiConsoleRunner(sessionInfo: RdFsiSessionInfo, val fsiHost: FsiHost, debug: Boolean) : AbstractConsoleRunnerWithHistory(fsiHost.project, fsiTitle, null) { @@ -162,8 +160,10 @@ class FsiConsoleRunner(sessionInfo: RdFsiSessionInfo, val fsiHost: FsiHost, debu ToolWindowManager.getInstance(project).getToolWindow(executor.id)?.show(null) val stream = processHandler.processInput ?: error("Broken Fsi stream") - stream.write(fsiText.toByteArray(Charsets.UTF_8)) - stream.flush() + if(!StringUtil.isEmptyOrSpaces(visibleText)) { + stream.write(fsiText.toByteArray(Charsets.UTF_8)) + stream.flush() + } } } @@ -237,28 +237,32 @@ class FsiConsoleRunner(sessionInfo: RdFsiSessionInfo, val fsiHost: FsiHost, debu } override fun createConsoleView(): LanguageConsoleView { - val consoleView = LanguageConsoleBuilder().gutterContentProvider(inputSeparatorGutterContentProvider).build(project, PlainTextLanguage.INSTANCE) + var createdConsoleView : LanguageConsoleView? = null + + withGenericSandBoxing(genericFSharpSandboxInfoWithCustomParams("", false, emptyList()), project) { + val consoleView = LanguageConsoleBuilder().gutterContentProvider(inputSeparatorGutterContentProvider).build(project, FSharpScriptLanguage) - val consoleEditorBorder = BorderFactory.createMatteBorder( - 2, 0, 0, 0, consoleView.consoleEditor.colorsScheme.getColor(EditorColors.INDENT_GUIDE_COLOR)) - consoleView.consoleEditor.component.border = consoleEditorBorder + val consoleEditorBorder = BorderFactory.createMatteBorder( + 2, 0, 0, 0, consoleView.consoleEditor.colorsScheme.getColor(EditorColors.INDENT_GUIDE_COLOR)) + consoleView.consoleEditor.component.border = consoleEditorBorder - val historyKeyListener = HistoryKeyListener(fsiHost.project, consoleView.consoleEditor, commandHistory) - consoleView.consoleEditor.contentComponent.addKeyListener(historyKeyListener) - commandHistory.listeners.add(historyKeyListener) + val historyKeyListener = HistoryKeyListener(fsiHost.project, consoleView.consoleEditor, commandHistory) + consoleView.consoleEditor.contentComponent.addKeyListener(historyKeyListener) + commandHistory.listeners.add(historyKeyListener) + + createdConsoleView = consoleView + } - return consoleView + return createdConsoleView ?: error("Cannot create fsi") } override fun createProcessHandler(process: Process): OSProcessHandler { - return object : OSProcessHandler(process, cmdLine.commandLineString, Charsets.UTF_8) { - override fun isSilentlyDestroyOnClose(): Boolean = true + val fsiProcessHandler = FsiProcessHandler(process, cmdLine.commandLineString) - override fun notifyTextAvailable(text: String, outputType: Key<*>) { - if (text != "SERVER-PROMPT>\n") - super.notifyTextAvailable(text, outputType) - } - } + val sandboxInfoUpdater = FsiSandboxInfoUpdater(fsiHost.project, consoleView.consoleEditor, commandHistory) + fsiProcessHandler.addSandboxInfoUpdater(sandboxInfoUpdater) + + return fsiProcessHandler } private class ResetFsiAction(private val host: FsiHost) : AnAction("Reset F# Interactive", null, AllIcons.Actions.Restart) { diff --git a/rider-fsharp/src/main/java/com/jetbrains/rider/plugins/fsharp/services/fsi/FsiProcessHandler.kt b/rider-fsharp/src/main/java/com/jetbrains/rider/plugins/fsharp/services/fsi/FsiProcessHandler.kt new file mode 100644 index 0000000000..fe2744cdf9 --- /dev/null +++ b/rider-fsharp/src/main/java/com/jetbrains/rider/plugins/fsharp/services/fsi/FsiProcessHandler.kt @@ -0,0 +1,27 @@ +package com.jetbrains.rider.plugins.fsharp.services.fsi + +import com.intellij.execution.process.OSProcessHandler +import com.intellij.openapi.util.Key +import java.nio.charset.Charset + +class FsiProcessHandler ( + process: Process, commandLine: String?) : OSProcessHandler(process, commandLine, Charsets.UTF_8) { + + private val sandboxInfoUpdaters = mutableListOf() + + override fun isSilentlyDestroyOnClose(): Boolean = true + + override fun notifyTextAvailable(text: String, outputType: Key<*>) { + if (text != "SERVER-PROMPT>\n") + super.notifyTextAvailable(text, outputType) + else + sandboxInfoUpdaters.forEach{it.onOutputEnd()} + } + + fun addSandboxInfoUpdater (sandboxInfoUpdater: FsiSandboxInfoUpdater) { + addProcessListener(sandboxInfoUpdater.fsiProcessOutputListener) + + sandboxInfoUpdaters.add(sandboxInfoUpdater) + } + +} \ No newline at end of file diff --git a/rider-fsharp/src/main/java/com/jetbrains/rider/plugins/fsharp/services/fsi/FsiSandboxInfoUpdater.kt b/rider-fsharp/src/main/java/com/jetbrains/rider/plugins/fsharp/services/fsi/FsiSandboxInfoUpdater.kt new file mode 100644 index 0000000000..02c1839eb0 --- /dev/null +++ b/rider-fsharp/src/main/java/com/jetbrains/rider/plugins/fsharp/services/fsi/FsiSandboxInfoUpdater.kt @@ -0,0 +1,147 @@ +package com.jetbrains.rider.plugins.fsharp.services.fsi + +import com.intellij.execution.process.ProcessAdapter +import com.intellij.execution.process.ProcessEvent +import com.intellij.execution.process.ProcessOutputTypes +import com.intellij.openapi.editor.event.EditorFactoryEvent +import com.intellij.openapi.editor.event.EditorFactoryListener +import com.intellij.openapi.editor.ex.EditorEx +import com.intellij.openapi.project.Project +import com.intellij.openapi.util.Key +import com.jetbrains.rdclient.editors.FrontendTextControlHost +import com.jetbrains.rdclient.editors.sandboxes.SandboxManager +import com.jetbrains.rd.platform.util.application +import com.jetbrains.rd.util.lifetime.Lifetime +import com.jetbrains.rd.util.lifetime.LifetimeDefinition +import com.jetbrains.rdclient.lang.toRdLanguageOrThrow +import com.jetbrains.rdclient.util.idea.fromOffset +import com.jetbrains.rider.editors.RiderTextControlHost +import com.jetbrains.rider.ideaInterop.fileTypes.fsharp.FSharpScriptLanguage +import com.jetbrains.rider.model.* +import com.jetbrains.rider.projectView.solution +import org.jetbrains.concurrency.AsyncPromise + +class FsiSandboxInfoUpdater( + private val project: Project, private val consoleEditor: EditorEx, private val history: CommandHistory) { + + private val rdFsiTools = project.solution.rdFSharpModel.fSharpInteractiveHost.fsiTools; + + private val lockObject = Object() + + private var processLifetimeDefinition : LifetimeDefinition? = null + private var processLifetime : Lifetime? = null + + val fsiProcessOutputListener = FsiSandboxInfoUpdaterProcessOutputListener(this) + + private var verifiedCommandNumber = 0 + private val preparedCommands = mutableListOf() + private val correctCommandNumbers = mutableListOf() + + private fun updateSandboxInfo() { + application.invokeLater { + val sandboxManager = SandboxManager.getInstance() + if (sandboxManager.getSandboxInfo(consoleEditor) == null) return@invokeLater + + val startUnpreparedCommandIndex = preparedCommands.size + val endUnpreparedCommandIndex = correctCommandNumbers.size + + val unpreparedCommands = mutableListOf() + for (i in correctCommandNumbers.subList(startUnpreparedCommandIndex, endUnpreparedCommandIndex)) { + unpreparedCommands.add(history.entries[i - 1].visibleText) + } + + synchronized(lockObject) + { + if (processLifetime == null) return@invokeLater + + val result = AsyncPromise>() + rdFsiTools.prepareCommands.start(RdFsiPrepareCommandsArgs(startUnpreparedCommandIndex, unpreparedCommands)).result.advise(processLifetime!!) { + result.setResult(it.unwrap()) + } + + result.onSuccess {preparedAdditionalCommands -> + preparedCommands.addAll(preparedAdditionalCommands) + + val sandboxInfo = genericFSharpSandboxInfoWithCustomParams( + preparedCommands.joinToString(separator= "").replace("\r\n", "\n"), + false, + emptyList() + ) + + sandboxManager.markAsSandbox(consoleEditor, sandboxInfo) + FrontendTextControlHost.getInstance(project).rebindEditor(consoleEditor) + } + } + } + } + + fun onOutputEnd() { + if (fsiProcessOutputListener.lastOutputType != ProcessOutputTypes.SYSTEM) { + verifiedCommandNumber += 1 + if (fsiProcessOutputListener.lastOutputType == ProcessOutputTypes.STDOUT) { + correctCommandNumbers.add(verifiedCommandNumber) + + updateSandboxInfo() + } + } + + fsiProcessOutputListener.lastOutputType = ProcessOutputTypes.STDERR + } + + class FsiSandboxInfoUpdaterProcessOutputListener(private val fsiSandboxInfoUpdater: FsiSandboxInfoUpdater) : ProcessAdapter() { + var lastOutputType : Key<*> = ProcessOutputTypes.SYSTEM + + override fun onTextAvailable(event: ProcessEvent, outputType: Key<*>) { + if (outputType == ProcessOutputTypes.STDOUT && lastOutputType != ProcessOutputTypes.SYSTEM) + lastOutputType = ProcessOutputTypes.STDOUT + } + + override fun startNotified(event: ProcessEvent) { + fsiSandboxInfoUpdater.processLifetimeDefinition = LifetimeDefinition() + fsiSandboxInfoUpdater.processLifetime = fsiSandboxInfoUpdater.processLifetimeDefinition!!.lifetime + } + + override fun processTerminated(event: ProcessEvent) { + fsiSandboxInfoUpdater.processLifetimeDefinition!!.terminate() + } + } +} + +fun withGenericSandBoxing(sandboxInfo: SandboxInfo, project: Project, block: () -> Unit) { + application.assertIsDispatchThread() + + val textControlHost = RiderTextControlHost.getInstance(project) + + var localInfo : SandboxInfo? = sandboxInfo + Lifetime.using { lt -> + textControlHost.addPrioritizedEditorFactoryListener(lt, object: EditorFactoryListener { + override fun editorReleased(event: EditorFactoryEvent) { + } + + override fun editorCreated(event: EditorFactoryEvent) { + if(localInfo != null) + SandboxManager.getInstance().markAsSandbox(event.editor, sandboxInfo) + } + }) + + block() + localInfo = null + } +} + +fun genericFSharpSandboxInfoWithCustomParams(additionalText: String = "", isNonUserCode: Boolean = false, disableTypingAssists : List): SandboxInfo { + return SandboxInfo( + null, + additionalText, + RdTextRange.fromOffset(additionalText.length), + isNonUserCode, + ExtraInfo(emptyList(), emptyList()), + emptyList(), + true, + emptyList(), + FSharpScriptLanguage.toRdLanguageOrThrow(), + addSemicolon = false, + disableTypingActions = true, + disableTypingAssists = disableTypingAssists + ) +} diff --git a/rider-fsharp/src/main/resources/META-INF/plugin.xml b/rider-fsharp/src/main/resources/META-INF/plugin.xml index ea2e238d9e..bc59934249 100644 --- a/rider-fsharp/src/main/resources/META-INF/plugin.xml +++ b/rider-fsharp/src/main/resources/META-INF/plugin.xml @@ -28,7 +28,6 @@ - @@ -85,6 +84,9 @@ + + + diff --git a/rider-fsharp/src/test/kotlin/FSharpCompletionTest.kt b/rider-fsharp/src/test/kotlin/FSharpCompletionTest.kt index 87a940c4cd..a2a62f5310 100644 --- a/rider-fsharp/src/test/kotlin/FSharpCompletionTest.kt +++ b/rider-fsharp/src/test/kotlin/FSharpCompletionTest.kt @@ -21,7 +21,7 @@ class FSharpCompletionTest : CompletionTestBase() { override fun getSolutionDirectoryName() = "CoreConsoleApp" override val restoreNuGetPackages = true - private val rdFcsHost get() = project.solution.rdFSharpModel.fSharpCompilerServiceHost + private val rdFcsHost get() = project.solution.rdFSharpModel.fcsHost private var isFcsReady = false @Test(enabled = false) diff --git a/rider-fsharp/src/test/kotlin/FileSystemShimTest.kt b/rider-fsharp/src/test/kotlin/FileSystemShimTest.kt index b3a910e51a..b9530d1b42 100644 --- a/rider-fsharp/src/test/kotlin/FileSystemShimTest.kt +++ b/rider-fsharp/src/test/kotlin/FileSystemShimTest.kt @@ -1,5 +1,4 @@ import com.intellij.openapi.vfs.LocalFileSystem -import com.jetbrains.rider.model.RdFSharpCompilerServiceHost import com.jetbrains.rider.model.rdFSharpModel import com.jetbrains.rider.projectView.solution import com.jetbrains.rider.test.asserts.shouldNotBeNull @@ -7,6 +6,7 @@ import com.jetbrains.rider.test.base.BaseTestWithSolution import com.jetbrains.rider.test.scriptingApi.changeFileContent import com.jetbrains.rider.util.idea.lifetime import com.jetbrains.rdclient.util.idea.waitAndPump +import com.jetbrains.rider.model.RdFcsHost import com.jetbrains.rider.test.annotations.TestEnvironment import com.jetbrains.rider.test.enums.CoreVersion import org.testng.annotations.Test @@ -18,8 +18,8 @@ import java.time.Duration class FileSystemShimTest : BaseTestWithSolution() { override fun getSolutionDirectoryName() = "CoreConsoleApp" - private val fcsHost: RdFSharpCompilerServiceHost - get() = project.solution.rdFSharpModel.fSharpCompilerServiceHost + private val fcsHost: RdFcsHost + get() = project.solution.rdFSharpModel.fcsHost @Test fun externalFileChange() { diff --git a/rider-fsharp/src/test/kotlin/lexer/FSharpLexerTest.kt b/rider-fsharp/src/test/kotlin/lexer/FSharpLexerTest.kt index 4e08ecbf1b..cc4f92c67b 100644 --- a/rider-fsharp/src/test/kotlin/lexer/FSharpLexerTest.kt +++ b/rider-fsharp/src/test/kotlin/lexer/FSharpLexerTest.kt @@ -1179,4 +1179,9 @@ class FSharpLexerTest : LexerTestCase() { """.trimMargin() ) } + + @Test + fun testCharQuote() { + doTest("'''", "CHARACTER_LITERAL (''''')") + } } diff --git a/rider-fsharp/src/test/kotlin/projectModel/FSharpProjectModelTest.kt b/rider-fsharp/src/test/kotlin/projectModel/FSharpProjectModelTest.kt index b93066de24..26f89e3987 100644 --- a/rider-fsharp/src/test/kotlin/projectModel/FSharpProjectModelTest.kt +++ b/rider-fsharp/src/test/kotlin/projectModel/FSharpProjectModelTest.kt @@ -1,4 +1,4 @@ -import com.jetbrains.rider.model.RdFSharpCompilerServiceHost +import com.jetbrains.rider.model.RdFcsHost import com.jetbrains.rider.model.rdFSharpModel import com.jetbrains.rider.projectView.moveProviders.impl.ActionOrderType import com.jetbrains.rider.projectView.solution @@ -7,9 +7,9 @@ import com.jetbrains.rider.test.base.ProjectModelBaseTest import com.jetbrains.rider.test.enums.ToolsetVersion import com.jetbrains.rider.test.framework.TestProjectModelContext import com.jetbrains.rider.test.framework.waitBackend -import com.jetbrains.rider.test.scriptingApi.cutItem2 -import com.jetbrains.rider.test.scriptingApi.pasteItem2 -import com.jetbrains.rider.test.scriptingApi.renameItem2 +import com.jetbrains.rider.test.scriptingApi.cutItem +import com.jetbrains.rider.test.scriptingApi.pasteItem +import com.jetbrains.rider.test.scriptingApi.renameItem import org.testng.annotations.Test @Test @@ -18,14 +18,14 @@ class FSharpProjectModelTest : ProjectModelBaseTest() { override val restoreNuGetPackages: Boolean get() = true - private val fcsHost: RdFSharpCompilerServiceHost - get() = project.solution.rdFSharpModel.fSharpCompilerServiceHost + private val fcsHost: RdFcsHost + get() = project.solution.rdFSharpModel.fcsHost private fun moveItem(from: Array>, to: Array, orderType: ActionOrderType? = null) { // Wait for updating/refreshing items possibly queued by FSharpItemsContainerRefresher. waitBackend(project) { - cutItem2(project, from) - pasteItem2(project, to, orderType = orderType) + cutItem(project, from) + pasteItem(project, to, orderType = orderType) } } @@ -36,7 +36,7 @@ class FSharpProjectModelTest : ProjectModelBaseTest() { private fun renameItem(path: Array, newName: String) { // Wait for updating/refreshing items possibly queued by FSharpItemsContainerRefresher. waitBackend(project) { - renameItem2(project, path, newName) + renameItem(project, path, newName) } } diff --git a/rider-fsharp/src/test/kotlin/projectModel/FcsProjectProviderTest.kt b/rider-fsharp/src/test/kotlin/projectModel/FcsProjectProviderTest.kt new file mode 100644 index 0000000000..4ebceb4887 --- /dev/null +++ b/rider-fsharp/src/test/kotlin/projectModel/FcsProjectProviderTest.kt @@ -0,0 +1,81 @@ +package projectModel + +import com.intellij.testFramework.ProjectViewTestUtil +import com.jetbrains.rdclient.testFramework.waitForDaemon +import com.jetbrains.rdclient.testFramework.waitForNextDaemon +import com.jetbrains.rider.daemon.util.hasErrors +import com.jetbrains.rider.test.annotations.TestEnvironment +import com.jetbrains.rider.test.base.BaseTestWithSolution +import com.jetbrains.rider.test.enums.CoreVersion +import com.jetbrains.rider.test.framework.assertAllProjectsWereLoaded +import com.jetbrains.rider.test.scriptingApi.* +import org.testng.annotations.BeforeMethod +import org.testng.annotations.Test +import java.time.Duration + +@Test +@TestEnvironment(coreVersion = CoreVersion.DEFAULT) +class FcsProjectProviderTest : BaseTestWithSolution() { + override fun getSolutionDirectoryName() = throw Exception("Solutions are set in tests below") + + @BeforeMethod(alwaysRun = true) + fun setUpTestCaseProjectModel() { + ProjectViewTestUtil.setupImpl(project, true) + } + + @Test + @TestEnvironment(solution = "ProjectReferencesFSharp") + fun projectReferencesFSharp() { + assertAllProjectsWereLoaded(project) + withOpenedEditor(project, "ReferenceFrom/Library.fs") { + waitForDaemon() + assert(markupAdapter.hasErrors) + } + + addReference(project, arrayOf("ProjectReferencesFSharp", "ReferenceFrom"), "") + withOpenedEditor(project, "ReferenceFrom/Library.fs") { + waitForDaemon() + assert(!markupAdapter.hasErrors) + } + + deleteElement(project, arrayOf("ProjectReferencesFSharp", "ReferenceFrom", "Dependencies", ".NETStandard 2.0", "Projects", "ReferenceTo/1.0.0")) + withOpenedEditor(project, "ReferenceFrom/Library.fs") { + waitForDaemon() + assert(markupAdapter.hasErrors) + } + } + + @Test + @TestEnvironment(solution = "ProjectReferencesCSharp") + fun projectReferencesCSharp() { + assertAllProjectsWereLoaded(project) + withOpenedEditor(project, "FSharpProject/Library.fs") { + waitForDaemon() + assert(markupAdapter.hasErrors) + } + + addReference(project, arrayOf("ProjectReferencesCSharp", "FSharpProject"), "") + withOpenedEditor(project, "FSharpProject/Library.fs") { + waitForDaemon() + assert(markupAdapter.hasErrors) + } + + buildSolutionWithReSharperBuild() + withOpenedEditor(project, "FSharpProject/Library.fs") { + waitForNextDaemon(Duration.ofSeconds(5)) + assert(!markupAdapter.hasErrors) + } + + deleteElement(project, arrayOf("ProjectReferencesFSharp", "FSharpProject", "Dependencies", ".NETStandard 2.0", "Projects", "CSharpProject/1.0.0")) + withOpenedEditor(project, "FSharpProject/Library.fs") { + waitForDaemon() + assert(markupAdapter.hasErrors) + } + + addReference(project, arrayOf("ProjectReferencesCSharp", "FSharpProject"), "") + withOpenedEditor(project, "FSharpProject/Library.fs") { + waitForDaemon() + assert(!markupAdapter.hasErrors) + } + } +} diff --git a/rider-fsharp/testData/solutions/ProjectReferencesCSharp/CSharpProject/CSharpProject.csproj b/rider-fsharp/testData/solutions/ProjectReferencesCSharp/CSharpProject/CSharpProject.csproj new file mode 100644 index 0000000000..8830c75b5a --- /dev/null +++ b/rider-fsharp/testData/solutions/ProjectReferencesCSharp/CSharpProject/CSharpProject.csproj @@ -0,0 +1,5 @@ + + + netstandard2.0 + + diff --git a/rider-fsharp/testData/solutions/ProjectReferencesCSharp/CSharpProject/Class1.cs b/rider-fsharp/testData/solutions/ProjectReferencesCSharp/CSharpProject/Class1.cs new file mode 100644 index 0000000000..50abb07c3e --- /dev/null +++ b/rider-fsharp/testData/solutions/ProjectReferencesCSharp/CSharpProject/Class1.cs @@ -0,0 +1,9 @@ +using System; + +namespace CSharpProject +{ + public class CSharpClass + { + public static readonly int Prop = 123; + } +} \ No newline at end of file diff --git a/rider-fsharp/testData/solutions/ProjectReferencesCSharp/FSharpProject/FSharpProject.fsproj b/rider-fsharp/testData/solutions/ProjectReferencesCSharp/FSharpProject/FSharpProject.fsproj new file mode 100644 index 0000000000..d032934089 --- /dev/null +++ b/rider-fsharp/testData/solutions/ProjectReferencesCSharp/FSharpProject/FSharpProject.fsproj @@ -0,0 +1,10 @@ + + + netstandard2.0 + + + + + + + diff --git a/rider-fsharp/testData/solutions/ProjectReferencesCSharp/FSharpProject/Library.fs b/rider-fsharp/testData/solutions/ProjectReferencesCSharp/FSharpProject/Library.fs new file mode 100644 index 0000000000..759c1f8754 --- /dev/null +++ b/rider-fsharp/testData/solutions/ProjectReferencesCSharp/FSharpProject/Library.fs @@ -0,0 +1,3 @@ +module FSharpProject + +let x = CSharpProject.CSharpClass.Prop diff --git a/rider-fsharp/testData/solutions/ProjectReferencesCSharp/ProjectReferencesCSharp.sln b/rider-fsharp/testData/solutions/ProjectReferencesCSharp/ProjectReferencesCSharp.sln new file mode 100644 index 0000000000..c8d3f99320 --- /dev/null +++ b/rider-fsharp/testData/solutions/ProjectReferencesCSharp/ProjectReferencesCSharp.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharpProject", "FSharpProject\FSharpProject.fsproj", "{4BA886C2-36C0-433A-9666-62F329B733A8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSharpProject", "CSharpProject\CSharpProject.csproj", "{A06023C0-76C5-4611-80C7-1A7CF3D938EF}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4BA886C2-36C0-433A-9666-62F329B733A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4BA886C2-36C0-433A-9666-62F329B733A8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4BA886C2-36C0-433A-9666-62F329B733A8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4BA886C2-36C0-433A-9666-62F329B733A8}.Release|Any CPU.Build.0 = Release|Any CPU + {A06023C0-76C5-4611-80C7-1A7CF3D938EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A06023C0-76C5-4611-80C7-1A7CF3D938EF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A06023C0-76C5-4611-80C7-1A7CF3D938EF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A06023C0-76C5-4611-80C7-1A7CF3D938EF}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/rider-fsharp/testData/solutions/ProjectReferencesFSharp/ProjectReferencesFSharp.sln b/rider-fsharp/testData/solutions/ProjectReferencesFSharp/ProjectReferencesFSharp.sln new file mode 100644 index 0000000000..2c269bc8df --- /dev/null +++ b/rider-fsharp/testData/solutions/ProjectReferencesFSharp/ProjectReferencesFSharp.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "ReferenceFrom", "ReferenceFrom\ReferenceFrom.fsproj", "{8F2A67B4-1AB9-465B-B575-6B4DC8BE55D0}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "ReferenceTo", "ReferenceTo\ReferenceTo.fsproj", "{2B6207FF-DF04-41F0-919C-2896EA2F771D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8F2A67B4-1AB9-465B-B575-6B4DC8BE55D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8F2A67B4-1AB9-465B-B575-6B4DC8BE55D0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8F2A67B4-1AB9-465B-B575-6B4DC8BE55D0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8F2A67B4-1AB9-465B-B575-6B4DC8BE55D0}.Release|Any CPU.Build.0 = Release|Any CPU + {2B6207FF-DF04-41F0-919C-2896EA2F771D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2B6207FF-DF04-41F0-919C-2896EA2F771D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2B6207FF-DF04-41F0-919C-2896EA2F771D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2B6207FF-DF04-41F0-919C-2896EA2F771D}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/rider-fsharp/testData/solutions/ProjectReferencesFSharp/ReferenceFrom/Library.fs b/rider-fsharp/testData/solutions/ProjectReferencesFSharp/ReferenceFrom/Library.fs new file mode 100644 index 0000000000..5552e40bd3 --- /dev/null +++ b/rider-fsharp/testData/solutions/ProjectReferencesFSharp/ReferenceFrom/Library.fs @@ -0,0 +1,3 @@ +module ReferenceFrom + +let x = ReferenceTo.x diff --git a/rider-fsharp/testData/solutions/ProjectReferencesFSharp/ReferenceFrom/ReferenceFrom.fsproj b/rider-fsharp/testData/solutions/ProjectReferencesFSharp/ReferenceFrom/ReferenceFrom.fsproj new file mode 100644 index 0000000000..4f7062e5d5 --- /dev/null +++ b/rider-fsharp/testData/solutions/ProjectReferencesFSharp/ReferenceFrom/ReferenceFrom.fsproj @@ -0,0 +1,9 @@ + + + netstandard2.0 + + + + + + diff --git a/rider-fsharp/testData/solutions/ProjectReferencesFSharp/ReferenceTo/Library.fs b/rider-fsharp/testData/solutions/ProjectReferencesFSharp/ReferenceTo/Library.fs new file mode 100644 index 0000000000..ee776afd23 --- /dev/null +++ b/rider-fsharp/testData/solutions/ProjectReferencesFSharp/ReferenceTo/Library.fs @@ -0,0 +1,3 @@ +module ReferenceTo + +let x = 123 diff --git a/rider-fsharp/testData/solutions/ProjectReferencesFSharp/ReferenceTo/ReferenceTo.fsproj b/rider-fsharp/testData/solutions/ProjectReferencesFSharp/ReferenceTo/ReferenceTo.fsproj new file mode 100644 index 0000000000..8fc16ed643 --- /dev/null +++ b/rider-fsharp/testData/solutions/ProjectReferencesFSharp/ReferenceTo/ReferenceTo.fsproj @@ -0,0 +1,9 @@ + + + netstandard2.0 + + + + + + diff --git a/rider-fsharp/testData/templates/FSharpTemplatesTestCore21/consoleAppCoreTemplate/gold/consoleAppCoreTemplate_debug_win.gold b/rider-fsharp/testData/templates/FSharpTemplatesTestCore21/consoleAppCoreTemplate/gold/consoleAppCoreTemplate_debug_win.gold index 501a2436f6..b5f223e430 100644 --- a/rider-fsharp/testData/templates/FSharpTemplatesTestCore21/consoleAppCoreTemplate/gold/consoleAppCoreTemplate_debug_win.gold +++ b/rider-fsharp/testData/templates/FSharpTemplatesTestCore21/consoleAppCoreTemplate/gold/consoleAppCoreTemplate_debug_win.gold @@ -1,4 +1,4 @@ --> Program.fs:7(93,123) // printfn "Hello World from F#!" Program.main() in , ConsoleApplication.dll - argv = Count = 0: string[] + argv = string[0]: string[]