feat: per-package server options (#2858)
This PR adds per-package server options to resolve #2455. It is based on the previous work in #2456, but takes a different approach: options are loaded for the specific file in the file worker when `print-paths` is called, instead of loading them in the watchdog with a separate Lake command. This change addresses review comments made in #2456. In doing so, it introduces two new Lake config fields: - `leanOptions`: `-D` flag options that are passed to both the language server and `lean` when building. - `moreServerOptions`: `-D` flag options that are passed to the language server. Since `print-paths` must also accept a file path to compute the options for that file, this PR is changing the API for `print-paths`. As there have been numerous complaints about the name `print-paths`, I also decided to change it to `setup-file` in this PR, since it would break compatibility with the old Lake API anyways. This PR deprecates the Lakefile field `moreServerArgs` in favor of `moreGlobalServerArgs`, as suggested in the review for #2456. Fixes #2455 --------- Co-authored-by: digama0 <mcarneir@andrew.cmu.edu>
This commit is contained in:
parent
5639302989
commit
7ff7cf9b5a
85 changed files with 780 additions and 516 deletions
|
|
@ -10,7 +10,7 @@ function pebkac() {
|
|||
[[ $# -gt 0 ]] || pebkac
|
||||
case $1 in
|
||||
--version)
|
||||
# minimum version for `lake server` with fallback
|
||||
# minimum version for `lake serve` with fallback
|
||||
echo 3.1.0
|
||||
;;
|
||||
print-paths)
|
||||
|
|
|
|||
|
|
@ -190,6 +190,16 @@ def subsetAux : List (Name × DataValue) → KVMap → Bool
|
|||
def subset : KVMap → KVMap → Bool
|
||||
| ⟨m₁⟩, m₂ => subsetAux m₁ m₂
|
||||
|
||||
def mergeBy (mergeFn : Name → DataValue → DataValue → DataValue) (l r : KVMap)
|
||||
: KVMap := Id.run do
|
||||
let mut result := l
|
||||
for ⟨k, vᵣ⟩ in r do
|
||||
if let some vₗ := result.find k then
|
||||
result := result.insert k (mergeFn k vₗ vᵣ)
|
||||
else
|
||||
result := result.insert k vᵣ
|
||||
return result
|
||||
|
||||
def eqv (m₁ m₂ : KVMap) : Bool :=
|
||||
subset m₁ m₂ && subset m₂ m₁
|
||||
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ import Lean.Environment
|
|||
import Lean.Data.Lsp
|
||||
import Lean.Data.Json.FromToJson
|
||||
|
||||
import Lean.Util.Paths
|
||||
import Lean.Util.FileSetupInfo
|
||||
import Lean.LoadDynlib
|
||||
|
||||
import Lean.Server.Utils
|
||||
|
|
@ -22,6 +22,7 @@ import Lean.Server.References
|
|||
import Lean.Server.FileWorker.Utils
|
||||
import Lean.Server.FileWorker.RequestHandling
|
||||
import Lean.Server.FileWorker.WidgetRequests
|
||||
import Lean.Server.FileWorker.SetupFile
|
||||
import Lean.Server.Rpc.Basic
|
||||
import Lean.Widget.InteractiveDiagnostic
|
||||
import Lean.Server.ImportCompletion
|
||||
|
|
@ -163,84 +164,16 @@ abbrev WorkerM := ReaderT WorkerContext <| StateRefT WorkerState IO
|
|||
|
||||
/- Worker initialization sequence. -/
|
||||
section Initialization
|
||||
|
||||
structure LakePrintPathsResult where
|
||||
spawnArgs : Process.SpawnArgs
|
||||
exitCode : UInt32
|
||||
stdout : String
|
||||
stderr : String
|
||||
|
||||
partial def runLakePrintPaths (lakePath : System.FilePath) (m : DocumentMeta) (imports : Array Import) (hOut : FS.Stream) : IO LakePrintPathsResult := do
|
||||
let mut args := #["print-paths"] ++ imports.map (toString ·.module)
|
||||
if m.dependencyBuildMode matches .never then
|
||||
args := args.push "--no-build"
|
||||
let spawnArgs : Process.SpawnArgs := {
|
||||
stdin := Process.Stdio.null
|
||||
stdout := Process.Stdio.piped
|
||||
stderr := Process.Stdio.piped
|
||||
cmd := lakePath.toString
|
||||
args
|
||||
}
|
||||
let lakeProc ← Process.spawn spawnArgs
|
||||
-- progress notification: reports latest stderr line
|
||||
let rec processStderr (acc : String) : IO String := do
|
||||
let line ← lakeProc.stderr.getLine
|
||||
if line == "" then
|
||||
return acc
|
||||
else
|
||||
publishDiagnostics m #[{ range := ⟨⟨0, 0⟩, ⟨0, 0⟩⟩, severity? := DiagnosticSeverity.information, message := line }] hOut
|
||||
processStderr (acc ++ line)
|
||||
let stderr ← IO.asTask (processStderr "") Task.Priority.dedicated
|
||||
let stdout := String.trim (← lakeProc.stdout.readToEnd)
|
||||
let stderr ← IO.ofExcept stderr.get
|
||||
let exitCode ← lakeProc.wait
|
||||
return ⟨spawnArgs, exitCode, stdout, stderr⟩
|
||||
|
||||
/-- Uses `lake print-paths` to compile dependencies on the fly and adds them to `LEAN_PATH`.
|
||||
Compilation progress is reported to `hOut` via LSP notifications. Returns the search path for
|
||||
source files. -/
|
||||
partial def lakeSetupSearchPath (lakePath : System.FilePath) (m : DocumentMeta) (imports : Array Import) (hOut : FS.Stream) : IO SearchPath := do
|
||||
let result ← runLakePrintPaths lakePath m imports hOut
|
||||
let cmdStr := " ".intercalate (toString result.spawnArgs.cmd :: result.spawnArgs.args.toList)
|
||||
match result.exitCode with
|
||||
| 0 =>
|
||||
let Except.ok (paths : LeanPaths) ← pure (Json.parse result.stdout >>= fromJson?)
|
||||
| throwServerError s!"invalid output from `{cmdStr}`:\n{result.stdout}\nstderr:\n{result.stderr}"
|
||||
initSearchPath (← getBuildDir) paths.oleanPath
|
||||
paths.loadDynlibPaths.forM loadDynlib
|
||||
paths.srcPath.mapM realPathNormalized
|
||||
| 2 => pure [] -- no lakefile.lean
|
||||
-- error from `--no-build`
|
||||
| 3 => throwServerError s!"Imports are out of date and must be rebuilt; use the \"Restart File\" command in your editor.\n\n{result.stdout}"
|
||||
| _ => throwServerError s!"`{cmdStr}` failed:\n{result.stdout}\nstderr:\n{result.stderr}"
|
||||
|
||||
def setupSrcSearchPath (m : DocumentMeta) (hOut : FS.Stream) (headerStx : Syntax) : IO SearchPath := do
|
||||
let some path := System.Uri.fileUriToPath? m.uri
|
||||
| return ← initSrcSearchPath
|
||||
|
||||
-- NOTE: we assume for now that `lakefile.lean` does not have any non-core-Lean deps
|
||||
-- NOTE: lake does not exist in stage 0 (yet?)
|
||||
if path.fileName == "lakefile.lean" then
|
||||
return ← initSrcSearchPath
|
||||
|
||||
let lakePath ← determineLakePath
|
||||
if !(← System.FilePath.pathExists lakePath) then
|
||||
return ← initSrcSearchPath
|
||||
|
||||
let imports := Lean.Elab.headerToImports headerStx
|
||||
let pkgSearchPath ← lakeSetupSearchPath lakePath m imports hOut
|
||||
return ← initSrcSearchPath pkgSearchPath
|
||||
|
||||
def buildHeaderEnv (m : DocumentMeta) (hOut : FS.Stream) (opts : Options) (headerStx : Syntax) : IO (Environment × MessageLog × SearchPath) := do
|
||||
let (headerEnv, msgLog, srcSearchPath) ←
|
||||
match ← EIO.toIO' <| setupSrcSearchPath m hOut headerStx with
|
||||
| .ok srcSearchPath =>
|
||||
def buildHeaderEnv (m : DocumentMeta) (headerStx : Syntax) (fileSetupResult : FileSetupResult) : IO (Environment × MessageLog) := do
|
||||
let (headerEnv, msgLog) ←
|
||||
match fileSetupResult.kind with
|
||||
| .success | .noLakefile =>
|
||||
-- allows `headerEnv` to be leaked, which would live until the end of the process anyway
|
||||
let (headerEnv, msgLog) ← Elab.processHeader (leakEnv := true) headerStx opts MessageLog.empty m.mkInputContext
|
||||
pure (headerEnv, msgLog, srcSearchPath)
|
||||
| .error e =>
|
||||
let msgs := MessageLog.empty.add { fileName := "<ignored>", pos := ⟨0, 0⟩, data := e.toString }
|
||||
pure (← mkEmptyEnvironment, msgs, ← initSrcSearchPath)
|
||||
Elab.processHeader (leakEnv := true) headerStx fileSetupResult.fileOptions MessageLog.empty m.mkInputContext
|
||||
| .importsOutOfDate =>
|
||||
mkErrorEnvironment "Imports are out of date and must be rebuilt; use the \"Restart File\" command in your editor."
|
||||
| .error msg =>
|
||||
mkErrorEnvironment msg
|
||||
|
||||
let mut headerEnv := headerEnv
|
||||
try
|
||||
|
|
@ -249,7 +182,12 @@ section Initialization
|
|||
catch _ =>
|
||||
pure ()
|
||||
|
||||
return (headerEnv, msgLog, srcSearchPath)
|
||||
return (headerEnv, msgLog)
|
||||
|
||||
where
|
||||
mkErrorEnvironment (errorMsg : String) : IO (Environment × MessageLog) := do
|
||||
let msgs := MessageLog.empty.add { fileName := "<ignored>", pos := ⟨0, 0⟩, data := errorMsg }
|
||||
return (← mkEmptyEnvironment, msgs)
|
||||
|
||||
def buildCommandState
|
||||
(m : DocumentMeta)
|
||||
|
|
@ -276,24 +214,33 @@ section Initialization
|
|||
}
|
||||
{ Elab.Command.mkState headerEnv headerMsgLog opts with infoState := headerInfoState }
|
||||
|
||||
def compileHeader (m : DocumentMeta) (hOut : FS.Stream) (opts : Options) (hasWidgets : Bool)
|
||||
def compileHeader (m : DocumentMeta) (hOut : FS.Stream) (globalOptions : Options) (hasWidgets : Bool)
|
||||
: IO (Syntax × Task (Except Error (Snapshot × SearchPath))) := do
|
||||
-- parsing should not take long, do synchronously
|
||||
let (headerStx, headerParserState, parseMsgLog) ← Parser.parseHeader m.mkInputContext
|
||||
(headerStx, ·) <$> EIO.asTask do
|
||||
let (headerEnv, envMsgLog, srcSearchPath) ← buildHeaderEnv m hOut opts headerStx
|
||||
let imports := Lean.Elab.headerToImports headerStx
|
||||
let fileSetupResult ← setupFile m imports fun stderrLine =>
|
||||
let progressDiagnostic := {
|
||||
range := ⟨⟨0, 0⟩, ⟨0, 0⟩⟩
|
||||
severity? := DiagnosticSeverity.information
|
||||
message := stderrLine
|
||||
}
|
||||
publishDiagnostics m #[progressDiagnostic] hOut
|
||||
let fileSetupResult := fileSetupResult.addGlobalOptions globalOptions
|
||||
let (headerEnv, envMsgLog) ← buildHeaderEnv m headerStx fileSetupResult
|
||||
let headerMsgLog := parseMsgLog.append envMsgLog
|
||||
let cmdState := buildCommandState m headerStx headerEnv headerMsgLog opts
|
||||
let cmdState := buildCommandState m headerStx headerEnv headerMsgLog fileSetupResult.fileOptions
|
||||
let headerSnap := {
|
||||
beginPos := 0
|
||||
stx := headerStx
|
||||
mpState := headerParserState
|
||||
cmdState := cmdState
|
||||
beginPos := 0
|
||||
stx := headerStx
|
||||
mpState := headerParserState
|
||||
cmdState := cmdState
|
||||
interactiveDiags := ← cmdState.messages.msgs.mapM (Widget.msgToInteractiveDiagnostic m.text · hasWidgets)
|
||||
tacticCache := (← IO.mkRef {})
|
||||
tacticCache := (← IO.mkRef {})
|
||||
}
|
||||
publishDiagnostics m headerSnap.diagnostics.toArray hOut
|
||||
return (headerSnap, srcSearchPath)
|
||||
return (headerSnap, fileSetupResult.srcSearchPath)
|
||||
|
||||
def initializeWorker (meta : DocumentMeta) (i o e : FS.Stream) (initParams : InitializeParams) (opts : Options)
|
||||
: IO (WorkerContext × WorkerState) := do
|
||||
|
|
|
|||
128
src/Lean/Server/FileWorker/SetupFile.lean
Normal file
128
src/Lean/Server/FileWorker/SetupFile.lean
Normal file
|
|
@ -0,0 +1,128 @@
|
|||
/-
|
||||
Copyright (c) 2023 Lean FRO, LLC. All rights reserved.
|
||||
Released under Apache 2.0 license as described in the file LICENSE.
|
||||
Authors: Sebastian Ullrich, Marc Huisinga
|
||||
-/
|
||||
import Init.System.IO
|
||||
import Lean.Server.Utils
|
||||
import Lean.Util.FileSetupInfo
|
||||
import Lean.Util.LakePath
|
||||
import Lean.LoadDynlib
|
||||
|
||||
namespace Lean.Server.FileWorker
|
||||
|
||||
open IO
|
||||
|
||||
structure LakeSetupFileOutput where
|
||||
spawnArgs : Process.SpawnArgs
|
||||
exitCode : UInt32
|
||||
stdout : String
|
||||
stderr : String
|
||||
|
||||
partial def runLakeSetupFile
|
||||
(m : DocumentMeta)
|
||||
(lakePath filePath : System.FilePath)
|
||||
(imports : Array Import)
|
||||
(handleStderr : String → IO Unit)
|
||||
: IO LakeSetupFileOutput := do
|
||||
let mut args := #["setup-file", filePath.toString] ++ imports.map (toString ·.module)
|
||||
if m.dependencyBuildMode matches .never then
|
||||
args := args.push "--no-build"
|
||||
let spawnArgs : Process.SpawnArgs := {
|
||||
stdin := Process.Stdio.null
|
||||
stdout := Process.Stdio.piped
|
||||
stderr := Process.Stdio.piped
|
||||
cmd := lakePath.toString
|
||||
args
|
||||
}
|
||||
let lakeProc ← Process.spawn spawnArgs
|
||||
|
||||
let rec processStderr (acc : String) : IO String := do
|
||||
let line ← lakeProc.stderr.getLine
|
||||
if line == "" then
|
||||
return acc
|
||||
else
|
||||
handleStderr line
|
||||
processStderr (acc ++ line)
|
||||
let stderr ← IO.asTask (processStderr "") Task.Priority.dedicated
|
||||
|
||||
let stdout := String.trim (← lakeProc.stdout.readToEnd)
|
||||
let stderr ← IO.ofExcept stderr.get
|
||||
let exitCode ← lakeProc.wait
|
||||
return ⟨spawnArgs, exitCode, stdout, stderr⟩
|
||||
|
||||
inductive FileSetupResultKind where
|
||||
| success
|
||||
| noLakefile
|
||||
| importsOutOfDate
|
||||
| error (msg : String)
|
||||
|
||||
structure FileSetupResult where
|
||||
kind : FileSetupResultKind
|
||||
srcSearchPath : SearchPath
|
||||
fileOptions : Options
|
||||
|
||||
def FileSetupResult.ofSuccess (pkgSearchPath : SearchPath) (fileOptions : Options)
|
||||
: IO FileSetupResult := do return {
|
||||
kind := FileSetupResultKind.success
|
||||
srcSearchPath := ← initSrcSearchPath pkgSearchPath,
|
||||
fileOptions
|
||||
}
|
||||
|
||||
def FileSetupResult.ofNoLakefile : IO FileSetupResult := do return {
|
||||
kind := FileSetupResultKind.noLakefile
|
||||
srcSearchPath := ← initSrcSearchPath
|
||||
fileOptions := Options.empty
|
||||
}
|
||||
|
||||
def FileSetupResult.ofImportsOutOfDate : IO FileSetupResult := do return {
|
||||
kind := FileSetupResultKind.importsOutOfDate
|
||||
srcSearchPath := ← initSrcSearchPath
|
||||
fileOptions := Options.empty
|
||||
}
|
||||
|
||||
def FileSetupResult.ofError (msg : String) : IO FileSetupResult := do return {
|
||||
kind := FileSetupResultKind.error msg
|
||||
srcSearchPath := ← initSrcSearchPath
|
||||
fileOptions := Options.empty
|
||||
}
|
||||
|
||||
def FileSetupResult.addGlobalOptions (result : FileSetupResult) (globalOptions : Options)
|
||||
: FileSetupResult :=
|
||||
let fileOptions := globalOptions.mergeBy (fun _ _ fileOpt => fileOpt) result.fileOptions
|
||||
{ result with fileOptions := fileOptions }
|
||||
|
||||
/-- Uses `lake setup-file` to compile dependencies on the fly and add them to `LEAN_PATH`.
|
||||
Compilation progress is reported to `handleStderr`. Returns the search path for
|
||||
source files and the options for the file. -/
|
||||
partial def setupFile (m : DocumentMeta) (imports : Array Import) (handleStderr : String → IO Unit) : IO FileSetupResult := do
|
||||
let some filePath := System.Uri.fileUriToPath? m.uri
|
||||
| return ← FileSetupResult.ofNoLakefile -- untitled files have no lakefile
|
||||
|
||||
-- NOTE: we assume for now that `lakefile.lean` does not have any non-core-Lean deps
|
||||
-- NOTE: lake does not exist in stage 0 (yet?)
|
||||
if filePath.fileName == "lakefile.lean" then
|
||||
return ← FileSetupResult.ofNoLakefile -- the lakefile itself has no lakefile
|
||||
|
||||
let lakePath ← determineLakePath
|
||||
if !(← System.FilePath.pathExists lakePath) then
|
||||
return ← FileSetupResult.ofNoLakefile
|
||||
|
||||
let result ← runLakeSetupFile m lakePath filePath imports handleStderr
|
||||
|
||||
let cmdStr := " ".intercalate (toString result.spawnArgs.cmd :: result.spawnArgs.args.toList)
|
||||
|
||||
match result.exitCode with
|
||||
| 0 =>
|
||||
let Except.ok (info : FileSetupInfo) := Json.parse result.stdout >>= fromJson?
|
||||
| return ← FileSetupResult.ofError s!"Invalid output from `{cmdStr}`:\n{result.stdout}\nstderr:\n{result.stderr}"
|
||||
initSearchPath (← getBuildDir) info.paths.oleanPath
|
||||
info.paths.loadDynlibPaths.forM loadDynlib
|
||||
let pkgSearchPath ← info.paths.srcPath.mapM realPathNormalized
|
||||
FileSetupResult.ofSuccess pkgSearchPath info.setupOptions.toOptions
|
||||
| 2 => -- exit code for lake reporting that there is no lakefile
|
||||
FileSetupResult.ofNoLakefile
|
||||
| 3 => -- exit code for `--no-build`
|
||||
FileSetupResult.ofImportsOutOfDate
|
||||
| _ =>
|
||||
FileSetupResult.ofError s!"`{cmdStr}` failed:\n{result.stdout}\nstderr:\n{result.stderr}"
|
||||
|
|
@ -97,7 +97,7 @@ def collectAvailableImportsFromLake : IO (Option AvailableImports) := do
|
|||
let exitCode ← lakeProc.wait
|
||||
match exitCode with
|
||||
| 0 =>
|
||||
let Except.ok (availableImports : AvailableImports) ← pure (Json.parse stdout >>= fromJson?)
|
||||
let Except.ok (availableImports : AvailableImports) := Json.parse stdout >>= fromJson?
|
||||
| throw <| IO.userError s!"invalid output from `lake available-imports`:\n{stdout}"
|
||||
return availableImports
|
||||
| _ =>
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ Another important consideration is the *compacted region* memory used by importe
|
|||
|
||||
When the user has two or more files in a single dependency chain open, it is desirable for changes in imports to propagate to modules importing them. That is, when `B.lean` depends on `A.lean` and both are open, changes to `A` should eventually be observable in `B`. But a major problem with Lean 3 is how it does this much too eagerly. Often `B` will be recompiled needlessly as soon as `A` is opened, even if no changes have been made to `A`. For heavyweight modules which take up to several minutes to compile, this causes frustration when `A` is opened merely for inspection e.g. via go-to-definition.
|
||||
|
||||
In Lean 4, the situation is different as `.olean` artifacts are required to exist for all imported modules -- one cannot import a `.lean` file without compiling it first. In the running example, when a user opens and edits `A`, nothing is going to happen to `B`. They can continue to interact with it as if `A` kept its previous contents. But when `A` is saved with changes, users can then issue the "refresh file dependencies" command in their editor, which will restart the respective worker and use `lake print-paths` to rebuild and locate its dependencies. This being a conscious action, users will be aware of having to then wait for compilation.
|
||||
In Lean 4, the situation is different as `.olean` artifacts are required to exist for all imported modules -- one cannot import a `.lean` file without compiling it first. In the running example, when a user opens and edits `A`, nothing is going to happen to `B`. They can continue to interact with it as if `A` kept its previous contents. But when `A` is saved with changes, users can then issue the "refresh file dependencies" command in their editor, which will restart the respective worker and use `lake setup-file` to rebuild and locate its dependencies. This being a conscious action, users will be aware of having to then wait for compilation.
|
||||
|
||||
### Worker architecture
|
||||
|
||||
|
|
|
|||
|
|
@ -24,5 +24,5 @@ import Lean.Util.ReplaceLevel
|
|||
import Lean.Util.FoldConsts
|
||||
import Lean.Util.SCC
|
||||
import Lean.Util.OccursCheck
|
||||
import Lean.Util.Paths
|
||||
import Lean.Util.HasConstCache
|
||||
import Lean.Util.FileSetupInfo
|
||||
|
|
|
|||
14
src/Lean/Util/FileSetupInfo.lean
Normal file
14
src/Lean/Util/FileSetupInfo.lean
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
/-
|
||||
Copyright (c) 2023 Lean FRO, LLC. All rights reserved.
|
||||
Released under Apache 2.0 license as described in the file LICENSE.
|
||||
Authors: Marc Huisinga
|
||||
-/
|
||||
import Lean.Util.LeanOptions
|
||||
|
||||
/--
|
||||
Information shared between Lake and Lean when calling `lake setup-file`.
|
||||
-/
|
||||
structure Lean.FileSetupInfo where
|
||||
paths : LeanPaths
|
||||
setupOptions : LeanOptions
|
||||
deriving FromJson, ToJson
|
||||
92
src/Lean/Util/LeanOptions.lean
Normal file
92
src/Lean/Util/LeanOptions.lean
Normal file
|
|
@ -0,0 +1,92 @@
|
|||
/-
|
||||
Copyright (c) 2023 Lean FRO, LLC. All rights reserved.
|
||||
Released under Apache 2.0 license as described in the file LICENSE.
|
||||
Authors: Marc Huisinga
|
||||
-/
|
||||
import Lean.Util.Paths
|
||||
|
||||
namespace Lean
|
||||
|
||||
/-- Restriction of `DataValue` that covers exactly those cases that Lean is able to handle when passed via the `-D` flag. -/
|
||||
inductive LeanOptionValue where
|
||||
| ofString (s : String)
|
||||
| ofBool (b : Bool)
|
||||
| ofNat (n : Nat)
|
||||
deriving Inhabited, Repr
|
||||
|
||||
def LeanOptionValue.ofDataValue? : DataValue → Option LeanOptionValue
|
||||
| .ofString s => some (.ofString s)
|
||||
| .ofBool b => some (.ofBool b)
|
||||
| .ofNat n => some (.ofNat n)
|
||||
| _ => none
|
||||
|
||||
def LeanOptionValue.toDataValue : LeanOptionValue → DataValue
|
||||
| .ofString s => .ofString s
|
||||
| .ofBool b => .ofBool b
|
||||
| .ofNat n => .ofNat n
|
||||
|
||||
instance : KVMap.Value LeanOptionValue where
|
||||
toDataValue := LeanOptionValue.toDataValue
|
||||
ofDataValue? := LeanOptionValue.ofDataValue?
|
||||
|
||||
instance : Coe String LeanOptionValue where
|
||||
coe := LeanOptionValue.ofString
|
||||
|
||||
instance : Coe Bool LeanOptionValue where
|
||||
coe := LeanOptionValue.ofBool
|
||||
|
||||
instance : Coe Nat LeanOptionValue where
|
||||
coe := LeanOptionValue.ofNat
|
||||
|
||||
instance : FromJson LeanOptionValue where
|
||||
fromJson?
|
||||
| (s : String) => Except.ok s
|
||||
| (b : Bool) => Except.ok b
|
||||
| (n : Nat) => Except.ok n
|
||||
| _ => Except.error "invalid LeanOptionValue type"
|
||||
|
||||
instance : ToJson LeanOptionValue where
|
||||
toJson
|
||||
| (s : String) => s
|
||||
| (b : Bool) => b
|
||||
| (n : Nat) => n
|
||||
|
||||
/-- Formats the lean option value as a CLI flag argument. -/
|
||||
def LeanOptionValue.asCliFlagValue : (v : LeanOptionValue) → String
|
||||
| (s : String) => s!"\"{s}\""
|
||||
| (b : Bool) => toString b
|
||||
| (n : Nat) => toString n
|
||||
|
||||
/-- Options that are used by Lean as if they were passed using `-D`. -/
|
||||
structure LeanOptions where
|
||||
values : RBMap Name LeanOptionValue Name.cmp
|
||||
deriving Inhabited, Repr
|
||||
|
||||
def LeanOptions.toOptions (leanOptions : LeanOptions) : Options := Id.run do
|
||||
let mut options := KVMap.empty
|
||||
for ⟨name, optionValue⟩ in leanOptions.values do
|
||||
options := options.insert name optionValue.toDataValue
|
||||
return options
|
||||
|
||||
def LeanOptions.fromOptions? (options : Options) : Option LeanOptions := do
|
||||
let mut values := RBMap.empty
|
||||
for ⟨name, dataValue⟩ in options do
|
||||
let optionValue ← LeanOptionValue.ofDataValue? dataValue
|
||||
values := values.insert name optionValue
|
||||
return ⟨values⟩
|
||||
|
||||
instance : FromJson LeanOptions where
|
||||
fromJson?
|
||||
| Json.obj obj => do
|
||||
let values ← obj.foldM (init := RBMap.empty) fun acc k v => do
|
||||
let optionValue ← fromJson? v
|
||||
return acc.insert k.toName optionValue
|
||||
return ⟨values⟩
|
||||
| _ => Except.error "invalid LeanOptions type"
|
||||
|
||||
instance : ToJson LeanOptions where
|
||||
toJson options :=
|
||||
Json.obj <| options.values.fold (init := RBNode.leaf) fun acc k v =>
|
||||
acc.insert (cmp := compare) k.toString (toJson v)
|
||||
|
||||
end Lean
|
||||
|
|
@ -6,7 +6,7 @@ Authors: Mac Malone
|
|||
import Lake.Build.Index
|
||||
|
||||
/-!
|
||||
Definitions to support `lake print-paths` builds.
|
||||
Definitions to support `lake setup-file` builds.
|
||||
-/
|
||||
|
||||
open System
|
||||
|
|
@ -46,7 +46,7 @@ def recBuildImports (imports : Array Module)
|
|||
|
||||
/--
|
||||
Builds the workspace-local modules of list of imports.
|
||||
Used by `lake print-paths` to build modules for the Lean server.
|
||||
Used by `lake setup-file` to build modules for the Lean server.
|
||||
Returns the set of module dynlibs built (so they can be loaded by the server).
|
||||
|
||||
Builds only module `.olean` and `.ilean` files if the package is configured
|
||||
|
|
|
|||
|
|
@ -93,14 +93,11 @@ def mathConfigFileContents (pkgName libRoot : String) :=
|
|||
s!"import Lake
|
||||
open Lake DSL
|
||||
|
||||
def moreServerArgs := #[
|
||||
\"-Dpp.unicode.fun=true\", -- pretty-prints `fun a ↦ b`
|
||||
\"-Dpp.proofs.withType=false\"
|
||||
def leanOptions : Array LeanOption := #[
|
||||
⟨`pp.unicode.fun, true⟩, -- pretty-prints `fun a ↦ b`
|
||||
⟨`pp.proofs.withType, false⟩
|
||||
]
|
||||
|
||||
-- These settings only apply during `lake build`, but not in VSCode editor.
|
||||
def moreLeanArgs := moreServerArgs
|
||||
|
||||
-- These are additional settings which do not affect the lake hash,
|
||||
-- so they can be enabled in CI and disabled locally or vice versa.
|
||||
-- Warning: Do not put any options here that actually change the olean files,
|
||||
|
|
@ -112,7 +109,7 @@ def weakLeanArgs : Array String :=
|
|||
#[]
|
||||
|
||||
package {pkgName} where
|
||||
moreServerArgs := moreServerArgs
|
||||
leanOptions := leanOptions
|
||||
-- add any package configuration options here
|
||||
|
||||
require mathlib from git
|
||||
|
|
@ -120,7 +117,6 @@ require mathlib from git
|
|||
|
||||
@[default_target]
|
||||
lean_lib {libRoot} where
|
||||
moreLeanArgs := moreLeanArgs
|
||||
weakLeanArgs := weakLeanArgs
|
||||
-- add any library configuration options here
|
||||
"
|
||||
|
|
|
|||
|
|
@ -310,12 +310,14 @@ protected def upload : CliM PUnit := do
|
|||
noArgsRem do
|
||||
liftM <| uploadRelease ws.root tag |>.run (MonadLog.io opts.verbosity)
|
||||
|
||||
protected def printPaths : CliM PUnit := do
|
||||
protected def setupFile : CliM PUnit := do
|
||||
processOptions lakeOption
|
||||
let opts ← getThe LakeOptions
|
||||
let loadConfig ← mkLoadConfig opts
|
||||
let buildConfig := mkBuildConfig opts
|
||||
printPaths loadConfig (← takeArgs) buildConfig opts.verbosity
|
||||
let filePath ← takeArg "file path"
|
||||
let imports ← takeArgs
|
||||
setupFile loadConfig filePath imports buildConfig opts.verbosity
|
||||
|
||||
protected def clean : CliM PUnit := do
|
||||
processOptions lakeOption
|
||||
|
|
@ -389,7 +391,7 @@ def lakeCli : (cmd : String) → CliM PUnit
|
|||
| "update" | "upgrade" => lake.update
|
||||
| "resolve-deps" => lake.resolveDeps
|
||||
| "upload" => lake.upload
|
||||
| "print-paths" => lake.printPaths
|
||||
| "setup-file" => lake.setupFile
|
||||
| "clean" => lake.clean
|
||||
| "script" => lake.script
|
||||
| "scripts" => lake.script.list
|
||||
|
|
|
|||
|
|
@ -6,11 +6,12 @@ Authors: Mac Malone
|
|||
import Lake.Load
|
||||
import Lake.Build
|
||||
import Lake.Util.MainM
|
||||
import Lean.Util.FileSetupInfo
|
||||
|
||||
namespace Lake
|
||||
open Lean (Json toJson fromJson? LeanPaths)
|
||||
open Lean
|
||||
|
||||
/-- Exit code to return if `print-paths` cannot find the config file. -/
|
||||
/-- Exit code to return if `setup-file` cannot find the config file. -/
|
||||
def noConfigFileCode : ExitCode := 2
|
||||
|
||||
/--
|
||||
|
|
@ -20,13 +21,12 @@ and falls back to plain `lean --server`.
|
|||
def invalidConfigEnvVar := "LAKE_INVALID_CONFIG"
|
||||
|
||||
/--
|
||||
Build a list of imports of the package
|
||||
and print the `.olean` and source directories of every used package.
|
||||
Build a list of imports of a file and print the `.olean` and source directories of every used package, as well as the server options for the file.
|
||||
If no configuration file exists, exit silently with `noConfigFileCode` (i.e, 2).
|
||||
|
||||
The `print-paths` command is used internally by Lean 4 server.
|
||||
The `setup-file` command is used internally by Lean 4 server.
|
||||
-/
|
||||
def printPaths (loadConfig : LoadConfig) (imports : List String := [])
|
||||
def setupFile (loadConfig : LoadConfig) (path : FilePath) (imports : List String := [])
|
||||
(buildConfig : BuildConfig := {}) (verbosity : Verbosity := .normal) : MainM PUnit := do
|
||||
if (← loadConfig.configFile.pathExists) then
|
||||
if let some errLog := (← IO.getEnv invalidConfigEnvVar) then
|
||||
|
|
@ -36,12 +36,24 @@ def printPaths (loadConfig : LoadConfig) (imports : List String := [])
|
|||
let ws ← MainM.runLogIO (loadWorkspace loadConfig) verbosity
|
||||
let dynlibs ← ws.runBuild (buildImportsAndDeps imports) buildConfig
|
||||
|>.run (MonadLog.eio verbosity)
|
||||
IO.println <| Json.compress <| toJson {
|
||||
let paths : LeanPaths := {
|
||||
oleanPath := ws.leanPath
|
||||
srcPath := ws.leanSrcPath
|
||||
loadDynlibPaths := dynlibs
|
||||
: LeanPaths
|
||||
}
|
||||
let setupOptions : LeanOptions ← do
|
||||
let some moduleName ← searchModuleNameOfFileName path ws.leanSrcPath
|
||||
| pure ⟨∅⟩
|
||||
let some module := ws.findModule? moduleName
|
||||
| pure ⟨∅⟩
|
||||
let options := module.serverOptions.map fun opt => ⟨opt.name, opt.value⟩
|
||||
pure ⟨Lean.RBMap.fromArray options Lean.Name.cmp⟩
|
||||
IO.println <| Json.compress <| toJson {
|
||||
paths,
|
||||
setupOptions
|
||||
: FileSetupInfo
|
||||
}
|
||||
else
|
||||
exit noConfigFileCode
|
||||
|
||||
|
|
@ -55,7 +67,7 @@ def serve (config : LoadConfig) (args : Array String) : IO UInt32 := do
|
|||
IO.eprint log
|
||||
if let some ws := ws? then
|
||||
let ctx := mkLakeContext ws
|
||||
pure (← LakeT.run ctx getAugmentedEnv, ws.root.moreServerArgs)
|
||||
pure (← LakeT.run ctx getAugmentedEnv, ws.root.moreGlobalServerArgs)
|
||||
else
|
||||
IO.eprintln "warning: package configuration has errors, falling back to plain `lean --server`"
|
||||
pure (config.env.baseVars.push (invalidConfigEnvVar, log), #[])
|
||||
|
|
|
|||
|
|
@ -92,7 +92,7 @@ def leanPath (env : Env) : SearchPath :=
|
|||
|
||||
/--
|
||||
The Lean source search path of the environment (i.e., `LEAN_SRC_PATH`).
|
||||
Combines the initial path of the environment with that of the Lake abd Lean
|
||||
Combines the initial path of the environment with that of the Lake and Lean
|
||||
installations.
|
||||
-/
|
||||
def leanSrcPath (env : Env) : SearchPath :=
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
import Lean.Util.LeanOptions
|
||||
|
||||
/-
|
||||
Copyright (c) 2022 Mac Malone. All rights reserved.
|
||||
Released under Apache 2.0 license as described in the file LICENSE.
|
||||
|
|
@ -80,6 +82,16 @@ def BuildType.leancArgs : BuildType → Array String
|
|||
| minSizeRel => #["-Os", "-DNDEBUG"]
|
||||
| release => #["-O3", "-DNDEBUG"]
|
||||
|
||||
/-- Option that is used by Lean as if it was passed using `-D`. -/
|
||||
structure LeanOption where
|
||||
name : Lean.Name
|
||||
value : Lean.LeanOptionValue
|
||||
deriving Inhabited, Repr
|
||||
|
||||
/-- Formats the lean option as a CLI argument using the `-D` flag. -/
|
||||
def LeanOption.asCliArg (o : LeanOption) : String :=
|
||||
s!"-D{o.name}={o.value.asCliFlagValue}"
|
||||
|
||||
/-- Configuration options common to targets that build modules. -/
|
||||
structure LeanConfig where
|
||||
/--
|
||||
|
|
@ -88,6 +100,12 @@ structure LeanConfig where
|
|||
-/
|
||||
buildType : BuildType := .release
|
||||
/--
|
||||
Additional options to pass to both the Lean language server
|
||||
(i.e., `lean --server`) launched by `lake serve` and to `lean`
|
||||
when compiling a module's Lean source files.
|
||||
-/
|
||||
leanOptions : Array LeanOption := #[]
|
||||
/--
|
||||
Additional arguments to pass to `lean`
|
||||
when compiling a module's Lean source files.
|
||||
-/
|
||||
|
|
@ -110,6 +128,11 @@ structure LeanConfig where
|
|||
-/
|
||||
moreLeancArgs : Array String := #[]
|
||||
/--
|
||||
Additional options to pass to the Lean language server
|
||||
(i.e., `lean --server`) launched by `lake serve`.
|
||||
-/
|
||||
moreServerOptions : Array LeanOption := #[]
|
||||
/--
|
||||
Additional arguments to pass to `leanc`
|
||||
when compiling a module's C source files generated by `lean`.
|
||||
|
||||
|
|
|
|||
|
|
@ -87,6 +87,17 @@ Is true if either the package or the library have `precompileModules` set.
|
|||
@[inline] def nativeFacets (self : LeanLib) : Array (ModuleFacet (BuildJob FilePath)) :=
|
||||
self.config.nativeFacets
|
||||
|
||||
/--
|
||||
The arguments to pass to `lean --server` when running the Lean language server.
|
||||
`serverOptions` is the the accumulation of:
|
||||
- the package's `leanOptions`
|
||||
- the package's `moreServerOptions`
|
||||
- the library's `leanOptions`
|
||||
- the library's `moreServerOptions`
|
||||
-/
|
||||
@[inline] def serverOptions (self : LeanLib) : Array LeanOption :=
|
||||
self.pkg.moreServerOptions ++ self.config.leanOptions ++ self.config.moreServerOptions
|
||||
|
||||
/--
|
||||
The build type for modules of this library.
|
||||
That is, the minimum of package's `buildType` and the library's `buildType`.
|
||||
|
|
@ -101,12 +112,17 @@ then the default (which is C for now).
|
|||
-/
|
||||
@[inline] def backend (self : LeanLib) : Backend :=
|
||||
Backend.orPreferLeft self.config.backend self.pkg.backend
|
||||
|
||||
/--
|
||||
The arguments to pass to `lean` when compiling the library's Lean files.
|
||||
That is, the package's `moreLeanArgs` plus the library's `moreLeanArgs`.
|
||||
`leanArgs` is the accumulation of:
|
||||
- the package's `leanOptions`
|
||||
- the package's `moreLeanArgs`
|
||||
- the library's `leanOptions`
|
||||
- the library's `moreLeanArgs`
|
||||
-/
|
||||
@[inline] def leanArgs (self : LeanLib) : Array String :=
|
||||
self.pkg.moreLeanArgs ++ self.config.moreLeanArgs
|
||||
self.pkg.moreLeanArgs ++ self.config.leanOptions.map (·.asCliArg) ++ self.config.moreLeanArgs
|
||||
|
||||
/--
|
||||
The arguments to weakly pass to `lean` when compiling the library's Lean files.
|
||||
|
|
|
|||
|
|
@ -101,6 +101,9 @@ def dynlibSuffix := "-1"
|
|||
@[inline] def dynlibFile (self : Module) : FilePath :=
|
||||
self.pkg.nativeLibDir / nameToSharedLib self.dynlibName
|
||||
|
||||
@[inline] def serverOptions (self : Module) : Array LeanOption :=
|
||||
self.lib.serverOptions
|
||||
|
||||
@[inline] def buildType (self : Module) : BuildType :=
|
||||
self.lib.buildType
|
||||
|
||||
|
|
|
|||
|
|
@ -88,11 +88,20 @@ structure PackageConfig extends WorkspaceConfig, LeanConfig where
|
|||
precompileModules : Bool := false
|
||||
|
||||
/--
|
||||
**Deprecated in favor of `moreGlobalServerArgs`.**
|
||||
Additional arguments to pass to the Lean language server
|
||||
(i.e., `lean --server`) launched by `lake server`.
|
||||
(i.e., `lean --server`) launched by `lake serve`, both for this package and
|
||||
also for any packages browsed from this one in the same session.
|
||||
-/
|
||||
moreServerArgs : Array String := #[]
|
||||
|
||||
/--
|
||||
Additional arguments to pass to the Lean language server
|
||||
(i.e., `lean --server`) launched by `lake serve`, both for this package and
|
||||
also for any packages browsed from this one in the same session.
|
||||
-/
|
||||
moreGlobalServerArgs : Array String := moreServerArgs
|
||||
|
||||
/--
|
||||
The directory containing the package's Lean source files.
|
||||
Defaults to the package's directory.
|
||||
|
|
@ -310,9 +319,13 @@ namespace Package
|
|||
@[inline] def precompileModules (self : Package) : Bool :=
|
||||
self.config.precompileModules
|
||||
|
||||
/-- The package's `moreServerArgs` configuration. -/
|
||||
@[inline] def moreServerArgs (self : Package) : Array String :=
|
||||
self.config.moreServerArgs
|
||||
/-- The package's `moreGlobalServerArgs` configuration. -/
|
||||
@[inline] def moreGlobalServerArgs (self : Package) : Array String :=
|
||||
self.config.moreGlobalServerArgs
|
||||
|
||||
/-- The package's `moreServerOptions` configuration appended to its `leanOptions` configuration. -/
|
||||
@[inline] def moreServerOptions (self : Package) : Array LeanOption :=
|
||||
self.config.leanOptions ++ self.config.moreServerOptions
|
||||
|
||||
/-- The package's `buildType` configuration. -/
|
||||
@[inline] def buildType (self : Package) : BuildType :=
|
||||
|
|
@ -322,9 +335,13 @@ namespace Package
|
|||
@[inline] def backend (self : Package) : Backend :=
|
||||
self.config.backend
|
||||
|
||||
/-- The package's `moreLeanArgs` configuration. -/
|
||||
/-- The package's `leanOptions` configuration. -/
|
||||
@[inline] def leanOptions (self : Package) : Array LeanOption :=
|
||||
self.config.leanOptions
|
||||
|
||||
/-- The package's `moreLeanArgs` configuration appended to its `leanOptions` configuration. -/
|
||||
@[inline] def moreLeanArgs (self : Package) : Array String :=
|
||||
self.config.moreLeanArgs
|
||||
self.config.leanOptions.map (·.asCliArg) ++ self.config.moreLeanArgs
|
||||
|
||||
/-- The package's `weakLeanArgs` configuration. -/
|
||||
@[inline] def weakLeanArgs (self : Package) : Array String :=
|
||||
|
|
|
|||
|
|
@ -110,6 +110,8 @@ def Package.finalize (self : Package) (deps : Array Package) : LogIO Package :=
|
|||
-- Deprecation warnings
|
||||
unless self.config.manifestFile.isNone do
|
||||
logWarning s!"{self.name}: package configuration option `manifestFile` is deprecated"
|
||||
unless self.config.moreServerArgs.isEmpty do
|
||||
logWarning s!"{self.name}: package configuration option `moreServerArgs` is deprecated in favor of `moreServerOptions`"
|
||||
|
||||
-- Fill in the Package
|
||||
return {self with
|
||||
|
|
|
|||
|
|
@ -165,8 +165,10 @@ Lake provides a large assortment of configuration options for packages.
|
|||
|
||||
* `postUpdate?`: A post-`lake update` hook. The monadic action is run after a successful `lake update` execution on this package or one of its downstream dependents. Defaults to `none`. See the option's docstring for a complete example.
|
||||
* `precompileModules`: Whether to compile each module into a native shared library that is loaded whenever the module is imported. This speeds up the evaluation of metaprograms and enables the interpreter to run functions marked `@[extern]`. Defaults to `false`.
|
||||
* `moreServerArgs`: Additional arguments to pass to the Lean language server (i.e., `lean --server`) launched by `lake serve`.
|
||||
* `moreServerOptions`: An `Array` of additional options to pass to the Lean language server (i.e., `lean --server`) launched by `lake serve`.
|
||||
* `moreGlobalServerArgs`: An `Array` of additional arguments to pass to `lean --server` which apply both to this package and anything else in the same server session (e.g. when browsing other packages from the same session via go-to-definition)
|
||||
* `buildType`: The `BuildType` of targets in the package (see [`CMAKE_BUILD_TYPE`](https://stackoverflow.com/a/59314670)). One of `debug`, `relWithDebInfo`, `minSizeRel`, or `release`. Defaults to `release`.
|
||||
* `leanOptions`: Additional options to pass to both the Lean language server (i.e., `lean --server`) launched by `lake serve` and to `lean` while compiling Lean source files.
|
||||
* `moreLeanArgs`: An `Array` of additional arguments to pass to `lean` while compiling Lean source files.
|
||||
* `weakLeanArgs`: An `Array` of additional arguments to pass to `lean` while compiling Lean source files. Unlike `moreLeanArgs`, these arguments do not affect the trace of the build result, so they can be changed without triggering a rebuild. They come *before* `moreLeanArgs`.
|
||||
* `moreLeancArgs`: An `Array` of additional arguments to pass to `leanc` while compiling the C source files generated by `lean`. Lake already passes some flags based on the `buildType`, but you can change this by, for example, adding `-O0` and `-UNDEBUG`.
|
||||
|
|
@ -206,7 +208,7 @@ lean_lib «target-name» where
|
|||
* `extraDepTargets`: An `Array` of [target](#custom-targets) names to build before the library's modules.
|
||||
* `defaultFacets`: An `Array` of library facets to build on a bare `lake build` of the library. For example, setting this to `#[LeanLib.sharedLib]` will build the shared library facet.
|
||||
* `nativeFacets`: An `Array` of [module facets](#defining-new-facets) to build and combine into the library's static and shared libraries. Defaults to ``#[Module.oFacet]`` (i.e., the object file compiled from the Lean source).
|
||||
* `precompileModules`, `buildType`, `<more|weak><Lean|Leanc|Link>Args`: Augments the package's corresponding configuration option. The library's arguments come after, modules are precompiled if either the library or package are precompiled, and the build type is the minimum of the two (`debug` is the lowest, and `release` is the highest)
|
||||
* `precompileModules`, `buildType`, `leanOptions`, `<more|weak><Lean|Leanc|Link>Args`, `moreServerOptions`: Augments the package's corresponding configuration option. The library's arguments come after, modules are precompiled if either the library or package are precompiled, and the build type is the minimum of the two (`debug` is the lowest, and `release` is the highest)
|
||||
|
||||
### Binary Executables
|
||||
|
||||
|
|
@ -227,7 +229,7 @@ lean_exe «target-name» where
|
|||
* `extraDepTargets`: An `Array` of [target](#custom-targets) names to build before the executable's modules.
|
||||
* `nativeFacets`: An `Array` of [module facets](#defining-new-facets) to build and combine into the executable. Defaults to ``#[Module.oFacet]`` (i.e., the object file compiled from the Lean source).
|
||||
* `supportInterpreter`: Whether to expose symbols within the executable to the Lean interpreter. This allows the executable to interpret Lean files (e.g., via `Lean.Elab.runFrontend`). Implementation-wise, this passes `-rdynamic` to the linker when building on a non-Windows systems. Defaults to `false`.
|
||||
* `precompileModules`, `buildType`, `<more|weak><Lean|Leanc|Link>Args`: Augments the package's corresponding configuration option. The executable's arguments come after and the build type is the minimum of the two (`debug` is the lowest, and `release` is the highest).
|
||||
* `precompileModules`, `buildType`, `<more|weak><Lean|Leanc|Link>Args`, `moreServerOptions`: Augments the package's corresponding configuration option. The executable's arguments come after and the build type is the minimum of the two (`debug` is the lowest, and `release` is the highest).
|
||||
|
||||
### External Libraries
|
||||
|
||||
|
|
|
|||
|
|
@ -11,8 +11,8 @@ $LAKE -d foo build --update
|
|||
./foo/.lake/build/bin/foo
|
||||
./bar/.lake/build/bin/bar
|
||||
|
||||
# Test print-paths works (i.e., does not error)
|
||||
$LAKE -d foo print-paths A B
|
||||
# Test setup-file works (i.e., does not error)
|
||||
$LAKE -d foo setup-file ./foo/Foo.lean A B
|
||||
|
||||
# Test `lake clean`
|
||||
test -d a/.lake/build
|
||||
|
|
|
|||
|
|
@ -11,4 +11,4 @@ LAKE=${LAKE:-../../.lake/build/bin/lake}
|
|||
# https://github.com/leanprover/lean4/issues/2415
|
||||
|
||||
($LAKE build +X 2>&1 && exit 1 || true) | grep -F "X.lean"
|
||||
($LAKE print-paths Lib.B 2>&1 && exit 1 || true) | grep -F "Lib.B"
|
||||
($LAKE setup-file ./X.lean Lib.B 2>&1 && exit 1 || true) | grep -F "Lib.B"
|
||||
|
|
|
|||
|
|
@ -9,12 +9,12 @@ set -euxo pipefail
|
|||
NO_BUILD_CODE=3
|
||||
LAKE=${LAKE:-../../.lake/build/bin/lake}
|
||||
|
||||
# Test `--no-build` for print-paths and module builds (`buildUnlessUpToDate`)
|
||||
$LAKE print-paths Test --no-build && exit 1 || [ $? = $NO_BUILD_CODE ]
|
||||
# Test `--no-build` for setup-file and module builds (`buildUnlessUpToDate`)
|
||||
$LAKE setup-file ./Irrelevant.lean Test --no-build && exit 1 || [ $? = $NO_BUILD_CODE ]
|
||||
test ! -f .lake/build/lib/Test.olean
|
||||
$LAKE build Test
|
||||
test -f .lake/build/lib/Test.olean
|
||||
$LAKE print-paths Test --no-build
|
||||
$LAKE setup-file ./Irrelevant.lean Test --no-build
|
||||
|
||||
# Test `--no-build` for file builds (`buildFileUnlessUpToDate`)
|
||||
$LAKE build +Test:o --no-build && exit 1 || [ $? = $NO_BUILD_CODE ]
|
||||
|
|
|
|||
|
|
@ -28,14 +28,14 @@ echo -n "$MSGS" | ${LAKE:-../../.lake/build/bin/lake} serve >/dev/null
|
|||
echo "tested 49"
|
||||
|
||||
# ---
|
||||
# Test that `lake print-paths` retains the error from `lake serve`
|
||||
# Test that `lake setup-file` retains the error from `lake serve`
|
||||
# See https://github.com/leanprover/lake/issues/116
|
||||
# ---
|
||||
|
||||
# Test that `lake print-paths` produces the error from `LAKE_INVALID_CONFIG`
|
||||
# Test that `lake setup-file` produces the error from `LAKE_INVALID_CONFIG`
|
||||
set -x
|
||||
# NOTE: For some reason, using `!` here does not work on macOS
|
||||
(LAKE_INVALID_CONFIG=$'foo\n' $LAKE print-paths 2>&1 && exit 1 || true) | grep foo
|
||||
(LAKE_INVALID_CONFIG=$'foo\n' $LAKE setup-file ./Irrelevant.lean 2>&1 && exit 1 || true) | grep foo
|
||||
set +x
|
||||
|
||||
# Test that `lake serve` produces the `Invalid Lake configuration message`.
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{"textDocument": {"uri": "file://1265.lean"},
|
||||
{"textDocument": {"uri": "file:///1265.lean"},
|
||||
"position": {"line": 0, "character": 51}}
|
||||
{"items":
|
||||
[{"label": "getHygieneInfo",
|
||||
|
|
@ -22,7 +22,7 @@
|
|||
{"value": "The underlying `Syntax` value. ", "kind": "markdown"},
|
||||
"detail": "Lean.TSyntax ks → Lean.Syntax"}],
|
||||
"isIncomplete": true}
|
||||
{"textDocument": {"uri": "file://1265.lean"},
|
||||
{"textDocument": {"uri": "file:///1265.lean"},
|
||||
"position": {"line": 2, "character": 53}}
|
||||
{"items":
|
||||
[{"label": "getHygieneInfo",
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{"textDocument": {"uri": "file://1403.lean"},
|
||||
{"textDocument": {"uri": "file:///1403.lean"},
|
||||
"position": {"line": 1, "character": 2}}
|
||||
{"range":
|
||||
{"start": {"line": 1, "character": 2}, "end": {"line": 1, "character": 12}},
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{"textDocument": {"uri": "file://1659.lean"},
|
||||
{"textDocument": {"uri": "file:///1659.lean"},
|
||||
"position": {"line": 9, "character": 23}}
|
||||
{"items":
|
||||
[{"label": "Lean.Elab.Tactic.elabTermEnsuringType",
|
||||
|
|
@ -8,13 +8,13 @@
|
|||
"kind": 21,
|
||||
"detail": "Type"}],
|
||||
"isIncomplete": true}
|
||||
{"textDocument": {"uri": "file://1659.lean"},
|
||||
{"textDocument": {"uri": "file:///1659.lean"},
|
||||
"position": {"line": 15, "character": 23}}
|
||||
{"items":
|
||||
[{"label": "Tactic.elabTermEnsuringType", "kind": 21, "detail": "Type"},
|
||||
{"label": "Term.elabTermEnsuringType", "kind": 21, "detail": "Type"}],
|
||||
"isIncomplete": true}
|
||||
{"textDocument": {"uri": "file://1659.lean"},
|
||||
{"textDocument": {"uri": "file:///1659.lean"},
|
||||
"position": {"line": 21, "character": 23}}
|
||||
{"items":
|
||||
[{"label": "elabTermEnsuringType", "kind": 21, "detail": "Type"},
|
||||
|
|
@ -22,7 +22,7 @@
|
|||
"kind": 21,
|
||||
"detail": "Type"}],
|
||||
"isIncomplete": true}
|
||||
{"textDocument": {"uri": "file://1659.lean"},
|
||||
{"textDocument": {"uri": "file:///1659.lean"},
|
||||
"position": {"line": 27, "character": 23}}
|
||||
{"items":
|
||||
[{"label": "elabTermEnsuringType", "kind": 21, "detail": "Type"},
|
||||
|
|
@ -33,7 +33,7 @@
|
|||
"kind": 21,
|
||||
"detail": "Type"}],
|
||||
"isIncomplete": true}
|
||||
{"textDocument": {"uri": "file://1659.lean"},
|
||||
{"textDocument": {"uri": "file:///1659.lean"},
|
||||
"position": {"line": 33, "character": 23}}
|
||||
{"items":
|
||||
[{"label": "elabTermEnsuringType", "kind": 21, "detail": "Type"},
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{"textDocument": {"uri": "file://533.lean"},
|
||||
{"textDocument": {"uri": "file:///533.lean"},
|
||||
"position": {"line": 4, "character": 10}}
|
||||
{"items":
|
||||
[{"label": "F", "kind": 6, "detail": "Sort ?u"},
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{"textDocument": {"uri": "file://863.lean"},
|
||||
{"textDocument": {"uri": "file:///863.lean"},
|
||||
"position": {"line": 9, "character": 12}}
|
||||
{"items":
|
||||
[{"label": "getRef", "kind": 5, "detail": "[self : MonadRef] → Type"},
|
||||
|
|
@ -6,7 +6,7 @@
|
|||
"kind": 5,
|
||||
"detail": "[self : MonadRef] → Type"}],
|
||||
"isIncomplete": true}
|
||||
{"textDocument": {"uri": "file://863.lean"},
|
||||
{"textDocument": {"uri": "file:///863.lean"},
|
||||
"position": {"line": 13, "character": 12}}
|
||||
{"items":
|
||||
[{"label": "getRef", "kind": 5, "detail": "[self : MonadRef] → Type"},
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
{"textDocument": {"uri": "file://amb.lean"},
|
||||
{"textDocument": {"uri": "file:///amb.lean"},
|
||||
"position": {"line": 17, "character": 19}}
|
||||
{"range":
|
||||
{"start": {"line": 17, "character": 19}, "end": {"line": 17, "character": 20}},
|
||||
"contents":
|
||||
{"value": "```lean\nFoo.f (n : Nat) : Bool\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://amb.lean"},
|
||||
{"textDocument": {"uri": "file:///amb.lean"},
|
||||
"position": {"line": 19, "character": 19}}
|
||||
{"range":
|
||||
{"start": {"line": 19, "character": 19}, "end": {"line": 19, "character": 20}},
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{"textDocument": {"uri": "file://anonHyp.lean"},
|
||||
{"textDocument": {"uri": "file:///anonHyp.lean"},
|
||||
"position": {"line": 2, "character": 4}}
|
||||
{"rendered":
|
||||
"```lean\ncase succ\nn✝ : Nat\nn_ih✝ : n✝ + 1 > 0\n⊢ Nat.succ n✝ + 1 > 0\n```",
|
||||
|
|
|
|||
|
|
@ -1,34 +1,34 @@
|
|||
{"textDocument": {"uri": "file://autoBoundIssue.lean"},
|
||||
{"textDocument": {"uri": "file:///autoBoundIssue.lean"},
|
||||
"position": {"line": 13, "character": 21}}
|
||||
{"range":
|
||||
{"start": {"line": 13, "character": 21}, "end": {"line": 13, "character": 24}},
|
||||
"goal":
|
||||
"k : Fin ?m\nctx : Vector Ty ?m\nty u : Ty\n⊢ Vector Ty ?m"}
|
||||
{"textDocument": {"uri": "file://autoBoundIssue.lean"},
|
||||
{"textDocument": {"uri": "file:///autoBoundIssue.lean"},
|
||||
"position": {"line": 16, "character": 26}}
|
||||
{"range":
|
||||
{"start": {"line": 16, "character": 26}, "end": {"line": 16, "character": 29}},
|
||||
"goal":
|
||||
"k : Fin ?m\nctx : Vector Ty ?m\nty : Ty\n⊢ Vector Ty ?m"}
|
||||
{"textDocument": {"uri": "file://autoBoundIssue.lean"},
|
||||
{"textDocument": {"uri": "file:///autoBoundIssue.lean"},
|
||||
"position": {"line": 19, "character": 20}}
|
||||
{"range":
|
||||
{"start": {"line": 19, "character": 20}, "end": {"line": 19, "character": 23}},
|
||||
"goal":
|
||||
"k : Fin ?m\nctx : Vector Ty ?m\nty : Ty\n⊢ Vector Ty ?m"}
|
||||
{"textDocument": {"uri": "file://autoBoundIssue.lean"},
|
||||
{"textDocument": {"uri": "file:///autoBoundIssue.lean"},
|
||||
"position": {"line": 24, "character": 18}}
|
||||
{"range":
|
||||
{"start": {"line": 24, "character": 18}, "end": {"line": 24, "character": 21}},
|
||||
"goal":
|
||||
"k : Fin ?m\nctx : Vector Ty ?m\nty : Ty\n⊢ Vector Ty ?m"}
|
||||
{"textDocument": {"uri": "file://autoBoundIssue.lean"},
|
||||
{"textDocument": {"uri": "file:///autoBoundIssue.lean"},
|
||||
"position": {"line": 26, "character": 18}}
|
||||
{"range":
|
||||
{"start": {"line": 26, "character": 18}, "end": {"line": 26, "character": 21}},
|
||||
"goal":
|
||||
"aux : {x : Nat} → {k : Fin x} → {ctx : Vector Ty x} → {ty : Ty} → HasType k ctx ty\nk : Fin ?m\nctx : Vector Ty ?m\nty : Ty\n⊢ Vector Ty ?m"}
|
||||
{"textDocument": {"uri": "file://autoBoundIssue.lean"},
|
||||
{"textDocument": {"uri": "file:///autoBoundIssue.lean"},
|
||||
"position": {"line": 29, "character": 24}}
|
||||
{"range":
|
||||
{"start": {"line": 29, "character": 24}, "end": {"line": 29, "character": 27}},
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{"textDocument": {"uri": "file://catHover.lean"},
|
||||
{"textDocument": {"uri": "file:///catHover.lean"},
|
||||
"position": {"line": 4, "character": 33}}
|
||||
{"range":
|
||||
{"start": {"line": 4, "character": 32}, "end": {"line": 4, "character": 36}},
|
||||
|
|
@ -6,7 +6,7 @@
|
|||
{"value":
|
||||
"```lean\nLean.Parser.Category.term : Lean.Parser.Category\n```\n***\n`term` is the builtin syntax category for terms. A term denotes an expression\nin lean's type theory, for example `2 + 2` is a term. The difference between\n`Term` and `Expr` is that the former is a kind of syntax, while the latter is\nthe result of elaboration. For example `by simp` is also a `Term`, but it elaborates\nto different `Expr`s depending on the context. \n***\n*import Init.Notation*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://catHover.lean"},
|
||||
{"textDocument": {"uri": "file:///catHover.lean"},
|
||||
"position": {"line": 4, "character": 14}}
|
||||
{"range":
|
||||
{"start": {"line": 4, "character": 14}, "end": {"line": 4, "character": 18}},
|
||||
|
|
@ -14,7 +14,7 @@
|
|||
{"value":
|
||||
"```lean\nLean.Parser.Category.term : Lean.Parser.Category\n```\n***\n`term` is the builtin syntax category for terms. A term denotes an expression\nin lean's type theory, for example `2 + 2` is a term. The difference between\n`Term` and `Expr` is that the former is a kind of syntax, while the latter is\nthe result of elaboration. For example `by simp` is also a `Term`, but it elaborates\nto different `Expr`s depending on the context. \n***\n*import Init.Notation*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://catHover.lean"},
|
||||
{"textDocument": {"uri": "file:///catHover.lean"},
|
||||
"position": {"line": 4, "character": 25}}
|
||||
{"range":
|
||||
{"start": {"line": 4, "character": 24}, "end": {"line": 4, "character": 29}},
|
||||
|
|
@ -22,7 +22,7 @@
|
|||
{"value":
|
||||
"```lean\nLean.Parser.Category.index : Lean.Parser.Category\n```\n***\nIndex syntax categoy ",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://catHover.lean"},
|
||||
{"textDocument": {"uri": "file:///catHover.lean"},
|
||||
"position": {"line": 12, "character": 16}}
|
||||
{"range":
|
||||
{"start": {"line": 12, "character": 14}, "end": {"line": 12, "character": 19}},
|
||||
|
|
@ -30,7 +30,7 @@
|
|||
{"value":
|
||||
"```lean\nLean.Parser.Category.value : Lean.Parser.Category\n```\n***\nValue syntax category ",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://catHover.lean"},
|
||||
{"textDocument": {"uri": "file:///catHover.lean"},
|
||||
"position": {"line": 17, "character": 15}}
|
||||
{"range":
|
||||
{"start": {"line": 17, "character": 15}, "end": {"line": 17, "character": 19}},
|
||||
|
|
@ -38,7 +38,7 @@
|
|||
{"value":
|
||||
"```lean\nLean.Parser.Category.term : Lean.Parser.Category\n```\n***\n`term` is the builtin syntax category for terms. A term denotes an expression\nin lean's type theory, for example `2 + 2` is a term. The difference between\n`Term` and `Expr` is that the former is a kind of syntax, while the latter is\nthe result of elaboration. For example `by simp` is also a `Term`, but it elaborates\nto different `Expr`s depending on the context. \n***\n*import Init.Notation*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://catHover.lean"},
|
||||
{"textDocument": {"uri": "file:///catHover.lean"},
|
||||
"position": {"line": 20, "character": 9}}
|
||||
{"range":
|
||||
{"start": {"line": 20, "character": 7}, "end": {"line": 20, "character": 11}},
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
"kind": "quickfix",
|
||||
"edit":
|
||||
{"documentChanges":
|
||||
[{"textDocument": {"version": 1, "uri": "file://codeaction.lean"},
|
||||
[{"textDocument": {"version": 1, "uri": "file:///codeaction.lean"},
|
||||
"edits":
|
||||
[{"range":
|
||||
{"start": {"line": 30, "character": 4},
|
||||
|
|
@ -14,7 +14,7 @@
|
|||
{"providerResultIndex": 1,
|
||||
"providerName": "helloProvider",
|
||||
"params":
|
||||
{"textDocument": {"uri": "file://codeaction.lean"},
|
||||
{"textDocument": {"uri": "file:///codeaction.lean"},
|
||||
"range":
|
||||
{"start": {"line": 30, "character": 4}, "end": {"line": 30, "character": 4}},
|
||||
"context": {"diagnostics": []}}}}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{"textDocument": {"uri": "file://compHeader.lean"},
|
||||
{"textDocument": {"uri": "file:///compHeader.lean"},
|
||||
"position": {"line": 2, "character": 22}}
|
||||
{"items":
|
||||
[{"label": "veryLongNam", "kind": 6, "detail": "Sort u_1"},
|
||||
|
|
|
|||
|
|
@ -1,21 +1,21 @@
|
|||
{"textDocument": {"uri": "file://compNamespace.lean"},
|
||||
{"textDocument": {"uri": "file:///compNamespace.lean"},
|
||||
"position": {"line": 5, "character": 12}}
|
||||
{"items": [{"label": "LongNamespaceExample", "kind": 9, "detail": "namespace"}],
|
||||
"isIncomplete": true}
|
||||
{"textDocument": {"uri": "file://compNamespace.lean"},
|
||||
{"textDocument": {"uri": "file:///compNamespace.lean"},
|
||||
"position": {"line": 9, "character": 12}}
|
||||
{"items": [{"label": "LongNamespaceExample", "kind": 9, "detail": "namespace"}],
|
||||
"isIncomplete": true}
|
||||
{"textDocument": {"uri": "file://compNamespace.lean"},
|
||||
{"textDocument": {"uri": "file:///compNamespace.lean"},
|
||||
"position": {"line": 13, "character": 11}}
|
||||
{"items": [{"label": "LongNamespaceExample", "kind": 9, "detail": "namespace"}],
|
||||
"isIncomplete": true}
|
||||
{"textDocument": {"uri": "file://compNamespace.lean"},
|
||||
{"textDocument": {"uri": "file:///compNamespace.lean"},
|
||||
"position": {"line": 16, "character": 16}}
|
||||
{"items":
|
||||
[{"label": "Foo.LongNamespaceExample", "kind": 9, "detail": "namespace"}],
|
||||
"isIncomplete": true}
|
||||
{"textDocument": {"uri": "file://compNamespace.lean"},
|
||||
{"textDocument": {"uri": "file:///compNamespace.lean"},
|
||||
"position": {"line": 20, "character": 12}}
|
||||
{"items": [{"label": "LongNamespaceExample", "kind": 9, "detail": "namespace"}],
|
||||
"isIncomplete": true}
|
||||
|
|
|
|||
|
|
@ -1,16 +1,16 @@
|
|||
{"textDocument": {"uri": "file://completion.lean"},
|
||||
{"textDocument": {"uri": "file:///completion.lean"},
|
||||
"position": {"line": 3, "character": 22}}
|
||||
{"items": [{"label": "foo", "kind": 5, "detail": "Foo → Nat"}],
|
||||
"isIncomplete": true}
|
||||
{"textDocument": {"uri": "file://completion.lean"},
|
||||
{"textDocument": {"uri": "file:///completion.lean"},
|
||||
"position": {"line": 5, "character": 23}}
|
||||
{"items": [{"label": "foo", "kind": 5, "detail": "Foo → Nat"}],
|
||||
"isIncomplete": true}
|
||||
{"textDocument": {"uri": "file://completion.lean"},
|
||||
{"textDocument": {"uri": "file:///completion.lean"},
|
||||
"position": {"line": 7, "character": 28}}
|
||||
{"items": [{"label": "foo", "kind": 5, "detail": "Foo → Nat"}],
|
||||
"isIncomplete": true}
|
||||
{"textDocument": {"uri": "file://completion.lean"},
|
||||
{"textDocument": {"uri": "file:///completion.lean"},
|
||||
"position": {"line": 9, "character": 29}}
|
||||
{"items": [{"label": "foo", "kind": 5, "detail": "Foo → Nat"}],
|
||||
"isIncomplete": true}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{"textDocument": {"uri": "file://completion2.lean"},
|
||||
{"textDocument": {"uri": "file:///completion2.lean"},
|
||||
"position": {"line": 19, "character": 10}}
|
||||
{"items":
|
||||
[{"label": "ex2", "kind": 3, "detail": "a ≤ b → a + 2 ≤ b + 2"},
|
||||
|
|
@ -6,7 +6,7 @@
|
|||
{"label": "ax1", "kind": 3, "detail": "a ≤ b → a - a ≤ b - b"},
|
||||
{"label": "ex1", "kind": 3, "detail": "a ≤ b → a + a ≤ b + b"}],
|
||||
"isIncomplete": true}
|
||||
{"textDocument": {"uri": "file://completion2.lean"},
|
||||
{"textDocument": {"uri": "file:///completion2.lean"},
|
||||
"position": {"line": 25, "character": 6}}
|
||||
{"items":
|
||||
[{"label": "ex2", "kind": 3, "detail": "a ≤ b → a + 2 ≤ b + 2"},
|
||||
|
|
@ -14,7 +14,7 @@
|
|||
{"label": "ax1", "kind": 3, "detail": "a ≤ b → a - a ≤ b - b"},
|
||||
{"label": "ex1", "kind": 3, "detail": "a ≤ b → a + a ≤ b + b"}],
|
||||
"isIncomplete": true}
|
||||
{"textDocument": {"uri": "file://completion2.lean"},
|
||||
{"textDocument": {"uri": "file:///completion2.lean"},
|
||||
"position": {"line": 30, "character": 21}}
|
||||
{"items":
|
||||
[{"label": "ex2", "kind": 3, "detail": "a ≤ b → a + 2 ≤ b + 2"},
|
||||
|
|
@ -22,7 +22,7 @@
|
|||
{"label": "ax1", "kind": 3, "detail": "a ≤ b → a - a ≤ b - b"},
|
||||
{"label": "ex1", "kind": 3, "detail": "a ≤ b → a + a ≤ b + b"}],
|
||||
"isIncomplete": true}
|
||||
{"textDocument": {"uri": "file://completion2.lean"},
|
||||
{"textDocument": {"uri": "file:///completion2.lean"},
|
||||
"position": {"line": 37, "character": 22}}
|
||||
{"items":
|
||||
[{"label": "ex2", "kind": 3, "detail": "a ≤ b → a + 2 ≤ b + 2"},
|
||||
|
|
|
|||
|
|
@ -1,25 +1,25 @@
|
|||
{"textDocument": {"uri": "file://completion3.lean"},
|
||||
{"textDocument": {"uri": "file:///completion3.lean"},
|
||||
"position": {"line": 7, "character": 9}}
|
||||
{"items":
|
||||
[{"label": "b", "kind": 5, "detail": "S → Bool"},
|
||||
{"label": "x", "kind": 5, "detail": "S → Nat"},
|
||||
{"label": "y", "kind": 5, "detail": "S → String"}],
|
||||
"isIncomplete": true}
|
||||
{"textDocument": {"uri": "file://completion3.lean"},
|
||||
{"textDocument": {"uri": "file:///completion3.lean"},
|
||||
"position": {"line": 12, "character": 5}}
|
||||
{"items":
|
||||
[{"label": "b", "kind": 5, "detail": "S → Bool"},
|
||||
{"label": "x", "kind": 5, "detail": "S → Nat"},
|
||||
{"label": "y", "kind": 5, "detail": "S → String"}],
|
||||
"isIncomplete": true}
|
||||
{"textDocument": {"uri": "file://completion3.lean"},
|
||||
{"textDocument": {"uri": "file:///completion3.lean"},
|
||||
"position": {"line": 16, "character": 5}}
|
||||
{"items":
|
||||
[{"label": "b", "kind": 5, "detail": "S → Bool"},
|
||||
{"label": "x", "kind": 5, "detail": "S → Nat"},
|
||||
{"label": "y", "kind": 5, "detail": "S → String"}],
|
||||
"isIncomplete": true}
|
||||
{"textDocument": {"uri": "file://completion3.lean"},
|
||||
{"textDocument": {"uri": "file:///completion3.lean"},
|
||||
"position": {"line": 20, "character": 5}}
|
||||
{"items":
|
||||
[{"label": "x", "kind": 5, "detail": "S → Nat"},
|
||||
|
|
|
|||
|
|
@ -1,25 +1,25 @@
|
|||
{"textDocument": {"uri": "file://completion4.lean"},
|
||||
{"textDocument": {"uri": "file:///completion4.lean"},
|
||||
"position": {"line": 7, "character": 4}}
|
||||
{"items":
|
||||
[{"label": "fn1", "kind": 5, "detail": "S → Nat → IO Unit"},
|
||||
{"label": "fn2", "kind": 5, "detail": "S → Bool → IO Unit"},
|
||||
{"label": "pred", "kind": 5, "detail": "S → String → Bool"}],
|
||||
"isIncomplete": true}
|
||||
{"textDocument": {"uri": "file://completion4.lean"},
|
||||
{"textDocument": {"uri": "file:///completion4.lean"},
|
||||
"position": {"line": 11, "character": 10}}
|
||||
{"items":
|
||||
[{"label": "fn1", "kind": 5, "detail": "S → Nat → IO Unit"},
|
||||
{"label": "fn2", "kind": 5, "detail": "S → Bool → IO Unit"},
|
||||
{"label": "pred", "kind": 5, "detail": "S → String → Bool"}],
|
||||
"isIncomplete": true}
|
||||
{"textDocument": {"uri": "file://completion4.lean"},
|
||||
{"textDocument": {"uri": "file:///completion4.lean"},
|
||||
"position": {"line": 16, "character": 11}}
|
||||
{"items":
|
||||
[{"label": "fn1", "kind": 5, "detail": "S → Nat → IO Unit"},
|
||||
{"label": "fn2", "kind": 5, "detail": "S → Bool → IO Unit"},
|
||||
{"label": "pred", "kind": 5, "detail": "S → String → Bool"}],
|
||||
"isIncomplete": true}
|
||||
{"textDocument": {"uri": "file://completion4.lean"},
|
||||
{"textDocument": {"uri": "file:///completion4.lean"},
|
||||
"position": {"line": 20, "character": 21}}
|
||||
{"items":
|
||||
[{"label": "fn1", "kind": 5, "detail": "S → Nat → IO Unit"},
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{"textDocument": {"uri": "file://completion5.lean"},
|
||||
{"textDocument": {"uri": "file:///completion5.lean"},
|
||||
"position": {"line": 9, "character": 15}}
|
||||
{"items":
|
||||
[{"label": "b1", "kind": 5, "detail": "C → String"},
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{"textDocument": {"uri": "file://completion6.lean"},
|
||||
{"textDocument": {"uri": "file:///completion6.lean"},
|
||||
"position": {"line": 12, "character": 15}}
|
||||
{"items":
|
||||
[{"label": "b1", "kind": 5, "detail": "C → String"},
|
||||
|
|
@ -7,7 +7,7 @@
|
|||
{"label": "f3", "kind": 5, "detail": "D → Bool"},
|
||||
{"label": "toC", "kind": 5, "detail": "D → C"}],
|
||||
"isIncomplete": true}
|
||||
{"textDocument": {"uri": "file://completion6.lean"},
|
||||
{"textDocument": {"uri": "file:///completion6.lean"},
|
||||
"position": {"line": 21, "character": 4}}
|
||||
{"items":
|
||||
[{"label": "b1", "kind": 5, "detail": "C → String"},
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
{"textDocument": {"uri": "file://completion7.lean"},
|
||||
{"textDocument": {"uri": "file:///completion7.lean"},
|
||||
"position": {"line": 6, "character": 10}}
|
||||
{"items": [{"label": "And", "kind": 22, "detail": "Type 1"}],
|
||||
"isIncomplete": true}
|
||||
{"textDocument": {"uri": "file://completion7.lean"},
|
||||
{"textDocument": {"uri": "file:///completion7.lean"},
|
||||
"position": {"line": 8, "character": 11}}
|
||||
{"items":
|
||||
[{"label": "left", "kind": 5, "detail": "And → Type"},
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{"textDocument": {"uri": "file://completionAtPrint.lean"},
|
||||
{"textDocument": {"uri": "file:///completionAtPrint.lean"},
|
||||
"position": {"line": 2, "character": 25}}
|
||||
{"items":
|
||||
[{"label": "find?",
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{"textDocument": {"uri": "file://completionDocString.lean"},
|
||||
{"textDocument": {"uri": "file:///completionDocString.lean"},
|
||||
"position": {"line": 0, "character": 20}}
|
||||
{"items":
|
||||
[{"label": "insertAt",
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{"textDocument": {"uri": "file://completionEOF.lean"},
|
||||
{"textDocument": {"uri": "file:///completionEOF.lean"},
|
||||
"position": {"line": 8, "character": 9}}
|
||||
{"items": [{"label": "And", "kind": 21, "detail": "Type"}],
|
||||
"isIncomplete": true}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{"textDocument": {"uri": "file://completionIStr.lean"},
|
||||
{"textDocument": {"uri": "file:///completionIStr.lean"},
|
||||
"position": {"line": 5, "character": 34}}
|
||||
{"items":
|
||||
[{"label": "b1", "kind": 5, "detail": "C → String"},
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{"textDocument": {"uri": "file://completionOption.lean"},
|
||||
{"textDocument": {"uri": "file:///completionOption.lean"},
|
||||
"position": {"line": 1, "character": 17}}
|
||||
{"items":
|
||||
[{"textEdit":
|
||||
|
|
@ -71,7 +71,7 @@
|
|||
"detail":
|
||||
"(false), enable/disable tracing for the given module and submodules"}],
|
||||
"isIncomplete": true}
|
||||
{"textDocument": {"uri": "file://completionOption.lean"},
|
||||
{"textDocument": {"uri": "file:///completionOption.lean"},
|
||||
"position": {"line": 4, "character": 20}}
|
||||
{"items":
|
||||
[{"textEdit":
|
||||
|
|
@ -98,7 +98,7 @@
|
|||
"detail":
|
||||
"(false), enable/disable tracing for the given module and submodules"}],
|
||||
"isIncomplete": true}
|
||||
{"textDocument": {"uri": "file://completionOption.lean"},
|
||||
{"textDocument": {"uri": "file:///completionOption.lean"},
|
||||
"position": {"line": 7, "character": 23}}
|
||||
{"items":
|
||||
[{"textEdit":
|
||||
|
|
@ -150,7 +150,7 @@
|
|||
"detail":
|
||||
"(false), enable/disable tracing for the given module and submodules"}],
|
||||
"isIncomplete": true}
|
||||
{"textDocument": {"uri": "file://completionOption.lean"},
|
||||
{"textDocument": {"uri": "file:///completionOption.lean"},
|
||||
"position": {"line": 10, "character": 27}}
|
||||
{"items":
|
||||
[{"textEdit":
|
||||
|
|
@ -202,7 +202,7 @@
|
|||
"detail":
|
||||
"(false), enable/disable tracing for the given module and submodules"}],
|
||||
"isIncomplete": true}
|
||||
{"textDocument": {"uri": "file://completionOption.lean"},
|
||||
{"textDocument": {"uri": "file:///completionOption.lean"},
|
||||
"position": {"line": 13, "character": 17}}
|
||||
{"items":
|
||||
[{"textEdit":
|
||||
|
|
@ -275,7 +275,7 @@
|
|||
"detail":
|
||||
"(false), enable/disable tracing for the given module and submodules"}],
|
||||
"isIncomplete": true}
|
||||
{"textDocument": {"uri": "file://completionOption.lean"},
|
||||
{"textDocument": {"uri": "file:///completionOption.lean"},
|
||||
"position": {"line": 16, "character": 18}}
|
||||
{"items":
|
||||
[{"textEdit":
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{"textDocument": {"uri": "file://completionPrefixIssue.lean"},
|
||||
{"textDocument": {"uri": "file:///completionPrefixIssue.lean"},
|
||||
"position": {"line": 1, "character": 64}}
|
||||
{"items":
|
||||
[{"label": "veryLongDefinitionName", "kind": 6, "detail": "Nat"},
|
||||
|
|
|
|||
|
|
@ -1,20 +1,20 @@
|
|||
{"textDocument": {"uri": "file://completionPrv.lean"},
|
||||
{"textDocument": {"uri": "file:///completionPrv.lean"},
|
||||
"position": {"line": 2, "character": 11}}
|
||||
{"items": [{"label": "blaBlaBoo", "kind": 21, "detail": "Nat"}],
|
||||
"isIncomplete": true}
|
||||
{"textDocument": {"uri": "file://completionPrv.lean"},
|
||||
{"textDocument": {"uri": "file:///completionPrv.lean"},
|
||||
"position": {"line": 9, "character": 11}}
|
||||
{"items":
|
||||
[{"label": "booBoo", "kind": 21, "detail": "Nat"},
|
||||
{"label": "instToBoolBool", "kind": 21, "detail": "ToBool Bool"}],
|
||||
"isIncomplete": true}
|
||||
{"textDocument": {"uri": "file://completionPrv.lean"},
|
||||
{"textDocument": {"uri": "file:///completionPrv.lean"},
|
||||
"position": {"line": 21, "character": 5}}
|
||||
{"items":
|
||||
[{"label": "field1", "kind": 5, "detail": "S → Nat"},
|
||||
{"label": "getInc", "kind": 3, "detail": "S → Nat"}],
|
||||
"isIncomplete": true}
|
||||
{"textDocument": {"uri": "file://completionPrv.lean"},
|
||||
{"textDocument": {"uri": "file:///completionPrv.lean"},
|
||||
"position": {"line": 25, "character": 4}}
|
||||
{"items":
|
||||
[{"label": "field1", "kind": 5, "detail": "S → Nat"},
|
||||
|
|
|
|||
|
|
@ -1,15 +1,15 @@
|
|||
{"textDocument": {"uri": "file://definition.lean"},
|
||||
{"textDocument": {"uri": "file:///definition.lean"},
|
||||
"position": {"line": 4, "character": 2}}
|
||||
[{"targetUri": "file://definition.lean",
|
||||
[{"targetUri": "file:///definition.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 0, "character": 10}, "end": {"line": 0, "character": 13}},
|
||||
"targetRange":
|
||||
{"start": {"line": 0, "character": 0}, "end": {"line": 1, "character": 7}},
|
||||
"originSelectionRange":
|
||||
{"start": {"line": 4, "character": 2}, "end": {"line": 4, "character": 3}}}]
|
||||
{"textDocument": {"uri": "file://definition.lean"},
|
||||
{"textDocument": {"uri": "file:///definition.lean"},
|
||||
"position": {"line": 10, "character": 13}}
|
||||
[{"targetUri": "file://definition.lean",
|
||||
[{"targetUri": "file:///definition.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 10, "character": 4}, "end": {"line": 10, "character": 5}},
|
||||
"targetRange":
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{"textDocument": {"uri": "file://discrsIssue.lean"},
|
||||
{"textDocument": {"uri": "file:///discrsIssue.lean"},
|
||||
"position": {"line": 32, "character": 18}}
|
||||
{"range":
|
||||
{"start": {"line": 32, "character": 18}, "end": {"line": 32, "character": 20}},
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{"textDocument": {"uri": "file://dotIdCompletion.lean"},
|
||||
{"textDocument": {"uri": "file:///dotIdCompletion.lean"},
|
||||
"position": {"line": 4, "character": 5}}
|
||||
{"items":
|
||||
[{"label": "true", "kind": 4, "detail": "Boo"},
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
{"textDocument": {"version": 2, "uri": "file://editAfterError.lean"},
|
||||
{"textDocument": {"version": 2, "uri": "file:///editAfterError.lean"},
|
||||
"contentChanges":
|
||||
[{"text": "s",
|
||||
"range":
|
||||
{"start": {"line": 1, "character": 10},
|
||||
"end": {"line": 1, "character": 11}}}]}
|
||||
{"version": 2,
|
||||
"uri": "file://editAfterError.lean",
|
||||
"uri": "file:///editAfterError.lean",
|
||||
"diagnostics":
|
||||
[{"source": "Lean 4",
|
||||
"severity": 1,
|
||||
|
|
@ -23,7 +23,7 @@
|
|||
{"start": {"line": 1, "character": 7},
|
||||
"end": {"line": 1, "character": 11}}}]}
|
||||
{"version": 2,
|
||||
"uri": "file://editAfterError.lean",
|
||||
"uri": "file:///editAfterError.lean",
|
||||
"diagnostics":
|
||||
[{"source": "Lean 4",
|
||||
"severity": 1,
|
||||
|
|
@ -41,7 +41,7 @@
|
|||
{"start": {"line": 1, "character": 7},
|
||||
"end": {"line": 1, "character": 11}}}]}
|
||||
{"version": 2,
|
||||
"uri": "file://editAfterError.lean",
|
||||
"uri": "file:///editAfterError.lean",
|
||||
"diagnostics":
|
||||
[{"source": "Lean 4",
|
||||
"severity": 1,
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
{"textDocument": {"version": 2, "uri": "file://editCompletion.lean"},
|
||||
{"textDocument": {"version": 2, "uri": "file:///editCompletion.lean"},
|
||||
"contentChanges":
|
||||
[{"text": ".",
|
||||
"range":
|
||||
{"start": {"line": 3, "character": 21},
|
||||
"end": {"line": 3, "character": 22}}}]}
|
||||
{"textDocument": {"uri": "file://editCompletion.lean"},
|
||||
{"textDocument": {"uri": "file:///editCompletion.lean"},
|
||||
"position": {"line": 3, "character": 22}}
|
||||
{"items": [{"label": "foo", "kind": 5, "detail": "Foo → Nat"}],
|
||||
"isIncomplete": true}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{"textDocument": {"uri": "file://expectedTypeAsGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///expectedTypeAsGoal.lean"},
|
||||
"position": {"line": 3, "character": 5}}
|
||||
{"range":
|
||||
{"start": {"line": 3, "character": 4}, "end": {"line": 3, "character": 23}},
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{"textDocument": {"uri": "file://fieldCompletion.lean"},
|
||||
{"textDocument": {"uri": "file:///fieldCompletion.lean"},
|
||||
"position": {"line": 5, "character": 3}}
|
||||
{"items": [{"label": "modifiers", "kind": 5, "detail": "field"}],
|
||||
"isIncomplete": true}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{"textDocument": {"uri": "file://foldingRange.lean"},
|
||||
{"textDocument": {"uri": "file:///foldingRange.lean"},
|
||||
"position": {"line": 0, "character": 2}}
|
||||
[{"startLine": 1, "kind": "imports", "endLine": 4},
|
||||
{"startLine": 8, "kind": "imports", "endLine": 9},
|
||||
|
|
|
|||
|
|
@ -1,42 +1,42 @@
|
|||
{"textDocument": {"uri": "file://goTo.lean"},
|
||||
{"textDocument": {"uri": "file:///goTo.lean"},
|
||||
"position": {"line": 11, "character": 2}}
|
||||
[{"targetUri": "file://goTo.lean",
|
||||
[{"targetUri": "file:///goTo.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 5, "character": 2}, "end": {"line": 5, "character": 6}},
|
||||
"targetRange":
|
||||
{"start": {"line": 5, "character": 2}, "end": {"line": 5, "character": 6}},
|
||||
"originSelectionRange":
|
||||
{"start": {"line": 11, "character": 2}, "end": {"line": 11, "character": 6}}}]
|
||||
{"textDocument": {"uri": "file://goTo.lean"},
|
||||
{"textDocument": {"uri": "file:///goTo.lean"},
|
||||
"position": {"line": 11, "character": 6}}
|
||||
[{"targetUri": "file://goTo.lean",
|
||||
[{"targetUri": "file:///goTo.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 5, "character": 2}, "end": {"line": 5, "character": 6}},
|
||||
"targetRange":
|
||||
{"start": {"line": 5, "character": 2}, "end": {"line": 5, "character": 6}},
|
||||
"originSelectionRange":
|
||||
{"start": {"line": 11, "character": 2}, "end": {"line": 11, "character": 6}}}]
|
||||
{"textDocument": {"uri": "file://goTo.lean"},
|
||||
{"textDocument": {"uri": "file:///goTo.lean"},
|
||||
"position": {"line": 14, "character": 2}}
|
||||
[{"targetUri": "file://goTo.lean",
|
||||
[{"targetUri": "file:///goTo.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 6, "character": 2}, "end": {"line": 6, "character": 6}},
|
||||
"targetRange":
|
||||
{"start": {"line": 6, "character": 2}, "end": {"line": 6, "character": 6}},
|
||||
"originSelectionRange":
|
||||
{"start": {"line": 14, "character": 2}, "end": {"line": 14, "character": 6}}}]
|
||||
{"textDocument": {"uri": "file://goTo.lean"},
|
||||
{"textDocument": {"uri": "file:///goTo.lean"},
|
||||
"position": {"line": 16, "character": 2}}
|
||||
[{"targetUri": "file://goTo.lean",
|
||||
[{"targetUri": "file:///goTo.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 2, "character": 10}, "end": {"line": 2, "character": 13}},
|
||||
"targetRange":
|
||||
{"start": {"line": 2, "character": 0}, "end": {"line": 2, "character": 19}},
|
||||
"originSelectionRange":
|
||||
{"start": {"line": 16, "character": 2}, "end": {"line": 16, "character": 5}}}]
|
||||
{"textDocument": {"uri": "file://goTo.lean"},
|
||||
{"textDocument": {"uri": "file:///goTo.lean"},
|
||||
"position": {"line": 20, "character": 11}}
|
||||
[{"targetUri": "file://goTo.lean",
|
||||
[{"targetUri": "file:///goTo.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 2, "character": 10}, "end": {"line": 2, "character": 13}},
|
||||
"targetRange":
|
||||
|
|
@ -44,9 +44,9 @@
|
|||
"originSelectionRange":
|
||||
{"start": {"line": 20, "character": 8},
|
||||
"end": {"line": 20, "character": 11}}}]
|
||||
{"textDocument": {"uri": "file://goTo.lean"},
|
||||
{"textDocument": {"uri": "file:///goTo.lean"},
|
||||
"position": {"line": 28, "character": 12}}
|
||||
[{"targetUri": "file://goTo.lean",
|
||||
[{"targetUri": "file:///goTo.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 22, "character": 10},
|
||||
"end": {"line": 22, "character": 27}},
|
||||
|
|
@ -55,18 +55,18 @@
|
|||
"originSelectionRange":
|
||||
{"start": {"line": 28, "character": 10},
|
||||
"end": {"line": 28, "character": 27}}}]
|
||||
{"textDocument": {"uri": "file://goTo.lean"},
|
||||
{"textDocument": {"uri": "file:///goTo.lean"},
|
||||
"position": {"line": 30, "character": 2}}
|
||||
[{"targetUri": "file://goTo.lean",
|
||||
[{"targetUri": "file:///goTo.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 23, "character": 2}, "end": {"line": 23, "character": 3}},
|
||||
"targetRange":
|
||||
{"start": {"line": 23, "character": 2}, "end": {"line": 23, "character": 3}},
|
||||
"originSelectionRange":
|
||||
{"start": {"line": 30, "character": 2}, "end": {"line": 30, "character": 3}}}]
|
||||
{"textDocument": {"uri": "file://goTo.lean"},
|
||||
{"textDocument": {"uri": "file:///goTo.lean"},
|
||||
"position": {"line": 34, "character": 14}}
|
||||
[{"targetUri": "file://goTo.lean",
|
||||
[{"targetUri": "file:///goTo.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 9, "character": 4}, "end": {"line": 9, "character": 10}},
|
||||
"targetRange":
|
||||
|
|
@ -74,9 +74,9 @@
|
|||
"originSelectionRange":
|
||||
{"start": {"line": 34, "character": 14},
|
||||
"end": {"line": 34, "character": 20}}}]
|
||||
{"textDocument": {"uri": "file://goTo.lean"},
|
||||
{"textDocument": {"uri": "file:///goTo.lean"},
|
||||
"position": {"line": 43, "character": 7}}
|
||||
[{"targetUri": "file://goTo.lean",
|
||||
[{"targetUri": "file:///goTo.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 36, "character": 16},
|
||||
"end": {"line": 36, "character": 24}},
|
||||
|
|
@ -85,9 +85,9 @@
|
|||
"originSelectionRange":
|
||||
{"start": {"line": 43, "character": 7},
|
||||
"end": {"line": 43, "character": 11}}}]
|
||||
{"textDocument": {"uri": "file://goTo.lean"},
|
||||
{"textDocument": {"uri": "file:///goTo.lean"},
|
||||
"position": {"line": 43, "character": 7}}
|
||||
[{"targetUri": "file://goTo.lean",
|
||||
[{"targetUri": "file:///goTo.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 38, "character": 26},
|
||||
"end": {"line": 38, "character": 38}},
|
||||
|
|
@ -97,9 +97,9 @@
|
|||
"originSelectionRange":
|
||||
{"start": {"line": 43, "character": 7},
|
||||
"end": {"line": 43, "character": 11}}}]
|
||||
{"textDocument": {"uri": "file://goTo.lean"},
|
||||
{"textDocument": {"uri": "file:///goTo.lean"},
|
||||
"position": {"line": 48, "character": 28}}
|
||||
[{"targetUri": "file://goTo.lean",
|
||||
[{"targetUri": "file:///goTo.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 46, "character": 4}, "end": {"line": 46, "character": 7}},
|
||||
"targetRange":
|
||||
|
|
@ -107,27 +107,27 @@
|
|||
"originSelectionRange":
|
||||
{"start": {"line": 48, "character": 28},
|
||||
"end": {"line": 48, "character": 29}}}]
|
||||
{"textDocument": {"uri": "file://goTo.lean"},
|
||||
{"textDocument": {"uri": "file:///goTo.lean"},
|
||||
"position": {"line": 54, "character": 2}}
|
||||
[{"targetUri": "file://goTo.lean",
|
||||
[{"targetUri": "file:///goTo.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 52, "character": 6}, "end": {"line": 52, "character": 7}},
|
||||
"targetRange":
|
||||
{"start": {"line": 52, "character": 6}, "end": {"line": 52, "character": 7}},
|
||||
"originSelectionRange":
|
||||
{"start": {"line": 54, "character": 2}, "end": {"line": 54, "character": 3}}}]
|
||||
{"textDocument": {"uri": "file://goTo.lean"},
|
||||
{"textDocument": {"uri": "file:///goTo.lean"},
|
||||
"position": {"line": 54, "character": 6}}
|
||||
[{"targetUri": "file://goTo.lean",
|
||||
[{"targetUri": "file:///goTo.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 57, "character": 2}, "end": {"line": 57, "character": 3}},
|
||||
"targetRange":
|
||||
{"start": {"line": 57, "character": 2}, "end": {"line": 57, "character": 3}},
|
||||
"originSelectionRange":
|
||||
{"start": {"line": 54, "character": 6}, "end": {"line": 54, "character": 7}}}]
|
||||
{"textDocument": {"uri": "file://goTo.lean"},
|
||||
{"textDocument": {"uri": "file:///goTo.lean"},
|
||||
"position": {"line": 60, "character": 7}}
|
||||
[{"targetUri": "file://goTo.lean",
|
||||
[{"targetUri": "file:///goTo.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 59, "character": 0}, "end": {"line": 59, "character": 29}},
|
||||
"targetRange":
|
||||
|
|
@ -135,9 +135,9 @@
|
|||
"originSelectionRange":
|
||||
{"start": {"line": 60, "character": 7},
|
||||
"end": {"line": 60, "character": 11}}}]
|
||||
{"textDocument": {"uri": "file://goTo.lean"},
|
||||
{"textDocument": {"uri": "file:///goTo.lean"},
|
||||
"position": {"line": 87, "character": 16}}
|
||||
[{"targetUri": "file://goTo.lean",
|
||||
[{"targetUri": "file:///goTo.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 64, "character": 2}, "end": {"line": 64, "character": 5}},
|
||||
"targetRange":
|
||||
|
|
@ -145,7 +145,7 @@
|
|||
"originSelectionRange":
|
||||
{"start": {"line": 87, "character": 7},
|
||||
"end": {"line": 87, "character": 18}}},
|
||||
{"targetUri": "file://goTo.lean",
|
||||
{"targetUri": "file:///goTo.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 80, "character": 0}, "end": {"line": 80, "character": 8}},
|
||||
"targetRange":
|
||||
|
|
@ -153,9 +153,9 @@
|
|||
"originSelectionRange":
|
||||
{"start": {"line": 87, "character": 7},
|
||||
"end": {"line": 87, "character": 18}}}]
|
||||
{"textDocument": {"uri": "file://goTo.lean"},
|
||||
{"textDocument": {"uri": "file:///goTo.lean"},
|
||||
"position": {"line": 87, "character": 12}}
|
||||
[{"targetUri": "file://goTo.lean",
|
||||
[{"targetUri": "file:///goTo.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 64, "character": 2}, "end": {"line": 64, "character": 5}},
|
||||
"targetRange":
|
||||
|
|
@ -163,9 +163,9 @@
|
|||
"originSelectionRange":
|
||||
{"start": {"line": 87, "character": 7},
|
||||
"end": {"line": 87, "character": 15}}}]
|
||||
{"textDocument": {"uri": "file://goTo.lean"},
|
||||
{"textDocument": {"uri": "file:///goTo.lean"},
|
||||
"position": {"line": 89, "character": 13}}
|
||||
[{"targetUri": "file://goTo.lean",
|
||||
[{"targetUri": "file:///goTo.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 64, "character": 2}, "end": {"line": 64, "character": 5}},
|
||||
"targetRange":
|
||||
|
|
@ -173,7 +173,7 @@
|
|||
"originSelectionRange":
|
||||
{"start": {"line": 89, "character": 8},
|
||||
"end": {"line": 89, "character": 16}}},
|
||||
{"targetUri": "file://goTo.lean",
|
||||
{"targetUri": "file:///goTo.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 80, "character": 0}, "end": {"line": 80, "character": 8}},
|
||||
"targetRange":
|
||||
|
|
@ -181,9 +181,9 @@
|
|||
"originSelectionRange":
|
||||
{"start": {"line": 89, "character": 8},
|
||||
"end": {"line": 89, "character": 16}}}]
|
||||
{"textDocument": {"uri": "file://goTo.lean"},
|
||||
{"textDocument": {"uri": "file:///goTo.lean"},
|
||||
"position": {"line": 91, "character": 13}}
|
||||
[{"targetUri": "file://goTo.lean",
|
||||
[{"targetUri": "file:///goTo.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 65, "character": 2}, "end": {"line": 65, "character": 6}},
|
||||
"targetRange":
|
||||
|
|
@ -191,7 +191,7 @@
|
|||
"originSelectionRange":
|
||||
{"start": {"line": 91, "character": 8},
|
||||
"end": {"line": 91, "character": 17}}},
|
||||
{"targetUri": "file://goTo.lean",
|
||||
{"targetUri": "file:///goTo.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 80, "character": 0}, "end": {"line": 80, "character": 8}},
|
||||
"targetRange":
|
||||
|
|
@ -199,9 +199,9 @@
|
|||
"originSelectionRange":
|
||||
{"start": {"line": 91, "character": 8},
|
||||
"end": {"line": 91, "character": 17}}}]
|
||||
{"textDocument": {"uri": "file://goTo.lean"},
|
||||
{"textDocument": {"uri": "file:///goTo.lean"},
|
||||
"position": {"line": 95, "character": 13}}
|
||||
[{"targetUri": "file://goTo.lean",
|
||||
[{"targetUri": "file:///goTo.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 64, "character": 2}, "end": {"line": 64, "character": 5}},
|
||||
"targetRange":
|
||||
|
|
@ -209,9 +209,9 @@
|
|||
"originSelectionRange":
|
||||
{"start": {"line": 95, "character": 8},
|
||||
"end": {"line": 95, "character": 16}}}]
|
||||
{"textDocument": {"uri": "file://goTo.lean"},
|
||||
{"textDocument": {"uri": "file:///goTo.lean"},
|
||||
"position": {"line": 99, "character": 13}}
|
||||
[{"targetUri": "file://goTo.lean",
|
||||
[{"targetUri": "file:///goTo.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 68, "character": 2}, "end": {"line": 68, "character": 5}},
|
||||
"targetRange":
|
||||
|
|
@ -219,7 +219,7 @@
|
|||
"originSelectionRange":
|
||||
{"start": {"line": 99, "character": 8},
|
||||
"end": {"line": 99, "character": 16}}},
|
||||
{"targetUri": "file://goTo.lean",
|
||||
{"targetUri": "file:///goTo.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 81, "character": 0}, "end": {"line": 81, "character": 8}},
|
||||
"targetRange":
|
||||
|
|
@ -227,9 +227,9 @@
|
|||
"originSelectionRange":
|
||||
{"start": {"line": 99, "character": 8},
|
||||
"end": {"line": 99, "character": 16}}}]
|
||||
{"textDocument": {"uri": "file://goTo.lean"},
|
||||
{"textDocument": {"uri": "file:///goTo.lean"},
|
||||
"position": {"line": 103, "character": 13}}
|
||||
[{"targetUri": "file://goTo.lean",
|
||||
[{"targetUri": "file:///goTo.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 73, "character": 4}, "end": {"line": 73, "character": 12}},
|
||||
"targetRange":
|
||||
|
|
@ -237,9 +237,9 @@
|
|||
"originSelectionRange":
|
||||
{"start": {"line": 103, "character": 8},
|
||||
"end": {"line": 103, "character": 16}}}]
|
||||
{"textDocument": {"uri": "file://goTo.lean"},
|
||||
{"textDocument": {"uri": "file:///goTo.lean"},
|
||||
"position": {"line": 108, "character": 13}}
|
||||
[{"targetUri": "file://goTo.lean",
|
||||
[{"targetUri": "file:///goTo.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 77, "character": 2}, "end": {"line": 77, "character": 5}},
|
||||
"targetRange":
|
||||
|
|
@ -247,7 +247,7 @@
|
|||
"originSelectionRange":
|
||||
{"start": {"line": 108, "character": 8},
|
||||
"end": {"line": 108, "character": 16}}},
|
||||
{"targetUri": "file://goTo.lean",
|
||||
{"targetUri": "file:///goTo.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 83, "character": 0}, "end": {"line": 83, "character": 8}},
|
||||
"targetRange":
|
||||
|
|
@ -255,7 +255,7 @@
|
|||
"originSelectionRange":
|
||||
{"start": {"line": 108, "character": 8},
|
||||
"end": {"line": 108, "character": 16}}},
|
||||
{"targetUri": "file://goTo.lean",
|
||||
{"targetUri": "file:///goTo.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 80, "character": 0}, "end": {"line": 80, "character": 8}},
|
||||
"targetRange":
|
||||
|
|
@ -263,9 +263,9 @@
|
|||
"originSelectionRange":
|
||||
{"start": {"line": 108, "character": 8},
|
||||
"end": {"line": 108, "character": 16}}}]
|
||||
{"textDocument": {"uri": "file://goTo.lean"},
|
||||
{"textDocument": {"uri": "file:///goTo.lean"},
|
||||
"position": {"line": 112, "character": 7}}
|
||||
[{"targetUri": "file://goTo.lean",
|
||||
[{"targetUri": "file:///goTo.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 9, "character": 4}, "end": {"line": 9, "character": 10}},
|
||||
"targetRange":
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{"textDocument": {"uri": "file://goTo2.lean"},
|
||||
{"textDocument": {"uri": "file:///goTo2.lean"},
|
||||
"position": {"line": 10, "character": 15}}
|
||||
[{"targetUri": "file://goTo2.lean",
|
||||
[{"targetUri": "file:///goTo2.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 1, "character": 0}, "end": {"line": 1, "character": 55}},
|
||||
"targetRange":
|
||||
|
|
@ -8,9 +8,9 @@
|
|||
"originSelectionRange":
|
||||
{"start": {"line": 10, "character": 11},
|
||||
"end": {"line": 10, "character": 20}}}]
|
||||
{"textDocument": {"uri": "file://goTo2.lean"},
|
||||
{"textDocument": {"uri": "file:///goTo2.lean"},
|
||||
"position": {"line": 10, "character": 27}}
|
||||
[{"targetUri": "file://goTo2.lean",
|
||||
[{"targetUri": "file:///goTo2.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 2, "character": 0}, "end": {"line": 2, "character": 55}},
|
||||
"targetRange":
|
||||
|
|
@ -18,9 +18,9 @@
|
|||
"originSelectionRange":
|
||||
{"start": {"line": 10, "character": 23},
|
||||
"end": {"line": 10, "character": 30}}}]
|
||||
{"textDocument": {"uri": "file://goTo2.lean"},
|
||||
{"textDocument": {"uri": "file:///goTo2.lean"},
|
||||
"position": {"line": 10, "character": 11}}
|
||||
[{"targetUri": "file://goTo2.lean",
|
||||
[{"targetUri": "file:///goTo2.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 14, "character": 4}, "end": {"line": 14, "character": 5}},
|
||||
"targetRange":
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
{"textDocument": {"uri": "file://goalEOF.lean"},
|
||||
{"textDocument": {"uri": "file:///goalEOF.lean"},
|
||||
"position": {"line": 5, "character": 25}}
|
||||
{"rendered": "```lean\n⊢ False\n```", "goals": ["⊢ False"]}
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
{"textDocument": {"uri": "file://goalIssue.lean"},
|
||||
{"textDocument": {"uri": "file:///goalIssue.lean"},
|
||||
"position": {"line": 2, "character": 12}}
|
||||
{"rendered": "```lean\nx : Nat\nthis : x + x = x + x\n⊢ 0 + x = x\n```",
|
||||
"goals": ["x : Nat\nthis : x + x = x + x\n⊢ 0 + x = x"]}
|
||||
{"textDocument": {"uri": "file://goalIssue.lean"},
|
||||
{"textDocument": {"uri": "file:///goalIssue.lean"},
|
||||
"position": {"line": 8, "character": 12}}
|
||||
{"rendered": "```lean\ncase zero\n⊢ 0 + Nat.zero = Nat.zero\n```",
|
||||
"goals": ["case zero\n⊢ 0 + Nat.zero = Nat.zero"]}
|
||||
|
|
|
|||
|
|
@ -1,12 +1,12 @@
|
|||
{"textDocument": {"uri": "file://haveInfo.lean"},
|
||||
{"textDocument": {"uri": "file:///haveInfo.lean"},
|
||||
"position": {"line": 2, "character": 4}}
|
||||
{"rendered": "```lean\n⊢ True\n```", "goals": ["⊢ True"]}
|
||||
{"textDocument": {"uri": "file://haveInfo.lean"},
|
||||
{"textDocument": {"uri": "file:///haveInfo.lean"},
|
||||
"position": {"line": 8, "character": 17}}
|
||||
{"rendered": "```lean\n⊢ True\n```", "goals": ["⊢ True"]}
|
||||
{"textDocument": {"uri": "file://haveInfo.lean"},
|
||||
{"textDocument": {"uri": "file:///haveInfo.lean"},
|
||||
"position": {"line": 15, "character": 17}}
|
||||
{"rendered": "```lean\n⊢ True\n```", "goals": ["⊢ True"]}
|
||||
{"textDocument": {"uri": "file://haveInfo.lean"},
|
||||
{"textDocument": {"uri": "file:///haveInfo.lean"},
|
||||
"position": {"line": 23, "character": 2}}
|
||||
{"rendered": "```lean\n⊢ True\n```", "goals": ["⊢ True"]}
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
{"textDocument": {"uri": "file://highlight.lean"},
|
||||
{"textDocument": {"uri": "file:///highlight.lean"},
|
||||
"position": {"line": 1, "character": 23}}
|
||||
[{"range":
|
||||
{"start": {"line": 1, "character": 22}, "end": {"line": 1, "character": 26}},
|
||||
"kind": 1}]
|
||||
{"textDocument": {"uri": "file://highlight.lean"},
|
||||
{"textDocument": {"uri": "file:///highlight.lean"},
|
||||
"position": {"line": 5, "character": 7}}
|
||||
[{"range":
|
||||
{"start": {"line": 1, "character": 4}, "end": {"line": 1, "character": 8}},
|
||||
|
|
@ -14,7 +14,7 @@
|
|||
{"range":
|
||||
{"start": {"line": 5, "character": 6}, "end": {"line": 5, "character": 10}},
|
||||
"kind": 1}]
|
||||
{"textDocument": {"uri": "file://highlight.lean"},
|
||||
{"textDocument": {"uri": "file:///highlight.lean"},
|
||||
"position": {"line": 10, "character": 3}}
|
||||
[{"range":
|
||||
{"start": {"line": 9, "character": 6}, "end": {"line": 9, "character": 9}},
|
||||
|
|
@ -22,7 +22,7 @@
|
|||
{"range":
|
||||
{"start": {"line": 10, "character": 2}, "end": {"line": 10, "character": 5}},
|
||||
"kind": 1}]
|
||||
{"textDocument": {"uri": "file://highlight.lean"},
|
||||
{"textDocument": {"uri": "file:///highlight.lean"},
|
||||
"position": {"line": 15, "character": 3}}
|
||||
[{"range":
|
||||
{"start": {"line": 15, "character": 2}, "end": {"line": 15, "character": 6}},
|
||||
|
|
@ -31,7 +31,7 @@
|
|||
{"start": {"line": 23, "character": 16},
|
||||
"end": {"line": 23, "character": 20}},
|
||||
"kind": 1}]
|
||||
{"textDocument": {"uri": "file://highlight.lean"},
|
||||
{"textDocument": {"uri": "file:///highlight.lean"},
|
||||
"position": {"line": 19, "character": 7}}
|
||||
[{"range":
|
||||
{"start": {"line": 14, "character": 2}, "end": {"line": 14, "character": 5}},
|
||||
|
|
@ -42,7 +42,7 @@
|
|||
{"range":
|
||||
{"start": {"line": 23, "character": 4}, "end": {"line": 23, "character": 7}},
|
||||
"kind": 1}]
|
||||
{"textDocument": {"uri": "file://highlight.lean"},
|
||||
{"textDocument": {"uri": "file:///highlight.lean"},
|
||||
"position": {"line": 23, "character": 5}}
|
||||
[{"range":
|
||||
{"start": {"line": 14, "character": 2}, "end": {"line": 14, "character": 5}},
|
||||
|
|
@ -53,7 +53,7 @@
|
|||
{"range":
|
||||
{"start": {"line": 23, "character": 4}, "end": {"line": 23, "character": 7}},
|
||||
"kind": 1}]
|
||||
{"textDocument": {"uri": "file://highlight.lean"},
|
||||
{"textDocument": {"uri": "file:///highlight.lean"},
|
||||
"position": {"line": 23, "character": 12}}
|
||||
[{"range":
|
||||
{"start": {"line": 22, "character": 10},
|
||||
|
|
@ -67,7 +67,7 @@
|
|||
{"start": {"line": 23, "character": 24},
|
||||
"end": {"line": 23, "character": 27}},
|
||||
"kind": 1}]
|
||||
{"textDocument": {"uri": "file://highlight.lean"},
|
||||
{"textDocument": {"uri": "file:///highlight.lean"},
|
||||
"position": {"line": 30, "character": 2}}
|
||||
[{"range":
|
||||
{"start": {"line": 28, "character": 10},
|
||||
|
|
@ -79,7 +79,7 @@
|
|||
{"range":
|
||||
{"start": {"line": 30, "character": 2}, "end": {"line": 30, "character": 3}},
|
||||
"kind": 1}]
|
||||
{"textDocument": {"uri": "file://highlight.lean"},
|
||||
{"textDocument": {"uri": "file:///highlight.lean"},
|
||||
"position": {"line": 41, "character": 7}}
|
||||
[{"range":
|
||||
{"start": {"line": 34, "character": 10},
|
||||
|
|
@ -104,7 +104,7 @@
|
|||
{"range":
|
||||
{"start": {"line": 41, "character": 7}, "end": {"line": 41, "character": 8}},
|
||||
"kind": 1}]
|
||||
{"textDocument": {"uri": "file://highlight.lean"},
|
||||
{"textDocument": {"uri": "file:///highlight.lean"},
|
||||
"position": {"line": 48, "character": 9}}
|
||||
[{"range":
|
||||
{"start": {"line": 45, "character": 10},
|
||||
|
|
@ -116,7 +116,7 @@
|
|||
{"range":
|
||||
{"start": {"line": 48, "character": 9}, "end": {"line": 48, "character": 10}},
|
||||
"kind": 1}]
|
||||
{"textDocument": {"uri": "file://highlight.lean"},
|
||||
{"textDocument": {"uri": "file:///highlight.lean"},
|
||||
"position": {"line": 53, "character": 9}}
|
||||
[{"range":
|
||||
{"start": {"line": 53, "character": 9}, "end": {"line": 53, "character": 10}},
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 3, "character": 8}}
|
||||
{"range":
|
||||
{"start": {"line": 3, "character": 8}, "end": {"line": 3, "character": 18}},
|
||||
|
|
@ -6,7 +6,7 @@
|
|||
{"value":
|
||||
"```lean\nTrue.intro : True\n```\n***\n`True` is true, and `True.intro` (or more commonly, `trivial`)\nis the proof. \n***\n*import Init.Prelude*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 7, "character": 8}}
|
||||
{"range":
|
||||
{"start": {"line": 7, "character": 8}, "end": {"line": 7, "character": 18}},
|
||||
|
|
@ -14,7 +14,7 @@
|
|||
{"value":
|
||||
"```lean\nTrue.intro : True\n```\n***\n`True` is true, and `True.intro` (or more commonly, `trivial`)\nis the proof. \n***\n*import Init.Prelude*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 12, "character": 4}}
|
||||
{"range":
|
||||
{"start": {"line": 12, "character": 4}, "end": {"line": 12, "character": 12}},
|
||||
|
|
@ -22,17 +22,17 @@
|
|||
{"value":
|
||||
"```lean\nNat.zero : Nat\n```\n***\n`Nat.zero`, normally written `0 : Nat`, is the smallest natural number.\nThis is one of the two constructors of `Nat`. \n***\n*import Init.Prelude*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 21, "character": 2}}
|
||||
{"range":
|
||||
{"start": {"line": 21, "character": 2}, "end": {"line": 21, "character": 23}},
|
||||
"contents": {"value": "My tactic ", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 21, "character": 8}}
|
||||
{"range":
|
||||
{"start": {"line": 21, "character": 2}, "end": {"line": 21, "character": 23}},
|
||||
"contents": {"value": "My tactic ", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 21, "character": 13}}
|
||||
{"range":
|
||||
{"start": {"line": 21, "character": 13}, "end": {"line": 21, "character": 23}},
|
||||
|
|
@ -40,7 +40,7 @@
|
|||
{"value":
|
||||
"```lean\nTrue.intro : True\n```\n***\n`True` is true, and `True.intro` (or more commonly, `trivial`)\nis the proof. \n***\n*import Init.Prelude*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 28, "character": 6}}
|
||||
{"range":
|
||||
{"start": {"line": 28, "character": 6}, "end": {"line": 28, "character": 12}},
|
||||
|
|
@ -48,7 +48,7 @@
|
|||
{"value":
|
||||
"```lean\nLean.Parser.Category.tactic : Lean.Parser.Category\n```\n***\n`tactic` is the builtin syntax category for tactics. These appear after\n`by` in proofs, and they are programs that take in the proof context\n(the hypotheses in scope plus the type of the term to synthesize) and construct\na term of the expected type. For example, `simp` is a tactic, used in:\n```\nexample : 2 + 2 = 4 := by simp\n```\n\n***\n*import Init.Notation*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 28, "character": 32}}
|
||||
{"range":
|
||||
{"start": {"line": 28, "character": 32}, "end": {"line": 28, "character": 36}},
|
||||
|
|
@ -56,7 +56,7 @@
|
|||
{"value":
|
||||
"```lean\nLean.Parser.Category.term : Lean.Parser.Category\n```\n***\n`term` is the builtin syntax category for terms. A term denotes an expression\nin lean's type theory, for example `2 + 2` is a term. The difference between\n`Term` and `Expr` is that the former is a kind of syntax, while the latter is\nthe result of elaboration. For example `by simp` is also a `Term`, but it elaborates\nto different `Expr`s depending on the context. \n***\n*import Init.Notation*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 31, "character": 6}}
|
||||
{"range":
|
||||
{"start": {"line": 31, "character": 6}, "end": {"line": 31, "character": 12}},
|
||||
|
|
@ -64,7 +64,7 @@
|
|||
{"value":
|
||||
"```lean\nLean.Parser.Category.tactic : Lean.Parser.Category\n```\n***\n`tactic` is the builtin syntax category for tactics. These appear after\n`by` in proofs, and they are programs that take in the proof context\n(the hypotheses in scope plus the type of the term to synthesize) and construct\na term of the expected type. For example, `simp` is a tactic, used in:\n```\nexample : 2 + 2 = 4 := by simp\n```\n\n***\n*import Init.Notation*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 31, "character": 24}}
|
||||
{"range":
|
||||
{"start": {"line": 31, "character": 23}, "end": {"line": 31, "character": 27}},
|
||||
|
|
@ -72,49 +72,49 @@
|
|||
{"value":
|
||||
"```lean\nLean.Parser.Category.term : Lean.Parser.Category\n```\n***\n`term` is the builtin syntax category for terms. A term denotes an expression\nin lean's type theory, for example `2 + 2` is a term. The difference between\n`Term` and `Expr` is that the former is a kind of syntax, while the latter is\nthe result of elaboration. For example `by simp` is also a `Term`, but it elaborates\nto different `Expr`s depending on the context. \n***\n*import Init.Notation*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 36, "character": 2}}
|
||||
{"range":
|
||||
{"start": {"line": 36, "character": 2}, "end": {"line": 36, "character": 23}},
|
||||
"contents": {"value": "My tactic ", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 44, "character": 2}}
|
||||
{"range":
|
||||
{"start": {"line": 44, "character": 2}, "end": {"line": 44, "character": 23}},
|
||||
"contents": {"value": "My tactic ", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 49, "character": 16}}
|
||||
{"range":
|
||||
{"start": {"line": 49, "character": 15}, "end": {"line": 49, "character": 21}},
|
||||
"contents":
|
||||
{"value": "```lean\nmyNota : Lean.ParserDescr\n```\n***\nMy notation ",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 52, "character": 7}}
|
||||
{"range":
|
||||
{"start": {"line": 52, "character": 7}, "end": {"line": 52, "character": 15}},
|
||||
"contents":
|
||||
{"value": "```lean\n1 : Nat\n```\n***\nMy notation ", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 59, "character": 7}}
|
||||
{"range":
|
||||
{"start": {"line": 59, "character": 7}, "end": {"line": 59, "character": 15}},
|
||||
"contents":
|
||||
{"value": "```lean\nNat\n```\n***\nMy notation ", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 69, "character": 7}}
|
||||
{"range":
|
||||
{"start": {"line": 69, "character": 7}, "end": {"line": 69, "character": 16}},
|
||||
"contents":
|
||||
{"value": "```lean\nNat\n```\n***\nMy ultimate notation ", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 73, "character": 21}}
|
||||
{"range":
|
||||
{"start": {"line": 73, "character": 18}, "end": {"line": 73, "character": 25}},
|
||||
"contents":
|
||||
{"value": "```lean\nmyInfix : Lean.TrailingParserDescr\n```",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 73, "character": 39}}
|
||||
{"range":
|
||||
{"start": {"line": 73, "character": 38}, "end": {"line": 73, "character": 45}},
|
||||
|
|
@ -122,7 +122,7 @@
|
|||
{"value":
|
||||
"```lean\nNat.add (a✝a✝¹ : Nat) : Nat\n```\n***\nAddition of natural numbers.\n\nThis definition is overridden in both the kernel and the compiler to efficiently\nevaluate using the \"bignum\" representation (see `Nat`). The definition provided\nhere is the logical model (and it is soundness-critical that they coincide).\n\n***\n*import Init.Prelude*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 77, "character": 10}}
|
||||
{"range":
|
||||
{"start": {"line": 77, "character": 7}, "end": {"line": 77, "character": 14}},
|
||||
|
|
@ -130,7 +130,7 @@
|
|||
{"value":
|
||||
"```lean\nNat\n```\n***\nAddition of natural numbers.\n\nThis definition is overridden in both the kernel and the compiler to efficiently\nevaluate using the \"bignum\" representation (see `Nat`). The definition provided\nhere is the logical model (and it is soundness-critical that they coincide).\n",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 82, "character": 7}}
|
||||
{"range":
|
||||
{"start": {"line": 82, "character": 7}, "end": {"line": 82, "character": 8}},
|
||||
|
|
@ -138,7 +138,7 @@
|
|||
{"value":
|
||||
"```lean\nNat : Type\n```\n***\nThe type of natural numbers, starting at zero. It is defined as an\ninductive type freely generated by \"zero is a natural number\" and\n\"the successor of a natural number is a natural number\".\n\nYou can prove a theorem `P n` about `n : Nat` by `induction n`, which will\nexpect a proof of the theorem for `P 0`, and a proof of `P (succ i)` assuming\na proof of `P i`. The same method also works to define functions by recursion\non natural numbers: induction and recursion are two expressions of the same\noperation from lean's point of view.\n\n```\nopen Nat\nexample (n : Nat) : n < succ n := by\n induction n with\n | zero =>\n show 0 < 1\n decide\n | succ i ih => -- ih : i < succ i\n show succ i < succ (succ i)\n exact Nat.succ_lt_succ ih\n```\n\nThis type is special-cased by both the kernel and the compiler:\n* The type of expressions contains \"`Nat` literals\" as a primitive constructor,\n and the kernel knows how to reduce zero/succ expressions to nat literals.\n* If implemented naively, this type would represent a numeral `n` in unary as a\n linked list with `n` links, which is horribly inefficient. Instead, the\n runtime itself has a special representation for `Nat` which stores numbers up\n to 2^63 directly and larger numbers use an arbitrary precision \"bignum\"\n library (usually [GMP](https://gmplib.org/)).\n\n***\n*import Init.Prelude*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 87, "character": 14}}
|
||||
{"range":
|
||||
{"start": {"line": 87, "character": 14}, "end": {"line": 87, "character": 36}},
|
||||
|
|
@ -146,7 +146,7 @@
|
|||
{"value":
|
||||
"```lean\nLean.Parser.Term.doSeq : Lean.Parser.Parser\n```\n***\nA `doSeq` is a sequence of `doElem`, the main argument after the `do` keyword and other\ndo elements that take blocks. It can either have the form `\"{\" (doElem \";\"?)* \"}\"` or\n`many1Indent (doElem \";\"?)`, where `many1Indent` ensures that all the items are at\nthe same or higher indentation level as the first line. \n***\n*import Lean.Parser.Do*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 89, "character": 30}}
|
||||
{"range":
|
||||
{"start": {"line": 89, "character": 29}, "end": {"line": 89, "character": 34}},
|
||||
|
|
@ -154,17 +154,17 @@
|
|||
{"value":
|
||||
"```lean\nLean.Parser.Term.doSeq : Lean.Parser.Parser\n```\n***\nA `doSeq` is a sequence of `doElem`, the main argument after the `do` keyword and other\ndo elements that take blocks. It can either have the form `\"{\" (doElem \";\"?)* \"}\"` or\n`many1Indent (doElem \";\"?)`, where `many1Indent` ensures that all the items are at\nthe same or higher indentation level as the first line. \n***\n*import Lean.Parser.Do*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 92, "character": 2}}
|
||||
{"range":
|
||||
{"start": {"line": 92, "character": 0}, "end": {"line": 92, "character": 7}},
|
||||
"contents": {"value": "My command ", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 99, "character": 2}}
|
||||
{"range":
|
||||
{"start": {"line": 99, "character": 0}, "end": {"line": 99, "character": 7}},
|
||||
"contents": {"value": "My command ", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 102, "character": 16}}
|
||||
{"range":
|
||||
{"start": {"line": 102, "character": 16},
|
||||
|
|
@ -173,7 +173,7 @@
|
|||
{"value":
|
||||
"```lean\nLean.Parser.ppSpace : Lean.Parser.Parser\n```\n***\nNo-op parser that advises the pretty printer to emit a space/soft line break. \n***\n*import Lean.Parser.Extra*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 102, "character": 24}}
|
||||
{"range":
|
||||
{"start": {"line": 102, "character": 24},
|
||||
|
|
@ -182,7 +182,7 @@
|
|||
{"value":
|
||||
"```lean\nLean.ParserDescr.sepBy1 (p : Lean.ParserDescr) (sep : String) (psep : Lean.ParserDescr)\n (allowTrailingSep : Bool := false) : Lean.ParserDescr\n```\n***\n`sepBy1` is just like `sepBy`, except it takes 1 or more instead of\n0 or more occurrences of `p`. \n***\n*import Init.Prelude*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 102, "character": 31}}
|
||||
{"range":
|
||||
{"start": {"line": 102, "character": 31},
|
||||
|
|
@ -191,12 +191,12 @@
|
|||
{"value":
|
||||
"```lean\nLean.Parser.Category.term : Lean.Parser.Category\n```\n***\n`term` is the builtin syntax category for terms. A term denotes an expression\nin lean's type theory, for example `2 + 2` is a term. The difference between\n`Term` and `Expr` is that the former is a kind of syntax, while the latter is\nthe result of elaboration. For example `by simp` is also a `Term`, but it elaborates\nto different `Expr`s depending on the context. \n***\n*import Init.Notation*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 111, "character": 2}}
|
||||
{"range":
|
||||
{"start": {"line": 111, "character": 0}, "end": {"line": 111, "character": 8}},
|
||||
"contents": {"value": "My ultimate command ", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 115, "character": 10}}
|
||||
{"range":
|
||||
{"start": {"line": 115, "character": 8},
|
||||
|
|
@ -205,7 +205,7 @@
|
|||
{"value":
|
||||
"Structure instance. `{ x := e, ... }` assigns `e` to field `x`, which may be\ninherited. If `e` is itself a variable called `x`, it can be elided:\n`fun y => { x := 1, y }`.\nA *structure update* of an existing value can be given via `with`:\n`{ point with x := 1 }`.\nThe structure type can be specified if not inferable:\n`{ x := 1, y := 2 : Point }`.\n",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 119, "character": 8}}
|
||||
{"range":
|
||||
{"start": {"line": 119, "character": 8},
|
||||
|
|
@ -214,84 +214,84 @@
|
|||
{"value":
|
||||
"```lean\nid.{u} {α : Sort u} (a : α) : α\n```\n***\nThe identity function. `id` takes an implicit argument `α : Sort u`\n(a type in any universe), and an argument `a : α`, and returns `a`.\n\nAlthough this may look like a useless function, one application of the identity\nfunction is to explicitly put a type on an expression. If `e` has type `T`,\nand `T'` is definitionally equal to `T`, then `@id T' e` typechecks, and lean\nknows that this expression has type `T'` rather than `T`. This can make a\ndifference for typeclass inference, since `T` and `T'` may have different\ntypeclass instances on them. `show T' from e` is sugar for an `@id T' e`\nexpression.\n\n***\n*import Init.Prelude*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 119, "character": 10}}
|
||||
{"range":
|
||||
{"start": {"line": 119, "character": 8},
|
||||
"end": {"line": 119, "character": 21}},
|
||||
"contents": {"value": "```lean\nTrue\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 126, "character": 2}}
|
||||
{"range":
|
||||
{"start": {"line": 126, "character": 2}, "end": {"line": 126, "character": 3}},
|
||||
"contents": {"value": "```lean\nn : Id ℕ\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 133, "character": 9}}
|
||||
{"range":
|
||||
{"start": {"line": 133, "character": 7},
|
||||
"end": {"line": 133, "character": 17}},
|
||||
"contents": {"value": "```lean\nfoo : ℕ\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 138, "character": 7}}
|
||||
{"range":
|
||||
{"start": {"line": 138, "character": 7},
|
||||
"end": {"line": 138, "character": 10}},
|
||||
"contents": {"value": "```lean\nBar.foo : ℕ\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 141, "character": 9}}
|
||||
{"range":
|
||||
{"start": {"line": 141, "character": 7},
|
||||
"end": {"line": 141, "character": 17}},
|
||||
"contents": {"value": "```lean\n_root_.foo : ℕ\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 144, "character": 4}}
|
||||
{"range":
|
||||
{"start": {"line": 144, "character": 4}, "end": {"line": 144, "character": 7}},
|
||||
"contents": {"value": "```lean\nBar.bar : ℕ\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 147, "character": 10}}
|
||||
{"range":
|
||||
{"start": {"line": 147, "character": 10},
|
||||
"end": {"line": 147, "character": 13}},
|
||||
"contents": {"value": "```lean\nBar.Foo : Type\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 147, "character": 17}}
|
||||
{"range":
|
||||
{"start": {"line": 147, "character": 17},
|
||||
"end": {"line": 147, "character": 19}},
|
||||
"contents":
|
||||
{"value": "```lean\nBar.Foo.mk (hi : ℕ) : Foo\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 150, "character": 2}}
|
||||
{"range":
|
||||
{"start": {"line": 150, "character": 2}, "end": {"line": 150, "character": 4}},
|
||||
"contents":
|
||||
{"value": "```lean\nBar.Foo.hi (self : Foo) : ℕ\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 153, "character": 10}}
|
||||
{"range":
|
||||
{"start": {"line": 153, "character": 10},
|
||||
"end": {"line": 153, "character": 13}},
|
||||
"contents": {"value": "```lean\nBar.Bar : Type\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 155, "character": 4}}
|
||||
{"range":
|
||||
{"start": {"line": 155, "character": 4}, "end": {"line": 155, "character": 6}},
|
||||
"contents": {"value": "```lean\nBar.Bar.mk : Bar\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 158, "character": 2}}
|
||||
{"range":
|
||||
{"start": {"line": 158, "character": 0}, "end": {"line": 158, "character": 8}},
|
||||
"contents":
|
||||
{"value": "```lean\nBar.instToStringNat : ToString ℕ\n```",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 160, "character": 9}}
|
||||
{"range":
|
||||
{"start": {"line": 160, "character": 9},
|
||||
"end": {"line": 160, "character": 10}},
|
||||
"contents": {"value": "```lean\nBar.f : ToString ℕ\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 163, "character": 10}}
|
||||
{"range":
|
||||
{"start": {"line": 163, "character": 10},
|
||||
|
|
@ -299,26 +299,26 @@
|
|||
"contents":
|
||||
{"value": "A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. ",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 166, "character": 4}}
|
||||
{"range":
|
||||
{"start": {"line": 166, "character": 4},
|
||||
"end": {"line": 166, "character": 11}},
|
||||
"contents": {"value": "```lean\nBar.foo.bar : ℕ\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 166, "character": 8}}
|
||||
{"range":
|
||||
{"start": {"line": 166, "character": 4},
|
||||
"end": {"line": 166, "character": 11}},
|
||||
"contents": {"value": "```lean\nBar.foo.bar : ℕ\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 173, "character": 6}}
|
||||
{"range":
|
||||
{"start": {"line": 173, "character": 6}, "end": {"line": 173, "character": 7}},
|
||||
"contents": {"value": "```lean\nx : ℕ\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 176, "character": 4}}
|
||||
[{"targetUri": "file://hover.lean",
|
||||
[{"targetUri": "file:///hover.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 173, "character": 6},
|
||||
"end": {"line": 173, "character": 7}},
|
||||
|
|
@ -328,26 +328,26 @@
|
|||
"originSelectionRange":
|
||||
{"start": {"line": 176, "character": 4},
|
||||
"end": {"line": 176, "character": 5}}}]
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 176, "character": 4}}
|
||||
{"range":
|
||||
{"start": {"line": 176, "character": 4}, "end": {"line": 176, "character": 5}},
|
||||
"contents": {"value": "```lean\nx : ℕ\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 180, "character": 12}}
|
||||
{"range":
|
||||
{"start": {"line": 180, "character": 11},
|
||||
"end": {"line": 180, "character": 33}},
|
||||
"contents":
|
||||
{"value": "enable the 'unused variables' linter", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 183, "character": 8}}
|
||||
{"range":
|
||||
{"start": {"line": 183, "character": 8}, "end": {"line": 183, "character": 9}},
|
||||
"contents": {"value": "```lean\nx : ℕ\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 186, "character": 8}}
|
||||
[{"targetUri": "file://hover.lean",
|
||||
[{"targetUri": "file:///hover.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 183, "character": 8},
|
||||
"end": {"line": 183, "character": 9}},
|
||||
|
|
@ -357,18 +357,18 @@
|
|||
"originSelectionRange":
|
||||
{"start": {"line": 186, "character": 8},
|
||||
"end": {"line": 186, "character": 9}}}]
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 186, "character": 8}}
|
||||
{"range":
|
||||
{"start": {"line": 186, "character": 8}, "end": {"line": 186, "character": 9}},
|
||||
"contents": {"value": "```lean\nx : ℕ\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 191, "character": 25}}
|
||||
{"range":
|
||||
{"start": {"line": 191, "character": 25},
|
||||
"end": {"line": 191, "character": 26}},
|
||||
"contents": {"value": "```lean\nn : ℕ\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 194, "character": 2}}
|
||||
{"range":
|
||||
{"start": {"line": 194, "character": 0}, "end": {"line": 194, "character": 9}},
|
||||
|
|
@ -376,7 +376,7 @@
|
|||
{"value":
|
||||
"`declModifiers` is the collection of modifiers on a declaration:\n* a doc comment `/-- ... -/`\n* a list of attributes `@[attr1, attr2]`\n* a visibility specifier, `private` or `protected`\n* `noncomputable`\n* `unsafe`\n* `partial` or `nonrec`\n\nAll modifiers are optional, and have to come in the listed order.\n\n`nestedDeclModifiers` is the same as `declModifiers`, but attributes are printed\non the same line as the declaration. It is used for declarations nested inside other syntax,\nsuch as inductive constructors, structure projections, and `let rec` / `where` definitions. ",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 200, "character": 2}}
|
||||
{"range":
|
||||
{"start": {"line": 200, "character": 2},
|
||||
|
|
@ -385,7 +385,7 @@
|
|||
{"value":
|
||||
"`· tac` focuses on the main goal and tries to solve it using `tac`, or else fails. ",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 203, "character": 28}}
|
||||
{"range":
|
||||
{"start": {"line": 203, "character": 27},
|
||||
|
|
@ -394,12 +394,12 @@
|
|||
{"value":
|
||||
"```lean\nId ℕ\n```\n***\nParentheses, used for grouping expressions (e.g., `a * (b + c)`).\nCan also be used for creating simple functions when combined with `·`. Here are some examples:\n - `(· + 1)` is shorthand for `fun x => x + 1`\n - `(· + ·)` is shorthand for `fun x y => x + y`\n - `(f · a b)` is shorthand for `fun x => f x a b`\n - `(h (· + 1) ·)` is shorthand for `fun x => h (fun y => y + 1) x`\n - also applies to other parentheses-like notations such as `(·, 1)`\n",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 206, "character": 8}}
|
||||
{"range":
|
||||
{"start": {"line": 206, "character": 8}, "end": {"line": 206, "character": 9}},
|
||||
"contents": {"value": "```lean\n?m\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 206, "character": 10}}
|
||||
{"range":
|
||||
{"start": {"line": 206, "character": 8},
|
||||
|
|
@ -408,48 +408,48 @@
|
|||
{"value":
|
||||
"```lean\n?m x✝¹ x✝\n```\n***\n`a + b` computes the sum of `a` and `b`.\nThe meaning of this notation is type-dependent. ",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 215, "character": 28}}
|
||||
{"range":
|
||||
{"start": {"line": 215, "character": 28},
|
||||
"end": {"line": 215, "character": 29}},
|
||||
"contents": {"value": "```lean\nx : α\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 217, "character": 28}}
|
||||
{"range":
|
||||
{"start": {"line": 217, "character": 28},
|
||||
"end": {"line": 217, "character": 29}},
|
||||
"contents": {"value": "```lean\nα\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 219, "character": 31}}
|
||||
{"range":
|
||||
{"start": {"line": 219, "character": 31},
|
||||
"end": {"line": 219, "character": 32}},
|
||||
"contents": {"value": "```lean\nx : α\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 222, "character": 22}}
|
||||
{"range":
|
||||
{"start": {"line": 222, "character": 22},
|
||||
"end": {"line": 222, "character": 32}},
|
||||
"contents": {"value": "my_intro tactic ", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 222, "character": 31}}
|
||||
{"range":
|
||||
{"start": {"line": 222, "character": 31},
|
||||
"end": {"line": 222, "character": 32}},
|
||||
"contents": {"value": "```lean\nα\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 229, "character": 22}}
|
||||
{"range":
|
||||
{"start": {"line": 229, "character": 22},
|
||||
"end": {"line": 229, "character": 32}},
|
||||
"contents": {"value": "my_intro tactic ", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 232, "character": 8}}
|
||||
{"range":
|
||||
{"start": {"line": 232, "character": 8}, "end": {"line": 232, "character": 9}},
|
||||
"contents": {"value": "```lean\nx : ℕ\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 235, "character": 4}}
|
||||
{"range":
|
||||
{"start": {"line": 235, "character": 4}, "end": {"line": 235, "character": 8}},
|
||||
|
|
@ -457,7 +457,7 @@
|
|||
{"value":
|
||||
"```lean\nNat.zero : ℕ\n```\n***\n`Nat.zero`, normally written `0 : Nat`, is the smallest natural number.\nThis is one of the two constructors of `Nat`. \n***\n*import Init.Prelude*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 238, "character": 4}}
|
||||
{"range":
|
||||
{"start": {"line": 238, "character": 4}, "end": {"line": 238, "character": 8}},
|
||||
|
|
@ -465,24 +465,24 @@
|
|||
{"value":
|
||||
"```lean\nNat.succ (n : ℕ) : ℕ\n```\n***\nThe successor function on natural numbers, `succ n = n + 1`.\nThis is one of the two constructors of `Nat`. \n***\n*import Init.Prelude*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 238, "character": 9}}
|
||||
{"range":
|
||||
{"start": {"line": 238, "character": 9},
|
||||
"end": {"line": 238, "character": 10}},
|
||||
"contents": {"value": "```lean\nx : ℕ\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 242, "character": 8}}
|
||||
{"range":
|
||||
{"start": {"line": 242, "character": 8}, "end": {"line": 242, "character": 9}},
|
||||
"contents": {"value": "```lean\nx : ℕ\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 244, "character": 12}}
|
||||
{"range":
|
||||
{"start": {"line": 244, "character": 12},
|
||||
"end": {"line": 244, "character": 13}},
|
||||
"contents": {"value": "```lean\nx : ℕ\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 246, "character": 4}}
|
||||
{"range":
|
||||
{"start": {"line": 246, "character": 4}, "end": {"line": 246, "character": 8}},
|
||||
|
|
@ -490,7 +490,7 @@
|
|||
{"value":
|
||||
"```lean\nNat.zero : ℕ\n```\n***\n`Nat.zero`, normally written `0 : Nat`, is the smallest natural number.\nThis is one of the two constructors of `Nat`. \n***\n*import Init.Prelude*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 249, "character": 9}}
|
||||
{"range":
|
||||
{"start": {"line": 249, "character": 9},
|
||||
|
|
@ -499,13 +499,13 @@
|
|||
{"value":
|
||||
"```lean\nℕ\n```\n***\nA placeholder term, to be synthesized by unification. ",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 249, "character": 11}}
|
||||
{"range":
|
||||
{"start": {"line": 249, "character": 11},
|
||||
"end": {"line": 249, "character": 13}},
|
||||
"contents": {"value": "```lean\nih : True\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 254, "character": 6}}
|
||||
{"range":
|
||||
{"start": {"line": 254, "character": 4}, "end": {"line": 254, "character": 9}},
|
||||
|
|
@ -513,7 +513,7 @@
|
|||
{"value":
|
||||
"```lean\nNat.zero : ℕ\n```\n***\n`Nat.zero`, normally written `0 : Nat`, is the smallest natural number.\nThis is one of the two constructors of `Nat`. \n***\n*import Init.Prelude*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 254, "character": 15}}
|
||||
{"range":
|
||||
{"start": {"line": 254, "character": 13},
|
||||
|
|
@ -522,7 +522,7 @@
|
|||
{"value":
|
||||
"```lean\nNat.zero : ℕ\n```\n***\n`Nat.zero`, normally written `0 : Nat`, is the smallest natural number.\nThis is one of the two constructors of `Nat`. \n***\n*import Init.Prelude*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 257, "character": 6}}
|
||||
{"range":
|
||||
{"start": {"line": 257, "character": 4}, "end": {"line": 257, "character": 9}},
|
||||
|
|
@ -530,7 +530,7 @@
|
|||
{"value":
|
||||
"```lean\nNat.succ (n : ℕ) : ℕ\n```\n***\nThe successor function on natural numbers, `succ n = n + 1`.\nThis is one of the two constructors of `Nat`. \n***\n*import Init.Prelude*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 257, "character": 17}}
|
||||
{"range":
|
||||
{"start": {"line": 257, "character": 15},
|
||||
|
|
@ -539,7 +539,7 @@
|
|||
{"value":
|
||||
"```lean\nNat.succ (n : ℕ) : ℕ\n```\n***\nThe successor function on natural numbers, `succ n = n + 1`.\nThis is one of the two constructors of `Nat`. \n***\n*import Init.Prelude*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 260, "character": 27}}
|
||||
{"range":
|
||||
{"start": {"line": 260, "character": 27},
|
||||
|
|
@ -548,7 +548,7 @@
|
|||
{"value":
|
||||
"```lean\nInhabited.mk.{u} {α : Sort u} (default : α) : Inhabited α\n```\n***\n*import Init.Prelude*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 260, "character": 28}}
|
||||
{"range":
|
||||
{"start": {"line": 260, "character": 28},
|
||||
|
|
@ -557,7 +557,7 @@
|
|||
{"value":
|
||||
"```lean\nNat.zero : ℕ\n```\n***\n`Nat.zero`, normally written `0 : Nat`, is the smallest natural number.\nThis is one of the two constructors of `Nat`. \n***\n*import Init.Prelude*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 266, "character": 2}}
|
||||
{"range":
|
||||
{"start": {"line": 266, "character": 2}, "end": {"line": 266, "character": 3}},
|
||||
|
|
@ -565,25 +565,25 @@
|
|||
{"value":
|
||||
"```lean\nlet x :=\n match 0 with\n | x => 0;\nℕ\n```\n***\nA placeholder term, to be synthesized by unification. ",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 269, "character": 4}}
|
||||
{"range":
|
||||
{"start": {"line": 269, "character": 4}, "end": {"line": 269, "character": 8}},
|
||||
"contents":
|
||||
{"value": "```lean\nauto (o : ℕ := by exact 1) : ℕ\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 274, "character": 22}}
|
||||
{"range":
|
||||
{"start": {"line": 274, "character": 22},
|
||||
"end": {"line": 274, "character": 23}},
|
||||
"contents": {"value": "```lean\nx : ℕ\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 274, "character": 13}}
|
||||
{"range":
|
||||
{"start": {"line": 274, "character": 13},
|
||||
"end": {"line": 274, "character": 15}},
|
||||
"contents": {"value": "```lean\n_e : 1 = x\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 280, "character": 13}}
|
||||
{"range":
|
||||
{"start": {"line": 280, "character": 13},
|
||||
|
|
@ -592,7 +592,7 @@
|
|||
{"value":
|
||||
"```lean\nList.nil.{u} {α : Type u} : List α\n```\n***\n`[]` is the empty list. \n***\n*import Init.Prelude*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 282, "character": 13}}
|
||||
{"range":
|
||||
{"start": {"line": 282, "character": 11},
|
||||
|
|
@ -601,7 +601,7 @@
|
|||
{"value":
|
||||
"```lean\nList.cons.{u} {α : Type u} (head : α) (tail : List α) : List α\n```\n***\nIf `a : α` and `l : List α`, then `cons a l`, or `a :: l`, is the\nlist whose first element is `a` and with `l` as the rest of the list. \n***\n*import Init.Prelude*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 284, "character": 18}}
|
||||
{"range":
|
||||
{"start": {"line": 284, "character": 17},
|
||||
|
|
@ -610,7 +610,7 @@
|
|||
{"value":
|
||||
"```lean\nList.map.{u, v} {α : Type u} {β : Type v} (f : α → β) (a✝ : List α) : List β\n```\n***\n`O(|l|)`. `map f l` applies `f` to each element of the list.\n* `map f [a, b, c] = [f a, f b, f c]`\n\n***\n*import Init.Data.List.Basic*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 287, "character": 26}}
|
||||
{"range":
|
||||
{"start": {"line": 287, "character": 25},
|
||||
|
|
@ -619,7 +619,7 @@
|
|||
{"value":
|
||||
"```lean\nList.zip.{u, v} {α : Type u} {β : Type v} (a✝ : List α) (a✝¹ : List β) : List (α × β)\n```\n***\n`O(min |xs| |ys|)`. Combines the two lists into a list of pairs, with one element from each list.\nThe longer list is truncated to match the shorter list.\n* `zip [x₁, x₂, x₃] [y₁, y₂, y₃, y₄] = [(x₁, y₁), (x₂, y₂), (x₃, y₃)]`\n\n***\n*import Init.Data.List.Basic*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hover.lean"},
|
||||
{"textDocument": {"uri": "file:///hover.lean"},
|
||||
"position": {"line": 287, "character": 19}}
|
||||
{"range":
|
||||
{"start": {"line": 287, "character": 19},
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{"textDocument": {"uri": "file://hoverAt.lean"},
|
||||
{"textDocument": {"uri": "file:///hoverAt.lean"},
|
||||
"position": {"line": 8, "character": 18}}
|
||||
{"range":
|
||||
{"start": {"line": 8, "character": 17}, "end": {"line": 8, "character": 34}},
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{"textDocument": {"uri": "file://hoverBinderUndescore.lean"},
|
||||
{"textDocument": {"uri": "file:///hoverBinderUndescore.lean"},
|
||||
"position": {"line": 1, "character": 5}}
|
||||
{"range":
|
||||
{"start": {"line": 1, "character": 5}, "end": {"line": 1, "character": 6}},
|
||||
|
|
@ -6,7 +6,7 @@
|
|||
{"value":
|
||||
"```lean\nNat\n```\n***\nA placeholder term, to be synthesized by unification. ",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hoverBinderUndescore.lean"},
|
||||
{"textDocument": {"uri": "file:///hoverBinderUndescore.lean"},
|
||||
"position": {"line": 1, "character": 7}}
|
||||
{"range":
|
||||
{"start": {"line": 1, "character": 7}, "end": {"line": 1, "character": 8}},
|
||||
|
|
@ -14,7 +14,7 @@
|
|||
{"value":
|
||||
"```lean\nBool\n```\n***\nA placeholder term, to be synthesized by unification. ",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hoverBinderUndescore.lean"},
|
||||
{"textDocument": {"uri": "file:///hoverBinderUndescore.lean"},
|
||||
"position": {"line": 6, "character": 6}}
|
||||
{"range":
|
||||
{"start": {"line": 6, "character": 6}, "end": {"line": 6, "character": 7}},
|
||||
|
|
@ -22,7 +22,7 @@
|
|||
{"value":
|
||||
"```lean\nNat\n```\n***\nA placeholder term, to be synthesized by unification. ",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hoverBinderUndescore.lean"},
|
||||
{"textDocument": {"uri": "file:///hoverBinderUndescore.lean"},
|
||||
"position": {"line": 6, "character": 8}}
|
||||
{"range":
|
||||
{"start": {"line": 6, "character": 8}, "end": {"line": 6, "character": 9}},
|
||||
|
|
@ -30,7 +30,7 @@
|
|||
{"value":
|
||||
"```lean\nBool\n```\n***\nA placeholder term, to be synthesized by unification. ",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hoverBinderUndescore.lean"},
|
||||
{"textDocument": {"uri": "file:///hoverBinderUndescore.lean"},
|
||||
"position": {"line": 11, "character": 6}}
|
||||
{"range":
|
||||
{"start": {"line": 11, "character": 6}, "end": {"line": 11, "character": 7}},
|
||||
|
|
@ -38,7 +38,7 @@
|
|||
{"value":
|
||||
"```lean\nNat\n```\n***\nA placeholder term, to be synthesized by unification. ",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hoverBinderUndescore.lean"},
|
||||
{"textDocument": {"uri": "file:///hoverBinderUndescore.lean"},
|
||||
"position": {"line": 11, "character": 8}}
|
||||
{"range":
|
||||
{"start": {"line": 11, "character": 8}, "end": {"line": 11, "character": 9}},
|
||||
|
|
|
|||
|
|
@ -1,20 +1,20 @@
|
|||
{"textDocument": {"uri": "file://hoverDot.lean"},
|
||||
{"textDocument": {"uri": "file:///hoverDot.lean"},
|
||||
"position": {"line": 8, "character": 11}}
|
||||
{"range":
|
||||
{"start": {"line": 8, "character": 7}, "end": {"line": 8, "character": 14}},
|
||||
"contents": {"value": "```lean\nFoo.foo : Foo\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hoverDot.lean"},
|
||||
{"textDocument": {"uri": "file:///hoverDot.lean"},
|
||||
"position": {"line": 12, "character": 7}}
|
||||
{"range":
|
||||
{"start": {"line": 12, "character": 7}, "end": {"line": 12, "character": 10}},
|
||||
"contents": {"value": "```lean\nFoo.foo : Foo\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hoverDot.lean"},
|
||||
{"textDocument": {"uri": "file:///hoverDot.lean"},
|
||||
"position": {"line": 12, "character": 11}}
|
||||
{"range":
|
||||
{"start": {"line": 12, "character": 11}, "end": {"line": 12, "character": 13}},
|
||||
"contents":
|
||||
{"value": "```lean\nFoo.f₁ (self : Foo) : Nat\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hoverDot.lean"},
|
||||
{"textDocument": {"uri": "file:///hoverDot.lean"},
|
||||
"position": {"line": 12, "character": 14}}
|
||||
{"range":
|
||||
{"start": {"line": 12, "character": 14}, "end": {"line": 12, "character": 18}},
|
||||
|
|
@ -22,13 +22,13 @@
|
|||
{"value":
|
||||
"```lean\nNat.succ (n : Nat) : Nat\n```\n***\nThe successor function on natural numbers, `succ n = n + 1`.\nThis is one of the two constructors of `Nat`. \n***\n*import Init.Prelude*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hoverDot.lean"},
|
||||
{"textDocument": {"uri": "file:///hoverDot.lean"},
|
||||
"position": {"line": 16, "character": 11}}
|
||||
{"range":
|
||||
{"start": {"line": 16, "character": 11}, "end": {"line": 16, "character": 13}},
|
||||
"contents":
|
||||
{"value": "```lean\nFoo.f₂ (f : Foo) : Nat\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hoverDot.lean"},
|
||||
{"textDocument": {"uri": "file:///hoverDot.lean"},
|
||||
"position": {"line": 16, "character": 14}}
|
||||
{"range":
|
||||
{"start": {"line": 16, "character": 14}, "end": {"line": 16, "character": 18}},
|
||||
|
|
@ -36,13 +36,13 @@
|
|||
{"value":
|
||||
"```lean\nNat.succ (n : Nat) : Nat\n```\n***\nThe successor function on natural numbers, `succ n = n + 1`.\nThis is one of the two constructors of `Nat`. \n***\n*import Init.Prelude*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hoverDot.lean"},
|
||||
{"textDocument": {"uri": "file:///hoverDot.lean"},
|
||||
"position": {"line": 19, "character": 13}}
|
||||
{"range":
|
||||
{"start": {"line": 19, "character": 13}, "end": {"line": 19, "character": 15}},
|
||||
"contents":
|
||||
{"value": "```lean\nFoo.f₂ (f : Foo) : Nat\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hoverDot.lean"},
|
||||
{"textDocument": {"uri": "file:///hoverDot.lean"},
|
||||
"position": {"line": 19, "character": 16}}
|
||||
{"range":
|
||||
{"start": {"line": 19, "character": 16}, "end": {"line": 19, "character": 20}},
|
||||
|
|
@ -50,13 +50,13 @@
|
|||
{"value":
|
||||
"```lean\nNat.succ (n : Nat) : Nat\n```\n***\nThe successor function on natural numbers, `succ n = n + 1`.\nThis is one of the two constructors of `Nat`. \n***\n*import Init.Prelude*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hoverDot.lean"},
|
||||
{"textDocument": {"uri": "file:///hoverDot.lean"},
|
||||
"position": {"line": 22, "character": 14}}
|
||||
{"range":
|
||||
{"start": {"line": 22, "character": 14}, "end": {"line": 22, "character": 16}},
|
||||
"contents":
|
||||
{"value": "```lean\nFoo.f₂ (f : Foo) : Nat\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://hoverDot.lean"},
|
||||
{"textDocument": {"uri": "file:///hoverDot.lean"},
|
||||
"position": {"line": 22, "character": 17}}
|
||||
{"range":
|
||||
{"start": {"line": 22, "character": 17}, "end": {"line": 22, "character": 21}},
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
{"textDocument": {"uri": "file://hoverException.lean"},
|
||||
{"textDocument": {"uri": "file:///hoverException.lean"},
|
||||
"position": {"line": 2, "character": 14}}
|
||||
null
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
{"textDocument": {"uri": "file://inWordCompletion.lean"},
|
||||
{"textDocument": {"uri": "file:///inWordCompletion.lean"},
|
||||
"position": {"line": 5, "character": 10}}
|
||||
{"items":
|
||||
[{"label": "gfabc", "kind": 3, "detail": "Nat → Nat"},
|
||||
{"label": "gfacc", "kind": 3, "detail": "Nat → Nat"},
|
||||
{"label": "gfadc", "kind": 3, "detail": "Nat → Nat"}],
|
||||
"isIncomplete": true}
|
||||
{"textDocument": {"uri": "file://inWordCompletion.lean"},
|
||||
{"textDocument": {"uri": "file:///inWordCompletion.lean"},
|
||||
"position": {"line": 13, "character": 14}}
|
||||
{"items":
|
||||
[{"label": "gfabc", "kind": 3, "detail": "Nat → Nat"},
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
{"textDocument": {"uri": "file://infoIssues.lean"},
|
||||
{"textDocument": {"uri": "file:///infoIssues.lean"},
|
||||
"position": {"line": 3, "character": 2}}
|
||||
{"rendered":
|
||||
"```lean\nx y : Nat\nh : x = y\nthis : y = x\n⊢ 0 + x = y + 0\n```",
|
||||
"goals": ["x y : Nat\nh : x = y\nthis : y = x\n⊢ 0 + x = y + 0"]}
|
||||
{"textDocument": {"uri": "file://infoIssues.lean"},
|
||||
{"textDocument": {"uri": "file:///infoIssues.lean"},
|
||||
"position": {"line": 13, "character": 33}}
|
||||
{"rendered":
|
||||
"```lean\np : Prop\nn✝ : Nat\n⊢ Nat.succ n✝ = 0 + (0 + Nat.succ n✝)\n```\n---\n```lean\np : Prop\nn✝ : Nat\n⊢ Nat.succ n✝ = 0 + Nat.succ n✝\n```\n---\n```lean\np : Prop\nn✝ : Nat\n⊢ Nat.succ n✝ = Nat.succ n✝\n```",
|
||||
|
|
@ -11,30 +11,30 @@
|
|||
["p : Prop\nn✝ : Nat\n⊢ Nat.succ n✝ = 0 + (0 + Nat.succ n✝)",
|
||||
"p : Prop\nn✝ : Nat\n⊢ Nat.succ n✝ = 0 + Nat.succ n✝",
|
||||
"p : Prop\nn✝ : Nat\n⊢ Nat.succ n✝ = Nat.succ n✝"]}
|
||||
{"textDocument": {"uri": "file://infoIssues.lean"},
|
||||
{"textDocument": {"uri": "file:///infoIssues.lean"},
|
||||
"position": {"line": 13, "character": 36}}
|
||||
{"rendered":
|
||||
"```lean\np : Prop\nn✝ : Nat\n⊢ Nat.succ n✝ = 0 + (0 + Nat.succ n✝)\n```\n---\n```lean\np : Prop\nn✝ : Nat\n⊢ Nat.succ n✝ = 0 + Nat.succ n✝\n```",
|
||||
"goals":
|
||||
["p : Prop\nn✝ : Nat\n⊢ Nat.succ n✝ = 0 + (0 + Nat.succ n✝)",
|
||||
"p : Prop\nn✝ : Nat\n⊢ Nat.succ n✝ = 0 + Nat.succ n✝"]}
|
||||
{"textDocument": {"uri": "file://infoIssues.lean"},
|
||||
{"textDocument": {"uri": "file:///infoIssues.lean"},
|
||||
"position": {"line": 15, "character": 2}}
|
||||
{"rendered": "```lean\ncase right\np : Prop\nx : Nat\n⊢ p\n```",
|
||||
"goals": ["case right\np : Prop\nx : Nat\n⊢ p"]}
|
||||
{"textDocument": {"uri": "file://infoIssues.lean"},
|
||||
{"textDocument": {"uri": "file:///infoIssues.lean"},
|
||||
"position": {"line": 25, "character": 35}}
|
||||
{"rendered":
|
||||
"```lean\np : Prop\nx y : Nat\n⊢ y + 1 = 0 + (0 + (y + 1))\n```\n---\n```lean\np : Prop\nx y : Nat\n⊢ y + 1 = 0 + (y + 1)\n```",
|
||||
"goals":
|
||||
["p : Prop\nx y : Nat\n⊢ y + 1 = 0 + (0 + (y + 1))",
|
||||
"p : Prop\nx y : Nat\n⊢ y + 1 = 0 + (y + 1)"]}
|
||||
{"textDocument": {"uri": "file://infoIssues.lean"},
|
||||
{"textDocument": {"uri": "file:///infoIssues.lean"},
|
||||
"position": {"line": 25, "character": 9}}
|
||||
{"rendered":
|
||||
"```lean\np : Prop\nx y : Nat\n⊢ y + 1 = 0 + (0 + (0 + (y + 1)))\n```",
|
||||
"goals": ["p : Prop\nx y : Nat\n⊢ y + 1 = 0 + (0 + (0 + (y + 1)))"]}
|
||||
{"textDocument": {"uri": "file://infoIssues.lean"},
|
||||
{"textDocument": {"uri": "file:///infoIssues.lean"},
|
||||
"position": {"line": 27, "character": 2}}
|
||||
{"rendered": "```lean\ncase right\np : Prop\nx : Nat\n⊢ p\n```",
|
||||
"goals": ["case right\np : Prop\nx : Nat\n⊢ p"]}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{"textDocument": {"uri": "file://internalNamesIssue.lean"},
|
||||
{"textDocument": {"uri": "file:///internalNamesIssue.lean"},
|
||||
"position": {"line": 9, "character": 11}}
|
||||
{"items":
|
||||
[{"label": "bla", "kind": 3, "detail": "Nat → Nat"},
|
||||
|
|
|
|||
|
|
@ -1,27 +1,27 @@
|
|||
{"textDocument": {"uri": "file://jumpMutual.lean"},
|
||||
{"textDocument": {"uri": "file:///jumpMutual.lean"},
|
||||
"position": {"line": 6, "character": 23}}
|
||||
[]
|
||||
{"textDocument": {"uri": "file://jumpMutual.lean"},
|
||||
{"textDocument": {"uri": "file:///jumpMutual.lean"},
|
||||
"position": {"line": 7, "character": 17}}
|
||||
[{"targetUri": "file://jumpMutual.lean",
|
||||
[{"targetUri": "file:///jumpMutual.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 10, "character": 2}, "end": {"line": 10, "character": 3}},
|
||||
"targetRange":
|
||||
{"start": {"line": 10, "character": 2}, "end": {"line": 10, "character": 3}},
|
||||
"originSelectionRange":
|
||||
{"start": {"line": 7, "character": 17}, "end": {"line": 7, "character": 18}}}]
|
||||
{"textDocument": {"uri": "file://jumpMutual.lean"},
|
||||
{"textDocument": {"uri": "file:///jumpMutual.lean"},
|
||||
"position": {"line": 7, "character": 11}}
|
||||
[{"targetUri": "file://jumpMutual.lean",
|
||||
[{"targetUri": "file:///jumpMutual.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 16, "character": 4}, "end": {"line": 16, "character": 5}},
|
||||
"targetRange":
|
||||
{"start": {"line": 16, "character": 4}, "end": {"line": 16, "character": 5}},
|
||||
"originSelectionRange":
|
||||
{"start": {"line": 7, "character": 11}, "end": {"line": 7, "character": 12}}}]
|
||||
{"textDocument": {"uri": "file://jumpMutual.lean"},
|
||||
{"textDocument": {"uri": "file:///jumpMutual.lean"},
|
||||
"position": {"line": 13, "character": 13}}
|
||||
[{"targetUri": "file://jumpMutual.lean",
|
||||
[{"targetUri": "file:///jumpMutual.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 10, "character": 2}, "end": {"line": 10, "character": 3}},
|
||||
"targetRange":
|
||||
|
|
@ -29,9 +29,9 @@
|
|||
"originSelectionRange":
|
||||
{"start": {"line": 13, "character": 13},
|
||||
"end": {"line": 13, "character": 14}}}]
|
||||
{"textDocument": {"uri": "file://jumpMutual.lean"},
|
||||
{"textDocument": {"uri": "file:///jumpMutual.lean"},
|
||||
"position": {"line": 13, "character": 19}}
|
||||
[{"targetUri": "file://jumpMutual.lean",
|
||||
[{"targetUri": "file:///jumpMutual.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 2, "character": 4}, "end": {"line": 2, "character": 5}},
|
||||
"targetRange":
|
||||
|
|
@ -39,9 +39,9 @@
|
|||
"originSelectionRange":
|
||||
{"start": {"line": 13, "character": 19},
|
||||
"end": {"line": 13, "character": 20}}}]
|
||||
{"textDocument": {"uri": "file://jumpMutual.lean"},
|
||||
{"textDocument": {"uri": "file:///jumpMutual.lean"},
|
||||
"position": {"line": 20, "character": 17}}
|
||||
[{"targetUri": "file://jumpMutual.lean",
|
||||
[{"targetUri": "file:///jumpMutual.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 17, "character": 10},
|
||||
"end": {"line": 17, "character": 11}},
|
||||
|
|
@ -51,9 +51,9 @@
|
|||
"originSelectionRange":
|
||||
{"start": {"line": 20, "character": 17},
|
||||
"end": {"line": 20, "character": 18}}}]
|
||||
{"textDocument": {"uri": "file://jumpMutual.lean"},
|
||||
{"textDocument": {"uri": "file:///jumpMutual.lean"},
|
||||
"position": {"line": 22, "character": 2}}
|
||||
[{"targetUri": "file://jumpMutual.lean",
|
||||
[{"targetUri": "file:///jumpMutual.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 17, "character": 10},
|
||||
"end": {"line": 17, "character": 11}},
|
||||
|
|
@ -62,9 +62,9 @@
|
|||
"end": {"line": 17, "character": 11}},
|
||||
"originSelectionRange":
|
||||
{"start": {"line": 22, "character": 2}, "end": {"line": 22, "character": 3}}}]
|
||||
{"textDocument": {"uri": "file://jumpMutual.lean"},
|
||||
{"textDocument": {"uri": "file:///jumpMutual.lean"},
|
||||
"position": {"line": 22, "character": 8}}
|
||||
[{"targetUri": "file://jumpMutual.lean",
|
||||
[{"targetUri": "file:///jumpMutual.lean",
|
||||
"targetSelectionRange":
|
||||
{"start": {"line": 2, "character": 4}, "end": {"line": 2, "character": 5}},
|
||||
"targetRange":
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{"textDocument": {"uri": "file://keywordCompletion.lean"},
|
||||
{"textDocument": {"uri": "file:///keywordCompletion.lean"},
|
||||
"position": {"line": 4, "character": 10}}
|
||||
{"items":
|
||||
[{"label": "bin", "kind": 21, "detail": "Type 1"},
|
||||
|
|
@ -7,7 +7,7 @@
|
|||
{"label": "binrel%", "kind": 14, "detail": "keyword"},
|
||||
{"label": "binrel_no_prop%", "kind": 14, "detail": "keyword"}],
|
||||
"isIncomplete": true}
|
||||
{"textDocument": {"uri": "file://keywordCompletion.lean"},
|
||||
{"textDocument": {"uri": "file:///keywordCompletion.lean"},
|
||||
"position": {"line": 4, "character": 13}}
|
||||
{"items": [{"label": "binop_lazy%", "kind": 14, "detail": "keyword"}],
|
||||
"isIncomplete": true}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{"textDocument": {"uri": "file://lean3HoverIssue.lean"},
|
||||
{"textDocument": {"uri": "file:///lean3HoverIssue.lean"},
|
||||
"position": {"line": 0, "character": 55}}
|
||||
{"range":
|
||||
{"start": {"line": 0, "character": 54}, "end": {"line": 0, "character": 58}},
|
||||
|
|
@ -6,12 +6,12 @@
|
|||
{"value":
|
||||
"```lean\nEq.symm.{u} {α : Sort u} {a b : α} (h : a = b) : b = a\n```\n***\nEquality is symmetric: if `a = b` then `b = a`.\n\nBecause this is in the `Eq` namespace, if you have a variable `h : a = b`,\n`h.symm` can be used as shorthand for `Eq.symm h` as a proof of `b = a`.\n\nFor more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)\n\n***\n*import Init.Prelude*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://lean3HoverIssue.lean"},
|
||||
{"textDocument": {"uri": "file:///lean3HoverIssue.lean"},
|
||||
"position": {"line": 0, "character": 52}}
|
||||
{"range":
|
||||
{"start": {"line": 0, "character": 52}, "end": {"line": 0, "character": 53}},
|
||||
"contents": {"value": "```lean\nh : x = y\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://lean3HoverIssue.lean"},
|
||||
{"textDocument": {"uri": "file:///lean3HoverIssue.lean"},
|
||||
"position": {"line": 4, "character": 46}}
|
||||
{"range":
|
||||
{"start": {"line": 4, "character": 45}, "end": {"line": 4, "character": 49}},
|
||||
|
|
@ -19,7 +19,7 @@
|
|||
{"value":
|
||||
"```lean\nEq.symm.{u} {α : Sort u} {a b : α} (h : a = b) : b = a\n```\n***\nEquality is symmetric: if `a = b` then `b = a`.\n\nBecause this is in the `Eq` namespace, if you have a variable `h : a = b`,\n`h.symm` can be used as shorthand for `Eq.symm h` as a proof of `b = a`.\n\nFor more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)\n\n***\n*import Init.Prelude*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://lean3HoverIssue.lean"},
|
||||
{"textDocument": {"uri": "file:///lean3HoverIssue.lean"},
|
||||
"position": {"line": 7, "character": 54}}
|
||||
{"range":
|
||||
{"start": {"line": 7, "character": 53}, "end": {"line": 7, "character": 60}},
|
||||
|
|
@ -27,7 +27,7 @@
|
|||
{"value":
|
||||
"```lean\nEq.symm.{u} {α : Sort u} {a b : α} (h : a = b) : b = a\n```\n***\nEquality is symmetric: if `a = b` then `b = a`.\n\nBecause this is in the `Eq` namespace, if you have a variable `h : a = b`,\n`h.symm` can be used as shorthand for `Eq.symm h` as a proof of `b = a`.\n\nFor more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)\n\n***\n*import Init.Prelude*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://lean3HoverIssue.lean"},
|
||||
{"textDocument": {"uri": "file:///lean3HoverIssue.lean"},
|
||||
"position": {"line": 7, "character": 65}}
|
||||
{"range":
|
||||
{"start": {"line": 7, "character": 62}, "end": {"line": 7, "character": 69}},
|
||||
|
|
@ -35,12 +35,12 @@
|
|||
{"value":
|
||||
"```lean\nEq.symm.{u} {α : Sort u} {a b : α} (h : a = b) : b = a\n```\n***\nEquality is symmetric: if `a = b` then `b = a`.\n\nBecause this is in the `Eq` namespace, if you have a variable `h : a = b`,\n`h.symm` can be used as shorthand for `Eq.symm h` as a proof of `b = a`.\n\nFor more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)\n\n***\n*import Init.Prelude*",
|
||||
"kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://lean3HoverIssue.lean"},
|
||||
{"textDocument": {"uri": "file:///lean3HoverIssue.lean"},
|
||||
"position": {"line": 7, "character": 70}}
|
||||
{"range":
|
||||
{"start": {"line": 7, "character": 70}, "end": {"line": 7, "character": 71}},
|
||||
"contents": {"value": "```lean\nh : x = y\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://lean3HoverIssue.lean"},
|
||||
{"textDocument": {"uri": "file:///lean3HoverIssue.lean"},
|
||||
"position": {"line": 7, "character": 72}}
|
||||
{"range":
|
||||
{"start": {"line": 7, "character": 72}, "end": {"line": 7, "character": 76}},
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{"textDocument": {"uri": "file://macroGoalIssue.lean"},
|
||||
{"textDocument": {"uri": "file:///macroGoalIssue.lean"},
|
||||
"position": {"line": 2, "character": 2}}
|
||||
{"rendered": "```lean\nn : Nat\nthis : n = 0 + n\n⊢ True\n```",
|
||||
"goals": ["n : Nat\nthis : n = 0 + n\n⊢ True"]}
|
||||
|
|
|
|||
|
|
@ -1,22 +1,22 @@
|
|||
{"textDocument": {"uri": "file://match.lean"},
|
||||
{"textDocument": {"uri": "file:///match.lean"},
|
||||
"position": {"line": 6, "character": 11}}
|
||||
{"items":
|
||||
[{"label": "fn1", "kind": 5, "detail": "S → Nat"},
|
||||
{"label": "name", "kind": 5, "detail": "S → String"},
|
||||
{"label": "value", "kind": 5, "detail": "S → Bool"}],
|
||||
"isIncomplete": true}
|
||||
{"textDocument": {"uri": "file://match.lean"},
|
||||
{"textDocument": {"uri": "file:///match.lean"},
|
||||
"position": {"line": 10, "character": 10}}
|
||||
{"items":
|
||||
[{"label": "fn1", "kind": 5, "detail": "S → Nat"},
|
||||
{"label": "name", "kind": 5, "detail": "S → String"},
|
||||
{"label": "value", "kind": 5, "detail": "S → Bool"}],
|
||||
"isIncomplete": true}
|
||||
{"textDocument": {"uri": "file://match.lean"},
|
||||
{"textDocument": {"uri": "file:///match.lean"},
|
||||
"position": {"line": 14, "character": 2}}
|
||||
{"rendered": "```lean\nx : Nat\n⊢ 0 + x = x\n```",
|
||||
"goals": ["x : Nat\n⊢ 0 + x = x"]}
|
||||
{"textDocument": {"uri": "file://match.lean"},
|
||||
{"textDocument": {"uri": "file:///match.lean"},
|
||||
"position": {"line": 16, "character": 9}}
|
||||
{"rendered": "```lean\nx : Nat\n⊢ 0 + 0 = 0\n```",
|
||||
"goals": ["x : Nat\n⊢ 0 + 0 = 0"]}
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
{"textDocument": {"uri": "file://matchPatternHover.lean"},
|
||||
{"textDocument": {"uri": "file:///matchPatternHover.lean"},
|
||||
"position": {"line": 13, "character": 7}}
|
||||
{"range":
|
||||
{"start": {"line": 13, "character": 7}, "end": {"line": 13, "character": 9}},
|
||||
"contents": {"value": "```lean\nas : HList β is✝\n```", "kind": "markdown"}}
|
||||
{"textDocument": {"uri": "file://matchPatternHover.lean"},
|
||||
{"textDocument": {"uri": "file:///matchPatternHover.lean"},
|
||||
"position": {"line": 13, "character": 17}}
|
||||
{"range":
|
||||
{"start": {"line": 13, "character": 17}, "end": {"line": 13, "character": 18}},
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{"textDocument": {"uri": "file://matchStxCompletion.lean"},
|
||||
{"textDocument": {"uri": "file:///matchStxCompletion.lean"},
|
||||
"position": {"line": 8, "character": 9}}
|
||||
{"items":
|
||||
[{"label": "b1", "kind": 5, "detail": "C → String"},
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{"textDocument": {"uri": "file://partialNamespace.lean"},
|
||||
{"textDocument": {"uri": "file:///partialNamespace.lean"},
|
||||
"position": {"line": 0, "character": 2}}
|
||||
[{"selectionRange":
|
||||
{"start": {"line": 0, "character": 0}, "end": {"line": 2, "character": 0}},
|
||||
|
|
|
|||
|
|
@ -1,107 +1,107 @@
|
|||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 0, "character": 20}}
|
||||
{"rendered": "```lean\nα : Sort ?u\n⊢ α → α\n```",
|
||||
"goals": ["α : Sort ?u\n⊢ α → α"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 0, "character": 21}}
|
||||
{"rendered": "```lean\nα : Sort ?u\n⊢ α → α\n```",
|
||||
"goals": ["α : Sort ?u\n⊢ α → α"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 3, "character": 2}}
|
||||
{"rendered": "```lean\nα : Sort ?u\n⊢ α → α\n```",
|
||||
"goals": ["α : Sort ?u\n⊢ α → α"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 3, "character": 3}}
|
||||
{"rendered": "```lean\nα : Sort ?u\na : α\n⊢ α\n```",
|
||||
"goals": ["α : Sort ?u\na : α\n⊢ α"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 7, "character": 3}}
|
||||
{"rendered": "```lean\nα : Sort ?u\na : α\n⊢ α\n```",
|
||||
"goals": ["α : Sort ?u\na : α\n⊢ α"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 10, "character": 20}}
|
||||
{"rendered": "```lean\nα : Sort ?u\n⊢ α → α\n```",
|
||||
"goals": ["α : Sort ?u\n⊢ α → α"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 15, "character": 9}}
|
||||
{"rendered": "```lean\ncase zero\n⊢ 0 + Nat.zero = Nat.zero\n```",
|
||||
"goals": ["case zero\n⊢ 0 + Nat.zero = Nat.zero"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 17, "character": 5}}
|
||||
{"rendered":
|
||||
"```lean\ncase succ\nn✝ : Nat\nn_ih✝ : 0 + n✝ = n✝\n⊢ 0 + Nat.succ n✝ = Nat.succ n✝\n```",
|
||||
"goals":
|
||||
["case succ\nn✝ : Nat\nn_ih✝ : 0 + n✝ = n✝\n⊢ 0 + Nat.succ n✝ = Nat.succ n✝"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 21, "character": 9}}
|
||||
{"rendered": "```lean\nα : Sort ?u\na : α\n⊢ α\n```",
|
||||
"goals": ["α : Sort ?u\na : α\n⊢ α"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 21, "character": 10}}
|
||||
{"rendered": "```lean\nα : Sort ?u\na : α\n⊢ α\n```",
|
||||
"goals": ["α : Sort ?u\na : α\n⊢ α"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 21, "character": 11}}
|
||||
{"rendered": "```lean\nα : Sort ?u\na : α\n⊢ α\n```",
|
||||
"goals": ["α : Sort ?u\na : α\n⊢ α"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 27, "character": 3}}
|
||||
{"rendered": "```lean\nn m : Nat\nh1 : n = m\nh2 : m = 0\n⊢ 0 = n\n```",
|
||||
"goals": ["n m : Nat\nh1 : n = m\nh2 : m = 0\n⊢ 0 = n"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 27, "character": 9}}
|
||||
{"rendered": "```lean\nn m : Nat\nh1 : n = m\nh2 : m = 0\n⊢ 0 = m\n```",
|
||||
"goals": ["n m : Nat\nh1 : n = m\nh2 : m = 0\n⊢ 0 = m"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 27, "character": 13}}
|
||||
{"rendered": "no goals", "goals": []}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 34, "character": 3}}
|
||||
{"rendered": "```lean\ncase zero\n⊢ 0 + Nat.zero = Nat.zero\n```",
|
||||
"goals": ["case zero\n⊢ 0 + Nat.zero = Nat.zero"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 40, "character": 3}}
|
||||
{"rendered":
|
||||
"```lean\ncase zero\n⊢ 0 + Nat.zero = Nat.zero\n```\n---\n```lean\ncase succ\nn✝ : Nat\nn_ih✝ : 0 + n✝ = n✝\n⊢ 0 + Nat.succ n✝ = Nat.succ n✝\n```",
|
||||
"goals":
|
||||
["case zero\n⊢ 0 + Nat.zero = Nat.zero",
|
||||
"case succ\nn✝ : Nat\nn_ih✝ : 0 + n✝ = n✝\n⊢ 0 + Nat.succ n✝ = Nat.succ n✝"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 44, "character": 3}}
|
||||
{"rendered":
|
||||
"```lean\ncase zero\n⊢ 0 + Nat.zero = Nat.zero\n```\n---\n```lean\ncase succ\nn✝ : Nat\n⊢ 0 + Nat.succ n✝ = Nat.succ n✝\n```",
|
||||
"goals":
|
||||
["case zero\n⊢ 0 + Nat.zero = Nat.zero",
|
||||
"case succ\nn✝ : Nat\n⊢ 0 + Nat.succ n✝ = Nat.succ n✝"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 48, "character": 3}}
|
||||
{"rendered": "```lean\na b : Nat\n⊢ a = b\n```",
|
||||
"goals": ["a b : Nat\n⊢ a = b"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 51, "character": 20}}
|
||||
{"rendered": "```lean\nα : Sort ?u\n⊢ α → α\n```",
|
||||
"goals": ["α : Sort ?u\n⊢ α → α"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 55, "character": 3}}
|
||||
{"rendered":
|
||||
"```lean\nα : Sort ?u\np : α → Prop\na b : α\ninst✝ : DecidablePred p\nh : ∀ {p : α → Prop} [inst : DecidablePred p], p a → p b\n⊢ p a\n```",
|
||||
"goals":
|
||||
["α : Sort ?u\np : α → Prop\na b : α\ninst✝ : DecidablePred p\nh : ∀ {p : α → Prop} [inst : DecidablePred p], p a → p b\n⊢ p a"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 61, "character": 3}}
|
||||
{"rendered": "```lean\ncase left\n⊢ True\n```", "goals": ["case left\n⊢ True"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 63, "character": 3}}
|
||||
{"rendered": "```lean\ncase right\n⊢ False\n```",
|
||||
"goals": ["case right\n⊢ False"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 68, "character": 3}}
|
||||
{"rendered": "```lean\ncase left\n⊢ True\n```", "goals": ["case left\n⊢ True"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 70, "character": 3}}
|
||||
{"rendered": "```lean\ncase right\n⊢ False\n```",
|
||||
"goals": ["case right\n⊢ False"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 78, "character": 29}}
|
||||
{"rendered":
|
||||
"```lean\nt a n✝ : Nat\nn_ih✝ : t * (a + n✝) = t * a + t * n✝\n⊢ t * (a + n✝) + t = t * a + t * Nat.succ n✝\n```\n---\n```lean\nt a n✝ : Nat\nn_ih✝ : t * (a + n✝) = t * a + t * n✝\n⊢ t * (a + n✝) + t = t * a + (t * n✝ + t)\n```\n---\n```lean\nt a n✝ : Nat\nn_ih✝ : t * (a + n✝) = t * a + t * n✝\n⊢ t * (a + n✝) + t = t * a + (t * n✝ + t)\n```",
|
||||
|
|
@ -109,73 +109,73 @@
|
|||
["t a n✝ : Nat\nn_ih✝ : t * (a + n✝) = t * a + t * n✝\n⊢ t * (a + n✝) + t = t * a + t * Nat.succ n✝",
|
||||
"t a n✝ : Nat\nn_ih✝ : t * (a + n✝) = t * a + t * n✝\n⊢ t * (a + n✝) + t = t * a + (t * n✝ + t)",
|
||||
"t a n✝ : Nat\nn_ih✝ : t * (a + n✝) = t * a + t * n✝\n⊢ t * (a + n✝) + t = t * a + (t * n✝ + t)"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 82, "character": 53}}
|
||||
{"rendered":
|
||||
"```lean\ncase nil\nα : Type ?u\nbs cs : List α\n⊢ [] ++ bs ++ cs = [] ++ (bs ++ cs)\n```",
|
||||
"goals":
|
||||
["case nil\nα : Type ?u\nbs cs : List α\n⊢ [] ++ bs ++ cs = [] ++ (bs ++ cs)"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 82, "character": 54}}
|
||||
{"rendered":
|
||||
"```lean\ncase nil\nα : Type ?u\nbs cs : List α\n⊢ [] ++ bs ++ cs = [] ++ (bs ++ cs)\n```",
|
||||
"goals":
|
||||
["case nil\nα : Type ?u\nbs cs : List α\n⊢ [] ++ bs ++ cs = [] ++ (bs ++ cs)"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 86, "character": 38}}
|
||||
{"rendered": "no goals", "goals": []}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 89, "character": 39}}
|
||||
null
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 93, "character": 16}}
|
||||
{"rendered":
|
||||
"```lean\ncase left\n⊢ True\n```\n---\n```lean\ncase right\n⊢ False\n```",
|
||||
"goals": ["case left\n⊢ True", "case right\n⊢ False"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 97, "character": 8}}
|
||||
{"rendered": "```lean\n| True = True\n```", "goals": ["| True = True"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 99, "character": 4}}
|
||||
{"rendered": "```lean\n| True = True\n```", "goals": ["| True = True"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 101, "character": 2}}
|
||||
{"rendered": "no goals", "goals": []}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 106, "character": 4}}
|
||||
{"rendered": "```lean\n⊢ True\n```", "goals": ["⊢ True"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 108, "character": 2}}
|
||||
{"rendered": "```lean\n⊢ True\n```", "goals": ["⊢ True"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 113, "character": 4}}
|
||||
{"rendered": "```lean\n⊢ True\n```", "goals": ["⊢ True"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 115, "character": 2}}
|
||||
null
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 120, "character": 2}}
|
||||
{"rendered": "```lean\n⊢ False\n```", "goals": ["⊢ False"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 124, "character": 17}}
|
||||
{"rendered": "```lean\np q : Prop\nhp : p\nhq : q\nthis : q ∧ p\n⊢ p ∧ q\n```",
|
||||
"goals": ["p q : Prop\nhp : p\nhq : q\nthis : q ∧ p\n⊢ p ∧ q"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 128, "character": 18}}
|
||||
{"rendered": "```lean\np q : Prop\nhp : p\nhq : q\n⊢ id (p ∧ q)\n```",
|
||||
"goals": ["p q : Prop\nhp : p\nhq : q\n⊢ id (p ∧ q)"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 133, "character": 3}}
|
||||
{"rendered": "```lean\ncase left\n⊢ True\n```", "goals": ["case left\n⊢ True"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 133, "character": 4}}
|
||||
{"rendered": "```lean\ncase left\n⊢ True\n```", "goals": ["case left\n⊢ True"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 139, "character": 34}}
|
||||
{"rendered": "```lean\nx✝ : Nat\n⊢ True\n```", "goals": ["x✝ : Nat\n⊢ True"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 142, "character": 34}}
|
||||
{"rendered": "```lean\nx✝ : Nat\n⊢ True\n```", "goals": ["x✝ : Nat\n⊢ True"]}
|
||||
{"textDocument": {"uri": "file://plainGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainGoal.lean"},
|
||||
"position": {"line": 145, "character": 34}}
|
||||
{"rendered": "```lean\nx✝ : Nat\n⊢ True\n```", "goals": ["x✝ : Nat\n⊢ True"]}
|
||||
|
|
|
|||
|
|
@ -1,69 +1,69 @@
|
|||
{"textDocument": {"uri": "file://plainTermGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainTermGoal.lean"},
|
||||
"position": {"line": 2, "character": 14}}
|
||||
{"range":
|
||||
{"start": {"line": 2, "character": 2}, "end": {"line": 2, "character": 51}},
|
||||
"goal": "⊢ 0 < 2"}
|
||||
{"textDocument": {"uri": "file://plainTermGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainTermGoal.lean"},
|
||||
"position": {"line": 2, "character": 15}}
|
||||
{"range":
|
||||
{"start": {"line": 2, "character": 15}, "end": {"line": 2, "character": 30}},
|
||||
"goal": "⊢ 0 < 1"}
|
||||
{"textDocument": {"uri": "file://plainTermGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainTermGoal.lean"},
|
||||
"position": {"line": 2, "character": 16}}
|
||||
{"range":
|
||||
{"start": {"line": 2, "character": 15}, "end": {"line": 2, "character": 30}},
|
||||
"goal": "⊢ 0 < 1"}
|
||||
{"textDocument": {"uri": "file://plainTermGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainTermGoal.lean"},
|
||||
"position": {"line": 2, "character": 31}}
|
||||
{"range":
|
||||
{"start": {"line": 2, "character": 31}, "end": {"line": 2, "character": 51}},
|
||||
"goal": "⊢ 1 < 2"}
|
||||
{"textDocument": {"uri": "file://plainTermGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainTermGoal.lean"},
|
||||
"position": {"line": 2, "character": 48}}
|
||||
{"range":
|
||||
{"start": {"line": 2, "character": 32}, "end": {"line": 2, "character": 50}},
|
||||
"goal": "⊢ 1 < 2"}
|
||||
{"textDocument": {"uri": "file://plainTermGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainTermGoal.lean"},
|
||||
"position": {"line": 11, "character": 10}}
|
||||
{"range":
|
||||
{"start": {"line": 11, "character": 2}, "end": {"line": 11, "character": 19}},
|
||||
"goal": "y : Int\n⊢ Option Unit"}
|
||||
{"textDocument": {"uri": "file://plainTermGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainTermGoal.lean"},
|
||||
"position": {"line": 16, "character": 17}}
|
||||
{"range":
|
||||
{"start": {"line": 16, "character": 17}, "end": {"line": 16, "character": 18}},
|
||||
"goal": "m n : Nat\n⊢ ?m m n < n"}
|
||||
{"textDocument": {"uri": "file://plainTermGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainTermGoal.lean"},
|
||||
"position": {"line": 16, "character": 18}}
|
||||
{"range":
|
||||
{"start": {"line": 16, "character": 17}, "end": {"line": 16, "character": 18}},
|
||||
"goal": "m n : Nat\n⊢ ?m m n < n"}
|
||||
{"textDocument": {"uri": "file://plainTermGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainTermGoal.lean"},
|
||||
"position": {"line": 20, "character": 18}}
|
||||
{"range":
|
||||
{"start": {"line": 20, "character": 18}, "end": {"line": 20, "character": 23}},
|
||||
"goal": "⊢ True"}
|
||||
{"textDocument": {"uri": "file://plainTermGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainTermGoal.lean"},
|
||||
"position": {"line": 24, "character": 2}}
|
||||
{"range":
|
||||
{"start": {"line": 24, "character": 2}, "end": {"line": 24, "character": 74}},
|
||||
"goal": "⊢ ∀ (n : Nat), n < n + 42"}
|
||||
{"textDocument": {"uri": "file://plainTermGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainTermGoal.lean"},
|
||||
"position": {"line": 24, "character": 6}}
|
||||
{"range":
|
||||
{"start": {"line": 24, "character": 6}, "end": {"line": 24, "character": 7}},
|
||||
"goal": "⊢ Nat"}
|
||||
{"textDocument": {"uri": "file://plainTermGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainTermGoal.lean"},
|
||||
"position": {"line": 30, "character": 6}}
|
||||
{"range":
|
||||
{"start": {"line": 30, "character": 6}, "end": {"line": 30, "character": 18}},
|
||||
"goal": "n : Nat\n⊢ ∀ (n m : Nat), n + m = m + n"}
|
||||
{"textDocument": {"uri": "file://plainTermGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainTermGoal.lean"},
|
||||
"position": {"line": 32, "character": 8}}
|
||||
{"range":
|
||||
{"start": {"line": 32, "character": 8}, "end": {"line": 32, "character": 26}},
|
||||
"goal": "n : Nat\n⊢ n < n + 1"}
|
||||
{"textDocument": {"uri": "file://plainTermGoal.lean"},
|
||||
{"textDocument": {"uri": "file:///plainTermGoal.lean"},
|
||||
"position": {"line": 35, "character": 14}}
|
||||
{"range":
|
||||
{"start": {"line": 35, "character": 14}, "end": {"line": 35, "character": 15}},
|
||||
|
|
|
|||
|
|
@ -1,19 +1,19 @@
|
|||
{"textDocument": {"uri": "file://rename.lean"},
|
||||
{"textDocument": {"uri": "file:///rename.lean"},
|
||||
"position": {"line": 5, "character": 14}}
|
||||
null
|
||||
{"textDocument": {"uri": "file://rename.lean"},
|
||||
{"textDocument": {"uri": "file:///rename.lean"},
|
||||
"position": {"line": 5, "character": 14},
|
||||
"newName": "blue"}
|
||||
{"changes": {}}
|
||||
{"textDocument": {"uri": "file://rename.lean"},
|
||||
{"textDocument": {"uri": "file:///rename.lean"},
|
||||
"position": {"line": 9, "character": 10},
|
||||
"newName": "Bar"}
|
||||
{"changes": {}}
|
||||
{"textDocument": {"uri": "file://rename.lean"},
|
||||
{"textDocument": {"uri": "file:///rename.lean"},
|
||||
"position": {"line": 23, "character": 6},
|
||||
"newName": "z"}
|
||||
{"changes": {}}
|
||||
{"textDocument": {"uri": "file://rename.lean"},
|
||||
{"textDocument": {"uri": "file:///rename.lean"},
|
||||
"position": {"line": 30, "character": 12},
|
||||
"newName": "X"}
|
||||
{"changes": {}}
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ def ident : Parsec Name := do
|
|||
return xs.foldl Name.mkStr $ head
|
||||
|
||||
partial def main (args : List String) : IO Unit := do
|
||||
let uri := s!"file://{args.head!}"
|
||||
let uri := s!"file:///{args.head!}"
|
||||
Ipc.runWith (←IO.appPath) #["--server"] do
|
||||
let capabilities := {
|
||||
textDocument? := some {
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
{"textDocument": {"version": 2, "uri": "file://unterminatedDocComment.lean"},
|
||||
{"textDocument": {"version": 2, "uri": "file:///unterminatedDocComment.lean"},
|
||||
"contentChanges":
|
||||
[{"text": "/",
|
||||
"range":
|
||||
{"start": {"line": 5, "character": 2}, "end": {"line": 5, "character": 3}}}]}
|
||||
{"version": 2, "uri": "file://unterminatedDocComment.lean", "diagnostics": []}
|
||||
{"version": 2, "uri": "file://unterminatedDocComment.lean", "diagnostics": []}
|
||||
{"version": 2, "uri": "file://unterminatedDocComment.lean", "diagnostics": []}
|
||||
{"version": 2, "uri": "file:///unterminatedDocComment.lean", "diagnostics": []}
|
||||
{"version": 2, "uri": "file:///unterminatedDocComment.lean", "diagnostics": []}
|
||||
{"version": 2, "uri": "file:///unterminatedDocComment.lean", "diagnostics": []}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue