src/serialization: detect more errors on serialize/noserialize annotations
[nit.git] / src / frontend / simple_misc_analysis.nit
index 26d6710..885d794 100644 (file)
@@ -24,6 +24,7 @@ module simple_misc_analysis
 import phase
 
 redef class ToolContext
+       # Execute `AModule::do_simple_misc_analysis` on each module.
        var simple_misc_analysis_phase: Phase = new SimpleMiscAnalysisPhase(self, null)
 end
 
@@ -39,6 +40,12 @@ redef class AModule
        do
                var v = new SimpleMiscVisitor(toolcontext)
                v.enter_visit(self)
+
+               var t = location.file.first_token
+               while t != null do
+                       t.accept_simple_misc_token(v)
+                       t = t.next_token
+               end
        end
 end
 
@@ -54,14 +61,9 @@ private class SimpleMiscVisitor
 
        var toolcontext: ToolContext
 
-       fun warning(node: ANode, msg: String)
-       do
-               toolcontext.warning(node.hot_location, msg)
-       end
-
-       init(toolcontext: ToolContext)
+       fun warning(node: ANode, tag, msg: String)
        do
-               self.toolcontext = toolcontext
+               toolcontext.warning(node.hot_location, tag, msg)
        end
 end
 
@@ -77,11 +79,17 @@ redef class ANode
        private fun after_simple_misc(v: SimpleMiscVisitor) do end
 end
 
+redef class Token
+       private fun accept_simple_misc_token(v: SimpleMiscVisitor)
+       do
+       end
+end
+
 redef class ASignature
        redef fun after_simple_misc(v)
        do
                if self.n_opar != null and self.n_params.is_empty then
-                       v.warning(self, "Warning: superfluous parentheses.")
+                       v.warning(self, "parentheses", "Warning: superfluous parentheses.")
                end
        end
 end
@@ -94,7 +102,7 @@ end
 redef class AParExpr
        redef fun warn_parentheses(v)
        do
-               v.warning(self, "Warning: superfluous parentheses.")
+               v.warning(self, "parentheses", "Warning: superfluous parentheses.")
        end
 end
 
@@ -102,7 +110,7 @@ redef class AParExprs
        redef fun after_simple_misc(v)
        do
                if n_exprs.is_empty then
-                       v.warning(self, "Warning: superfluous parentheses.")
+                       v.warning(self, "parentheses", "Warning: superfluous parentheses.")
                end
        end
 end
@@ -117,17 +125,7 @@ redef class AReturnExpr
        end
 end
 
-redef class AContinueExpr
-       redef fun after_simple_misc(v)
-       do
-               var e = n_expr
-               if e != null then
-                       e.warn_parentheses(v)
-               end
-       end
-end
-
-redef class ABreakExpr
+redef class AEscapeExpr
        redef fun after_simple_misc(v)
        do
                var e = n_expr
@@ -141,7 +139,7 @@ redef class AWhileExpr
        redef fun after_simple_misc(v)
        do
                if n_expr isa ATrueExpr then
-                       v.warning(self, "Warning: use 'loop' instead of 'while true do'.")
+                       v.warning(self, "loop", "Warning: use `loop` instead of `while true do`.")
                else
                        n_expr.warn_parentheses(v)
                end
@@ -173,7 +171,7 @@ redef class AOnceExpr
        redef fun accept_simple_misc(v)
        do
                if v.once_count > 0 then
-                       v.warning(self, "Useless once in a once expression.")
+                       v.warning(self, "nested-once", "Warning: useless once in a once expression.")
                end
                v.once_count = v.once_count + 1
 
@@ -182,3 +180,25 @@ redef class AOnceExpr
                v.once_count = v.once_count - 1
        end
 end
+
+redef class TSemi
+       redef fun accept_simple_misc_token(v)
+       do
+               var n = next_token
+               var p = prev_token
+               if
+                       n == null or
+                       n isa TEol or
+                       n isa EOF or
+                       n isa TComment or
+                       p == null or
+                       p isa TEol or
+                       p isa EOF or
+                       p isa TComment or
+                       p isa TSemi
+               then
+                       v.warning(self, "semi", "Warning: superfluous `;`.")
+                       return
+               end
+       end
+end