Skip to content

Commit 1d9f57a

Browse files
committed
feat: rewrite the linter for spaces before semicolons in Lean (#16532)
A fix about 30 violations which have crept into mathlib in the mean-time. Co-authored-by: Michael Rothgang <rothgang@math.uni-bonn.de>
1 parent 6e9a2f6 commit 1d9f57a

File tree

7 files changed

+58
-43
lines changed

7 files changed

+58
-43
lines changed

Mathlib/AlgebraicTopology/SimplicialSet/Coskeletal.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,12 +150,12 @@ lemma fac_aux₂ {n : ℕ}
150150
match t with
151151
| 0 =>
152152
have : α.hom ≫ (mkOfSucc 0).op = α₂.hom :=
153-
Quiver.Hom.unop_inj (by ext x ; fin_cases x <;> rfl)
153+
Quiver.Hom.unop_inj (by ext x; fin_cases x <;> rfl)
154154
rw [this, h₂, ← congr_fun (s.w β₂) x]
155155
rfl
156156
| 1 =>
157157
have : α.hom ≫ (mkOfSucc 1).op = α₀.hom :=
158-
Quiver.Hom.unop_inj (by ext x ; fin_cases x <;> rfl)
158+
Quiver.Hom.unop_inj (by ext x; fin_cases x <;> rfl)
159159
rw [this, h₀, ← congr_fun (s.w β₀) x]
160160
rfl
161161
rw [← StructuredArrow.w β₁, FunctorToTypes.map_comp_apply, this, ← s.w β₁]

Mathlib/CategoryTheory/Comma/CardinalArrow.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ noncomputable def Arrow.shrinkEquiv (C : Type u) [Category.{v} C] [Small.{w} C]
8686
toFun := (Shrink.equivalence C).inverse.mapArrow.obj
8787
invFun := (Shrink.equivalence C).functor.mapArrow.obj
8888
left_inv _ := Arrow.ext (Equiv.apply_symm_apply _ _)
89-
((Equiv.apply_symm_apply _ _)) (by simp ; rfl)
89+
((Equiv.apply_symm_apply _ _)) (by simp; rfl)
9090
right_inv _ := Arrow.ext (by simp [Shrink.equivalence])
9191
(by simp [Shrink.equivalence]) (by simp [Shrink.equivalence])
9292

Mathlib/Combinatorics/Quiver/ReflQuiver.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ scoped notation "𝟙rq" => ReflQuiver.id -- type as \b1
3333

3434
@[simp]
3535
theorem ReflQuiver.homOfEq_id {V : Type*} [ReflQuiver V] {X X' : V} (hX : X = X') :
36-
Quiver.homOfEq (𝟙rq X) hX hX = 𝟙rq X' := by subst hX ; rfl
36+
Quiver.homOfEq (𝟙rq X) hX hX = 𝟙rq X' := by subst hX; rfl
3737

3838
instance catToReflQuiver {C : Type u} [inst : Category.{v} C] : ReflQuiver.{v+1, u} C :=
3939
{ inst with }

Mathlib/Probability/CondVar.lean

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -34,23 +34,23 @@ following conditions is true:
3434
- `X - μ[X | m]` is not square-integrable. -/
3535
noncomputable def condVar : Ω → ℝ := μ[(X - μ[X | m]) ^ 2 | m]
3636

37-
@[inherit_doc] scoped notation "Var[" X " ; " μ " | " m "]" => condVar m X μ
37+
@[inherit_doc] scoped notation "Var[" X "; " μ " | " m "]" => condVar m X μ
3838

3939
/-- Conditional variance of a real-valued random variable. It is defined as `0` if any one of the
4040
following conditions is true:
4141
- `m` is not a sub-σ-algebra of `m₀`,
4242
- `volume` is not σ-finite with respect to `m`,
4343
- `X - 𝔼[X | m]` is not square-integrable. -/
44-
scoped notation "Var[" f "|" m "]" => Var[f ; MeasureTheory.volume | m]
44+
scoped notation "Var[" f "|" m "]" => Var[f; MeasureTheory.volume | m]
4545

46-
lemma condVar_of_not_le (hm : ¬m ≤ m₀) : Var[X ; μ | m] = 0 := by rw [condVar, condExp_of_not_le hm]
46+
lemma condVar_of_not_le (hm : ¬m ≤ m₀) : Var[X; μ | m] = 0 := by rw [condVar, condExp_of_not_le hm]
4747

4848
lemma condVar_of_not_sigmaFinite (hμm : ¬SigmaFinite (μ.trim hm)) :
49-
Var[X ; μ | m] = 0 := by rw [condVar, condExp_of_not_sigmaFinite hm hμm]
49+
Var[X; μ | m] = 0 := by rw [condVar, condExp_of_not_sigmaFinite hm hμm]
5050

5151
open scoped Classical in
5252
lemma condVar_of_sigmaFinite [SigmaFinite (μ.trim hm)] :
53-
Var[X ; μ | m] =
53+
Var[X; μ | m] =
5454
if Integrable (fun ω ↦ (X ω - (μ[X | m]) ω) ^ 2) μ then
5555
if StronglyMeasurable[m] (fun ω ↦ (X ω - (μ[X | m]) ω) ^ 2) then
5656
fun ω ↦ (X ω - (μ[X | m]) ω) ^ 2
@@ -59,51 +59,51 @@ lemma condVar_of_sigmaFinite [SigmaFinite (μ.trim hm)] :
5959

6060
lemma condVar_of_stronglyMeasurable [SigmaFinite (μ.trim hm)]
6161
(hX : StronglyMeasurable[m] X) (hXint : Integrable ((X - μ[X | m]) ^ 2) μ) :
62-
Var[X ; μ | m] = fun ω ↦ (X ω - (μ[X | m]) ω) ^ 2 :=
62+
Var[X; μ | m] = fun ω ↦ (X ω - (μ[X | m]) ω) ^ 2 :=
6363
condExp_of_stronglyMeasurable _ ((hX.sub stronglyMeasurable_condExp).pow _) hXint
6464

6565
lemma condVar_of_not_integrable (hXint : ¬ Integrable (fun ω ↦ (X ω - (μ[X | m]) ω) ^ 2) μ) :
66-
Var[X ; μ | m] = 0 := condExp_of_not_integrable hXint
66+
Var[X; μ | m] = 0 := condExp_of_not_integrable hXint
6767

68-
@[simp] lemma condVar_zero : Var[0 ; μ | m] = 0 := by simp [condVar]
68+
@[simp] lemma condVar_zero : Var[0; μ | m] = 0 := by simp [condVar]
6969

7070
@[simp]
71-
lemma condVar_const (hm : m ≤ m₀) (c : ℝ) : Var[fun _ ↦ c ; μ | m] = 0 := by
71+
lemma condVar_const (hm : m ≤ m₀) (c : ℝ) : Var[fun _ ↦ c; μ | m] = 0 := by
7272
obtain rfl | hc := eq_or_ne c 0
7373
· simp [← Pi.zero_def]
7474
by_cases hμm : IsFiniteMeasure μ
7575
· simp [condVar, hm, Pi.pow_def]
7676
· simp [condVar, condExp_of_not_integrable, integrable_const_iff_isFiniteMeasure hc,
7777
integrable_const_iff_isFiniteMeasure <| pow_ne_zero _ hc, hμm, Pi.pow_def]
7878

79-
lemma stronglyMeasurable_condVar : StronglyMeasurable[m] (Var[X ; μ | m]) :=
79+
lemma stronglyMeasurable_condVar : StronglyMeasurable[m] (Var[X; μ | m]) :=
8080
stronglyMeasurable_condExp
8181

82-
lemma condVar_congr_ae (h : X =ᵐ[μ] Y) : Var[X ; μ | m] =ᵐ[μ] Var[Y ; μ | m] :=
82+
lemma condVar_congr_ae (h : X =ᵐ[μ] Y) : Var[X; μ | m] =ᵐ[μ] Var[Y; μ | m] :=
8383
condExp_congr_ae <| by filter_upwards [h, condExp_congr_ae h] with ω hω hω'; dsimp; rw [hω, hω']
8484

