static box RuleStaticTopAssignBox { apply(text, path, out) { local n = text.length(); local line = 1 local in_static = 0; local brace = 0; local in_method = 0 local i = 0 while i < n { local c = text.substring(i, i+1) if c == "\n" { line = line + 1 } if in_static == 0 { if me._match_kw(text, i, "static box ") { in_static = 1; in_method = 0 } } if in_static == 1 { if in_method == 0 && me._match_kw(text, i, "method ") { in_method = 1 } if c == "{" { brace = brace + 1 } if c == "}" { brace = brace - 1; if brace <= 0 { in_static = 0; in_method = 0 } } if in_method == 0 { if me._is_line_head(text, i) == 1 { if me._is_ident_start(c) == 1 { // find '=' before EOL local seen_eq = 0 local off = 0; while off < n { local j = i + 1 + off if j >= n { break } local cj = text.substring(j, j+1) if cj == "\n" { break } if cj == "=" { seen_eq = 1; break } off = off + 1 } if seen_eq == 1 { out.push("[HC001] top-level assignment in static box (use lazy init in method): " + path + ":" + ("" + line)) } } } } } i = i + 1 } } _match_kw(s,i,kw) { local k=kw.length(); if i+k>s.length() { return 0 }; if s.substring(i,i+k)==kw { return 1 } return 0 } _is_ident_start(c) { if c=="_" {return 1}; if c>="A"&&c<="Z" {return 1}; if c>="a"&&c<="z" {return 1}; return 0 } _is_line_head(s,i) { local r = 0 while r <= i { if i==0 {return 1} local j=i-1-r local cj=s.substring(j,j+1) if cj=="\n" {return 1} if cj!=" "&&cj!="\t" {return 0} if j==0 {return 1} r = r + 1 } return 1 } } static box RuleStaticTopAssignMain { method main(args) { return 0 } }