src/Pure/Isar/keyword.scala
changeset 73359 d8a0e996614b
parent 72765 f34f5c057c9e
child 75393 87ebf5a50283
equal deleted inserted replaced
73358:78aa7846e91f 73359:d8a0e996614b
   158       else if (is_empty) other
   158       else if (is_empty) other
   159       else {
   159       else {
   160         val kinds1 =
   160         val kinds1 =
   161           if (kinds eq other.kinds) kinds
   161           if (kinds eq other.kinds) kinds
   162           else if (kinds.isEmpty) other.kinds
   162           else if (kinds.isEmpty) other.kinds
   163           else (kinds /: other.kinds) { case (m, e) => if (m.isDefinedAt(e._1)) m else m + e }
   163           else other.kinds.foldLeft(kinds) { case (m, e) => if (m.isDefinedAt(e._1)) m else m + e }
   164         val load_commands1 =
   164         val load_commands1 =
   165           if (load_commands eq other.load_commands) load_commands
   165           if (load_commands eq other.load_commands) load_commands
   166           else if (load_commands.isEmpty) other.load_commands
   166           else if (load_commands.isEmpty) other.load_commands
   167           else
   167           else {
   168             (load_commands /: other.load_commands) {
   168             other.load_commands.foldLeft(load_commands) {
   169               case (m, e) => if (m.isDefinedAt(e._1)) m else m + e }
   169               case (m, e) => if (m.isDefinedAt(e._1)) m else m + e
       
   170             }
       
   171           }
   170         new Keywords(kinds1, load_commands1)
   172         new Keywords(kinds1, load_commands1)
   171       }
   173       }
   172 
   174 
   173 
   175 
   174     /* add keywords */
   176     /* add keywords */
   185         else load_commands
   187         else load_commands
   186       new Keywords(kinds1, load_commands1)
   188       new Keywords(kinds1, load_commands1)
   187     }
   189     }
   188 
   190 
   189     def add_keywords(header: Thy_Header.Keywords): Keywords =
   191     def add_keywords(header: Thy_Header.Keywords): Keywords =
   190       (this /: header) {
   192       header.foldLeft(this) {
   191         case (keywords, (name, spec)) =>
   193         case (keywords, (name, spec)) =>
   192           if (spec.kind.isEmpty)
   194           if (spec.kind.isEmpty)
   193             keywords + Symbol.decode(name) + Symbol.encode(name)
   195             keywords + Symbol.decode(name) + Symbol.encode(name)
   194           else
   196           else
   195             keywords +
   197             keywords +
   215 
   217 
   216 
   218 
   217     /* lexicons */
   219     /* lexicons */
   218 
   220 
   219     private def make_lexicon(is_minor: Boolean): Scan.Lexicon =
   221     private def make_lexicon(is_minor: Boolean): Scan.Lexicon =
   220       (Scan.Lexicon.empty /: kinds)(
   222       kinds.foldLeft(Scan.Lexicon.empty) {
   221         {
   223         case (lex, (name, kind)) =>
   222           case (lex, (name, kind)) =>
   224           if ((kind == "" || kind == BEFORE_COMMAND || kind == QUASI_COMMAND) == is_minor)
   223             if ((kind == "" || kind == BEFORE_COMMAND || kind == QUASI_COMMAND) == is_minor)
   225             lex + name
   224               lex + name
   226           else lex
   225             else lex
   227       }
   226         })
       
   227 
   228 
   228     lazy val minor: Scan.Lexicon = make_lexicon(true)
   229     lazy val minor: Scan.Lexicon = make_lexicon(true)
   229     lazy val major: Scan.Lexicon = make_lexicon(false)
   230     lazy val major: Scan.Lexicon = make_lexicon(false)
   230   }
   231   }
   231 }
   232 }