8585
lemma condVar_of_aestronglyMeasurable [hμm : SigmaFinite (μ.trim hm)]
8686
(hX : AEStronglyMeasurable[m] X μ) (hXint : Integrable ((X - μ[X | m]) ^ 2) μ) :
87-
Var[X ; μ | m] =ᵐ[μ] (X - μ[X | m]) ^ 2 :=
87+
Var[X; μ | m] =ᵐ[μ] (X - μ[X | m]) ^ 2 :=
8888
condExp_of_aestronglyMeasurable' _ ((continuous_pow _).comp_aestronglyMeasurable
8989
(hX.sub stronglyMeasurable_condExp.aestronglyMeasurable)) hXint
9090

91-
lemma integrable_condVar : Integrable Var[X ; μ | m] μ := integrable_condExp
91+
lemma integrable_condVar : Integrable Var[X; μ | m] μ := integrable_condExp
9292

9393
/-- The integral of the conditional variance `Var[X | m]` over an `m`-measurable set is equal to
9494
the integral of `(X - μ[X | m]) ^ 2` on that set. -/
9595
lemma setIntegral_condVar [SigmaFinite (μ.trim hm)] (hX : Integrable ((X - μ[X | m]) ^ 2) μ)
9696
(hs : MeasurableSet[m] s) :
97-
∫ ω in s, (Var[X ; μ | m]) ω ∂μ = ∫ ω in s, (X ω - (μ[X | m]) ω) ^ 2 ∂μ :=
97+
∫ ω in s, (Var[X; μ | m]) ω ∂μ = ∫ ω in s, (X ω - (μ[X | m]) ω) ^ 2 ∂μ :=
9898
setIntegral_condExp _ hX hs
9999

100100
-- `(· ^ 2)` is a postfix operator called `_sq` in lemma names, but
101101
-- `condVar_ae_eq_condExp_sq_sub_condExp_sq` is a bit ridiculous, so we exceptionally denote it by
102102
-- `sq_` as it were a prefix.
103103
lemma condVar_ae_eq_condExp_sq_sub_sq_condExp (hm : m ≤ m₀) [IsFiniteMeasure μ] (hX : Memℒp X 2 μ) :
104-
Var[X ; μ | m] =ᵐ[μ] μ[X ^ 2 | m] - μ[X | m] ^ 2 := by
104+
Var[X; μ | m] =ᵐ[μ] μ[X ^ 2 | m] - μ[X | m] ^ 2 := by
105105
calc
106-
Var[X ; μ | m]
106+
Var[X; μ | m]
107107
_ = μ[X ^ 2 - 2 * X * μ[X | m] + μ[X | m] ^ 2 | m] := by rw [condVar, sub_sq]
108108
_ =ᵐ[μ] μ[X ^ 2 | m] - 2 * μ[X | m] ^ 2 + μ[X | m] ^ 2 := by
109109
have aux₀ : Integrable (X ^ 2) μ := hX.integrable_sq
@@ -122,51 +122,51 @@ lemma condVar_ae_eq_condExp_sq_sub_sq_condExp (hm : m ≤ m₀) [IsFiniteMeasure
122122
_ = μ[X ^ 2 | m] - μ[X | m] ^ 2 := by ring
123123

124124
lemma condVar_ae_le_condExp_sq (hm : m ≤ m₀) [IsFiniteMeasure μ] (hX : Memℒp X 2 μ) :
125-
Var[X ; μ | m] ≤ᵐ[μ] μ[X ^ 2 | m] := by
125+
Var[X; μ | m] ≤ᵐ[μ] μ[X ^ 2 | m] := by
126126
filter_upwards [condVar_ae_eq_condExp_sq_sub_sq_condExp hm hX] with ω hω
127127
dsimp at hω
128128
nlinarith
129129

130130
/-- **Law of total variance** -/
131131
lemma integral_condVar_add_variance_condExp (hm : m ≤ m₀) [IsProbabilityMeasure μ]
132-
(hX : Memℒp X 2 μ) : μ[Var[X ; μ | m]] + Var[μ[X | m] ; μ] = Var[X ; μ] := by
132+
(hX : Memℒp X 2 μ) : μ[Var[X; μ | m]] + Var[μ[X | m]; μ] = Var[X; μ] := by
133133
calc
134-
μ[Var[X ; μ | m]] + Var[μ[X | m] ; μ]
134+
μ[Var[X; μ | m]] + Var[μ[X | m]; μ]
135135
_ = μ[(μ[X ^ 2 | m] - μ[X | m] ^ 2 : Ω → ℝ)] + (μ[μ[X | m] ^ 2] - μ[μ[X | m]] ^ 2) := by
136136
congr 1
137137
· exact integral_congr_ae <| condVar_ae_eq_condExp_sq_sub_sq_condExp hm hX
138138
· exact variance_def' hX.condExp
139139
_ = μ[X ^ 2] - μ[μ[X | m] ^ 2] + (μ[μ[X | m] ^ 2] - μ[X] ^ 2) := by
140140
rw [integral_sub' integrable_condExp, integral_condExp hm, integral_condExp hm]
141141
exact hX.condExp.integrable_sq
142-
_ = Var[X ; μ] := by rw [variance_def' hX]; ring
142+
_ = Var[X; μ] := by rw [variance_def' hX]; ring
143143

144144
lemma condVar_bot' [NeZero μ] (X : Ω → ℝ) :
145-
Var[X ; μ | ⊥] = fun _ => ⨍ ω, (X ω - ⨍ ω', X ω' ∂μ) ^ 2 ∂μ := by
145+
Var[X; μ | ⊥] = fun _ => ⨍ ω, (X ω - ⨍ ω', X ω' ∂μ) ^ 2 ∂μ := by
146146
ext ω; simp [condVar, condExp_bot', average]
147147

148148
lemma condVar_bot_ae_eq (X : Ω → ℝ) :
149-
Var[X ; μ | ⊥] =ᵐ[μ] fun _ ↦ ⨍ ω, (X ω - ⨍ ω', X ω' ∂μ) ^ 2 ∂μ := by
149+
Var[X; μ | ⊥] =ᵐ[μ] fun _ ↦ ⨍ ω, (X ω - ⨍ ω', X ω' ∂μ) ^ 2 ∂μ := by
150150
obtain rfl | hμ := eq_zero_or_neZero μ
151151
· rw [ae_zero]
152152
exact eventually_bot
153153
· exact .of_forall <| congr_fun (condVar_bot' X)
154154

155155
lemma condVar_bot [IsProbabilityMeasure μ] (hX : AEMeasurable X μ) :
156-
Var[X ; μ | ⊥] = fun _ω ↦ Var[X ; μ] := by
156+
Var[X; μ | ⊥] = fun _ω ↦ Var[X; μ] := by
157157
simp [condVar_bot', average_eq_integral, variance_eq_integral hX]
158158

159-
lemma condVar_smul (c : ℝ) (X : Ω → ℝ) : Var[c • X ; μ | m] =ᵐ[μ] c ^ 2 • Var[X ; μ | m] := by
159+
lemma condVar_smul (c : ℝ) (X : Ω → ℝ) : Var[c • X; μ | m] =ᵐ[μ] c ^ 2 • Var[X; μ | m] := by
160160
calc
161-
Var[c • X ; μ | m]
161+
Var[c • X; μ | m]
162162
_ =ᵐ[μ] μ[c ^ 2 • (X - μ[X | m]) ^ 2 | m] := by
163163
rw [condVar]
164164
refine condExp_congr_ae ?_
165165
filter_upwards [condExp_smul (m := m) c X] with ω hω
166166
simp [hω, ← mul_sub, mul_pow]
167-
_ =ᵐ[μ] c ^ 2 • Var[X ; μ | m] := condExp_smul ..
167+
_ =ᵐ[μ] c ^ 2 • Var[X; μ | m] := condExp_smul ..
168168

169-
@[simp] lemma condVar_neg (X : Ω → ℝ) : Var[-X ; μ | m] =ᵐ[μ] Var[X ; μ | m] := by
169+
@[simp] lemma condVar_neg (X : Ω → ℝ) : Var[-X; μ | m] =ᵐ[μ] Var[X; μ | m] := by
170170
refine condExp_congr_ae ?_
171171
filter_upwards [condExp_neg (m := m) X] with ω hω
172172
simp [condVar, hω]

Mathlib/Probability/Variance.lean

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,23 +60,23 @@ def variance : ℝ := (evariance X μ).toReal
6060
/-- The `ℝ≥0∞`-valued variance of the real-valued random variable `X` according to the measure `μ`.
6161
6262
This is defined as the Lebesgue integral of `(X - 𝔼[X])^2`. -/
63-
scoped notation "eVar[" X " ; " μ "]" => ProbabilityTheory.evariance X μ
63+
scoped notation "eVar[" X "; " μ "]" => ProbabilityTheory.evariance X μ
6464

6565
/-- The `ℝ≥0∞`-valued variance of the real-valued random variable `X` according to the volume
6666
measure.
6767
6868
This is defined as the Lebesgue integral of `(X - 𝔼[X])^2`. -/
69-
scoped notation "eVar[" X "]" => eVar[X ; MeasureTheory.MeasureSpace.volume]
69+
scoped notation "eVar[" X "]" => eVar[X; MeasureTheory.MeasureSpace.volume]
7070

7171
/-- The `ℝ`-valued variance of the real-valued random variable `X` according to the measure `μ`.
7272
7373
It is set to `0` if `X` has infinite variance. -/
74-
scoped notation "Var[" X " ; " μ "]" => ProbabilityTheory.variance X μ
74+
scoped notation "Var[" X "; " μ "]" => ProbabilityTheory.variance X μ
7575

7676
/-- The `ℝ`-valued variance of the real-valued random variable `X` according to the volume measure.
7777
7878
It is set to `0` if `X` has infinite variance. -/
79-
scoped notation "Var[" X "]" => Var[X ; MeasureTheory.MeasureSpace.volume]
79+
scoped notation "Var[" X "]" => Var[X; MeasureTheory.MeasureSpace.volume]
8080

8181
theorem evariance_lt_top [IsFiniteMeasure μ] (hX : Memℒp X 2 μ) : evariance X μ < ∞ := by
8282
have := ENNReal.pow_lt_top (hX.sub <| memℒp_const <| μ[X]).2 2
@@ -125,7 +125,7 @@ theorem evariance_eq_lintegral_ofReal :
125125
evariance X μ = ∫⁻ ω, ENNReal.ofReal ((X ω - μ[X]) ^ 2) ∂μ := by
126126
simp [evariance, ← enorm_pow, Real.enorm_of_nonneg (sq_nonneg _)]
127127

128-
lemma variance_eq_integral (hX : AEMeasurable X μ) : Var[X ; μ] = ∫ ω, (X ω - μ[X]) ^ 2 ∂μ := by
128+
lemma variance_eq_integral (hX : AEMeasurable X μ) : Var[X; μ] = ∫ ω, (X ω - μ[X]) ^ 2 ∂μ := by
129129
simp [variance, evariance, toReal_enorm, ← integral_toReal ((hX.sub_const _).enorm.pow_const _) <|
130130
.of_forall fun _ ↦ ENNReal.pow_lt_top enorm_lt_top _]
131131

Mathlib/Tactic/Linter/TextBased.lean

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ inductive StyleError where
5858
| windowsLineEnding
5959
/-- A line contains trailing whitespace. -/
6060
| trailingWhitespace
61+
/-- A line contains a space before a semicolon -/
62+
| semicolon
6163
deriving BEq
6264

6365
/-- How to format style errors -/
@@ -79,6 +81,7 @@ def StyleError.errorMessage (err : StyleError) : String := match err with
7981
| windowsLineEnding => "This line ends with a windows line ending (\r\n): please use Unix line\
8082
endings (\n) instead"
8183
| trailingWhitespace => "This line ends with some whitespace: please remove this"
84+
| semicolon => "This line contains a space before a semicolon"
8285

8386
/-- The error code for a given style error. Keep this in sync with `parse?_errorContext` below! -/
8487
-- FUTURE: we're matching the old codes in `lint-style.py` for compatibility;
@@ -87,6 +90,7 @@ def StyleError.errorCode (err : StyleError) : String := match err with
8790
| StyleError.adaptationNote => "ERR_ADN"
8891
| StyleError.windowsLineEnding => "ERR_WIN"
8992
| StyleError.trailingWhitespace => "ERR_TWS"
93+
| StyleError.semicolon => "ERR_SEM"
9094

9195
/-- Context for a style error: the actual error, the line number in the file we're reading
9296
and the path to the file. -/
@@ -164,6 +168,7 @@ def parse?_errorContext (line : String) : Option ErrorContext := Id.run do
164168
-- Use default values for parameters which are ignored for comparing style exceptions.
165169
-- NB: keep this in sync with `compare` above!
166170
| "ERR_ADN" => some (StyleError.adaptationNote)
171+
| "ERR_SEM" => some (StyleError.semicolon)
167172
| "ERR_TWS" => some (StyleError.trailingWhitespace)
168173
| "ERR_WIN" => some (StyleError.windowsLineEnding)
169174
| _ => none
@@ -220,6 +225,21 @@ def trailingWhitespaceLinter : TextbasedLinter := fun lines ↦ Id.run do
220225
return (errors, if errors.size > 0 then some fixedLines else none)
221226

222227

228+
/-- Lint a collection of input strings for a semicolon preceded by a space. -/
229+
def semicolonLinter : TextbasedLinter := fun lines ↦ Id.run do
230+
let mut errors := Array.mkEmpty 0
231+
let mut fixedLines := lines
232+
for h : idx in [:lines.size] do
233+
let line := lines[idx]
234+
let pos := line.find (· == ';')
235+
-- Future: also lint for a semicolon *not* followed by a space or ⟩.
236+
if pos != line.endPos && line.get (line.prev pos) == ' ' then
237+
errors := errors.push (StyleError.semicolon, idx + 1)
238+
-- We spell the bad string pattern this way to avoid the linter firing on itself.
239+
fixedLines := fixedLines.set! idx (line.replace (⟨[' ', ';']⟩ : String) ";")
240+
return (errors, if errors.size > 0 then some fixedLines else none)
241+
242+
223243
/-- Whether a collection of lines consists *only* of imports, blank lines and single-line comments.
224244
In practice, this means it's an imports-only file and exempt from almost all linting. -/
225245
def isImportsOnlyFile (lines : Array String) : Bool :=
@@ -231,7 +251,7 @@ end
231251

232252
/-- All text-based linters registered in this file. -/
233253
def allLinters : Array TextbasedLinter := #[
234-
adaptationNoteLinter, trailingWhitespaceLinter
254+
adaptationNoteLinter, semicolonLinter, trailingWhitespaceLinter
235255
]
236256

237257

@@ -265,6 +285,7 @@ def lintFile (path : FilePath) (exceptions : Array ErrorContext) :
265285
for lint in allLinters do
266286
let (err, changes) := lint changed
267287
allOutput := allOutput.append (Array.map (fun (e, n) ↦ #[(ErrorContext.mk e n path)]) err)
288+
-- TODO: auto-fixes do not take style exceptions into account
268289
if let some c := changes then
269290
changed := c
270291
changes_made := true

scripts/lint-style.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838

3939
ERR_IBY = 11 # isolated by
4040
ERR_IWH = 22 # isolated where
41-
ERR_SEM = 13 # the substring " ;"
4241
ERR_CLN = 16 # line starts with a colon
4342
ERR_IND = 17 # second line not correctly indented
4443
ERR_ARR = 18 # space after "←"
@@ -197,9 +196,6 @@ def isolated_by_dot_semicolon_check(lines, path):
197196
line = f"{indent}{line.lstrip()[3:]}"
198197
elif line.lstrip() == "where":
199198
errors += [(ERR_IWH, line_nr, path)]
200-
if " ;" in line:
201-
errors += [(ERR_SEM, line_nr, path)]
202-
line = line.replace(" ;", ";")
203199
if line.lstrip().startswith(":"):
204200
errors += [(ERR_CLN, line_nr, path)]
205201
newlines.append((line_nr, line))
@@ -236,8 +232,6 @@ def format_errors(errors):
236232
output_message(path, line_nr, "ERR_IBY", "Line is an isolated 'by'")
237233
if errno == ERR_IWH:
238234
output_message(path, line_nr, "ERR_IWH", "Line is an isolated where")
239-
if errno == ERR_SEM:
240-
output_message(path, line_nr, "ERR_SEM", "Line contains a space before a semicolon")
241235
if errno == ERR_CLN:
242236
output_message(path, line_nr, "ERR_CLN", "Put : and := before line breaks, not after")
243237
if errno == ERR_IND:

0 commit comments

Comments
 (0)