From 1ed44539c3c2b793f91b88e59d78c47c61938372 Mon Sep 17 00:00:00 2001 From: Graham Nelson Date: Thu, 21 May 2020 00:11:29 +0100 Subject: [PATCH] Modernised problems module --- README.md | 2 +- build.txt | 4 +- docs/codegen-module/1-ppl.html | 2 +- docs/codegen-module/2-tr.html | 10 +- docs/core-module/1-mr.html | 18 +- docs/core-module/1-wtc.html | 2 +- docs/core-module/10-cad.html | 4 +- docs/core-module/10-cap.html | 4 +- docs/core-module/10-pl.html | 2 +- docs/core-module/10-teav.html | 6 +- docs/core-module/10-varc.html | 10 +- docs/core-module/11-sc.html | 10 +- docs/core-module/11-tc.html | 8 +- docs/core-module/11-tcp.html | 24 +- docs/core-module/12-ap.html | 24 +- docs/core-module/12-ca.html | 14 +- docs/core-module/12-cdp.html | 4 +- docs/core-module/12-dtd.html | 22 +- docs/core-module/12-qr.html | 2 +- docs/core-module/12-ter.html | 16 +- docs/core-module/13-ca.html | 2 +- docs/core-module/13-kak.html | 18 +- docs/core-module/13-rsfk.html | 14 +- docs/core-module/14-ds2.html | 146 ++++----- docs/core-module/14-rv.html | 2 +- docs/core-module/15-cp.html | 4 +- docs/core-module/15-cr.html | 2 +- docs/core-module/15-ep.html | 4 +- docs/core-module/15-ia.html | 4 +- docs/core-module/15-ma.html | 16 +- docs/core-module/15-pov.html | 2 +- docs/core-module/15-pr.html | 12 +- docs/core-module/15-spr2.html | 12 +- docs/core-module/15-tpr.html | 2 +- docs/core-module/15-vp.html | 6 +- docs/core-module/16-cmw.html | 4 +- docs/core-module/16-in.html | 14 +- docs/core-module/17-rs.html | 10 +- docs/core-module/17-tl.html | 2 +- docs/core-module/17-ts.html | 38 ++- docs/core-module/18-lc.html | 6 +- docs/core-module/19-tb.html | 42 +-- docs/core-module/19-tc.html | 32 +- docs/core-module/19-tod.html | 32 +- docs/core-module/2-pwst.html | 80 ++--- docs/core-module/2-si.html | 64 ++-- docs/core-module/2-up.html | 107 ++++++- docs/core-module/20-eq.html | 68 ++-- docs/core-module/21-ac.html | 18 +- docs/core-module/21-fao.html | 14 +- docs/core-module/21-rb.html | 2 +- docs/core-module/21-rl.html | 12 +- docs/core-module/21-rl2.html | 24 +- docs/core-module/21-rps.html | 12 +- docs/core-module/22-cs.html | 8 +- docs/core-module/22-dptd.html | 32 +- docs/core-module/22-ph.html | 14 +- docs/core-module/22-po.html | 8 +- docs/core-module/22-prcd.html | 2 +- docs/core-module/22-pu.html | 42 +-- docs/core-module/22-tp.html | 6 +- docs/core-module/22-tp2.html | 2 +- docs/core-module/23-abc.html | 2 +- docs/core-module/23-ad.html | 10 +- docs/core-module/24-ch.html | 12 +- docs/core-module/24-lv.html | 18 +- docs/core-module/24-sf.html | 4 +- docs/core-module/25-ci.html | 2 +- docs/core-module/25-cii.html | 50 +-- docs/core-module/25-cp.html | 48 +-- docs/core-module/25-pi.html | 10 +- docs/core-module/26-fc.html | 2 +- docs/core-module/26-i6i.html | 6 +- docs/core-module/26-iti.html | 8 +- docs/core-module/26-jl.html | 2 +- docs/core-module/26-pl.html | 2 +- docs/core-module/26-rt.html | 6 +- docs/core-module/26-ts.html | 16 +- docs/core-module/26-tti.html | 6 +- docs/core-module/26-uo.html | 8 +- docs/core-module/27-cm.html | 4 +- docs/core-module/27-em.html | 10 +- docs/core-module/27-hr.html | 2 +- docs/core-module/3-nl.html | 2 +- docs/core-module/3-pd.html | 4 +- docs/core-module/4-am.html | 14 +- docs/core-module/5-ins.html | 4 +- docs/core-module/5-lp.html | 58 ++-- docs/core-module/5-nv.html | 22 +- docs/core-module/5-tod.html | 4 +- docs/core-module/5-uem.html | 2 +- docs/core-module/5-un.html | 6 +- docs/core-module/5-ut.html | 6 +- docs/core-module/6-er.html | 4 +- docs/core-module/6-nv.html | 22 +- docs/core-module/6-rlt.html | 34 +- docs/core-module/6-tur.html | 12 +- docs/core-module/7-hdn.html | 2 +- docs/core-module/7-ns.html | 10 +- docs/core-module/7-oaf.html | 8 +- docs/core-module/7-rs.html | 94 +++--- docs/core-module/9-ass.html | 8 +- docs/core-module/9-imp.html | 6 +- docs/core-module/9-ma.html | 148 ++++----- docs/core-module/9-pd.html | 40 +-- docs/core-module/9-pk.html | 26 +- docs/core-module/9-rk.html | 18 +- docs/core-module/9-rpt.html | 20 +- docs/core-module/9-tbath.html | 10 +- docs/core-module/9-tc.html | 48 +-- docs/core-module/9-tfa.html | 14 +- docs/if-module/2-bd.html | 2 +- docs/if-module/2-ri.html | 34 +- docs/if-module/3-bck.html | 6 +- docs/if-module/3-em.html | 34 +- docs/if-module/3-mcr.html | 2 +- docs/if-module/3-rgn.html | 12 +- docs/if-module/3-scn.html | 18 +- docs/if-module/3-sm.html | 32 +- docs/if-module/3-sr.html | 6 +- docs/if-module/3-tm.html | 34 +- docs/if-module/3-tnt.html | 4 +- docs/if-module/3-tp.html | 6 +- docs/if-module/4-act.html | 34 +- docs/if-module/4-ap.html | 14 +- docs/if-module/5-gl.html | 20 +- docs/if-module/5-gp.html | 2 +- docs/if-module/5-gt.html | 2 +- docs/if-module/5-gt2.html | 28 +- docs/if-module/5-gv.html | 10 +- docs/if-module/5-nft.html | 6 +- docs/if-module/5-tfg.html | 60 ++-- docs/index-module/2-dr.html | 28 +- docs/index-module/2-ifs.html | 2 +- docs/multimedia-module/2-ef.html | 12 +- docs/multimedia-module/2-fgr.html | 6 +- docs/multimedia-module/2-se.html | 6 +- docs/problems-module/1-tlm.html | 4 +- docs/problems-module/2-pl0.html | 81 ++--- docs/problems-module/2-pl1.html | 99 +++--- docs/problems-module/2-pl2.html | 290 ++++++++--------- docs/problems-module/2-pl3.html | 300 +++++++----------- docs/problems-module/P-htitm.html | 57 +++- docs/problems-module/P-wtmd.html | 171 +++++++++- docs/problems-test/1-ut.html | 4 +- docs/supervisor-module/2-ce.html | 16 +- docs/supervisor-module/2-cps.html | 4 +- docs/supervisor-module/2-edt.html | 2 +- docs/supervisor-module/2-rqr.html | 2 +- docs/supervisor-module/2-wrk.html | 6 +- docs/supervisor-module/3-bg.html | 2 +- docs/supervisor-module/3-is2.html | 2 +- docs/supervisor-module/4-em.html | 2 +- docs/supervisor-module/5-es.html | 4 +- docs/supervisor-module/5-ks.html | 4 +- docs/supervisor-module/5-ls.html | 2 +- docs/supervisor-module/5-ps.html | 2 +- docs/supervisor-module/5-ps2.html | 4 +- docs/supervisor-module/5-ts.html | 2 +- docs/supervisor-module/6-hdn.html | 74 +++-- docs/supervisor-module/6-inc.html | 4 +- docs/supervisor-module/6-st.html | 81 +++-- docs/supervisor-module/P-wtmd.html | 2 +- .../Chapter 5/Kit Services.w | 2 +- .../supervisor-module/Chapter 6/Headings.w | 9 + .../supervisor-module/Chapter 6/Source Text.w | 33 ++ inform7/core-module/Chapter 1/Main Routine.w | 18 +- .../Chapter 10/Conditions and Phrases.w | 4 +- .../Chapter 10/Constants and Descriptions.w | 4 +- .../core-module/Chapter 10/Parse Literals.w | 2 +- .../Chapter 10/Type Expressions and Values.w | 6 +- .../Chapter 10/Verbal and Relative Clauses.w | 10 +- .../Chapter 11/Sentence Conversions.w | 10 +- .../core-module/Chapter 11/Tree Conversions.w | 8 +- .../Chapter 11/Type Check Propositions.w | 24 +- .../Chapter 12/Assert Propositions.w | 24 +- .../core-module/Chapter 12/Compile Atoms.w | 14 +- .../Compile Deferred Propositions.w | 4 +- .../Chapter 12/Deciding to Defer.w | 22 +- .../Chapter 12/Quasinumeric Relations.w | 2 +- .../Chapter 12/The Equality Relation.w | 16 +- .../Chapter 13/Compile Arithmetic.w | 2 +- .../Chapter 13/Knowledge about Kinds.w | 18 +- .../Chapter 13/Runtime Support for Kinds.w | 14 +- inform7/core-module/Chapter 14/Dash.w | 146 ++++----- inform7/core-module/Chapter 14/Rvalues.w | 2 +- .../Chapter 15/Comparative Relations.w | 2 +- .../Chapter 15/Condition Properties.w | 4 +- .../Chapter 15/Either-Or Properties.w | 4 +- .../Chapter 15/Indefinite Appearance.w | 4 +- .../Chapter 15/Measurement Adjectives.w | 16 +- .../Chapter 15/Properties of Values.w | 2 +- inform7/core-module/Chapter 15/Properties.w | 12 +- .../Chapter 15/Setting Property Relation.w | 12 +- .../Chapter 15/The Provision Relation.w | 2 +- .../Chapter 15/Valued Properties.w | 6 +- .../Chapter 16/Complete Model World.w | 4 +- inform7/core-module/Chapter 16/Inferences.w | 14 +- inform7/core-module/Chapter 17/Responses.w | 4 +- .../core-module/Chapter 17/Text Literals.w | 2 +- .../Chapter 17/Text Substitutions.w | 14 + .../core-module/Chapter 18/List Constants.w | 6 +- .../core-module/Chapter 19/Table Columns.w | 32 +- .../Chapter 19/Tables of Definitions.w | 32 +- inform7/core-module/Chapter 19/Tables.w | 42 +-- .../Chapter 2/Problems With Source Text.w | 80 ++--- .../Chapter 2/Supplementary Issues.w | 66 ++-- .../core-module/Chapter 2/Using Problems.w | 106 ++++++- inform7/core-module/Chapter 20/Equations.w | 68 ++-- inform7/core-module/Chapter 21/Activities.w | 18 +- .../Chapter 21/Focus and Outcome.w | 14 +- .../core-module/Chapter 21/Rule Bookings.w | 2 +- .../Chapter 21/Rule Placement Sentences.w | 12 +- inform7/core-module/Chapter 21/Rulebooks.w | 24 +- inform7/core-module/Chapter 21/Rules.w | 10 +- .../Chapter 22/Construction Sequence.w | 6 +- .../Chapter 22/Describing Phrase Type Data.w | 32 +- .../core-module/Chapter 22/Phrase Options.w | 8 +- .../Chapter 22/Phrase Runtime Context Data.w | 2 +- inform7/core-module/Chapter 22/Phrase Usage.w | 42 +-- inform7/core-module/Chapter 22/Phrases.w | 14 +- .../core-module/Chapter 22/Timed Phrases.w | 2 +- inform7/core-module/Chapter 22/To Phrases.w | 6 +- .../Chapter 23/Adjectival Definitions.w | 10 +- .../Chapter 23/Adjectives by Condition.w | 2 +- inform7/core-module/Chapter 24/Chronology.w | 12 +- .../core-module/Chapter 24/Local Variables.w | 10 +- .../Chapter 25/Compile Invocations Inline.w | 50 +-- .../Chapter 25/Compile Invocations.w | 2 +- .../core-module/Chapter 25/Compile Phrases.w | 46 +-- .../Chapter 25/Parse Invocations.w | 10 +- .../Chapter 26/Fundamental Constants.w | 2 +- .../Chapter 26/I6 Template Interpreter.w | 8 +- .../Chapter 26/Inform 6 Inclusions.w | 6 +- inform7/core-module/Chapter 26/Jump Labels.w | 2 +- inform7/core-module/Chapter 26/Plugins.w | 2 +- inform7/core-module/Chapter 26/Routines.w | 2 +- inform7/core-module/Chapter 26/Test Scripts.w | 16 +- .../Chapter 26/Translate to Identifiers.w | 6 +- inform7/core-module/Chapter 26/Use Options.w | 8 +- .../core-module/Chapter 3/Natural Languages.w | 2 +- .../core-module/Chapter 3/Plural Dictionary.w | 4 +- .../Chapter 4/Adjective Meanings.w | 14 +- inform7/core-module/Chapter 5/Instances.w | 4 +- .../core-module/Chapter 5/Literal Patterns.w | 58 ++-- .../Chapter 5/Nonlocal Variables.w | 22 +- inform7/core-module/Chapter 5/Times of Day.w | 4 +- .../Chapter 5/Unicode Translations.w | 6 +- .../Chapter 5/Using Excerpt Meanings.w | 2 +- .../core-module/Chapter 5/Using Nametags.w | 6 +- .../Chapter 6/Explicit Relations.w | 4 +- inform7/core-module/Chapter 6/New Verbs.w | 22 +- inform7/core-module/Chapter 6/Relations.w | 34 +- .../Chapter 6/The Universal Relation.w | 12 +- inform7/core-module/Chapter 7/Headings.w | 2 +- .../Chapter 7/Nonstructural Sentences.w | 10 +- inform7/core-module/Chapter 7/Of and From.w | 8 +- inform7/core-module/Chapter 7/Rule Subtrees.w | 92 +++--- inform7/core-module/Chapter 9/Assemblies.w | 8 +- inform7/core-module/Chapter 9/Implications.w | 6 +- .../core-module/Chapter 9/Make Assertions.w | 148 ++++----- .../Chapter 9/Property Declarations.w | 40 +-- .../Chapter 9/Property Knowledge.w | 26 +- .../core-module/Chapter 9/Refine Parse Tree.w | 20 +- .../Chapter 9/Relation Knowledge.w | 18 +- inform7/core-module/Chapter 9/The Creator.w | 48 +-- .../core-module/Chapter 9/To Be and To Have.w | 10 +- .../Chapter 9/Traverse for Assertions.w | 14 +- .../if-module/Chapter 2/Bibliographic Data.w | 2 +- .../Chapter 2/Release Instructions.w | 34 +- inform7/if-module/Chapter 3/Backdrops.w | 6 +- inform7/if-module/Chapter 3/EPS Map.w | 34 +- .../Chapter 3/Map Connection Relations.w | 2 +- inform7/if-module/Chapter 3/Regions.w | 12 +- inform7/if-module/Chapter 3/Scenes.w | 18 +- inform7/if-module/Chapter 3/Spatial Model.w | 32 +- .../if-module/Chapter 3/Spatial Relations.w | 6 +- inform7/if-module/Chapter 3/The Map.w | 34 +- .../if-module/Chapter 3/The Naming Thicket.w | 4 +- inform7/if-module/Chapter 3/The Player.w | 6 +- inform7/if-module/Chapter 4/Action Patterns.w | 14 +- inform7/if-module/Chapter 4/Actions.w | 34 +- inform7/if-module/Chapter 5/Grammar Lines.w | 20 +- .../if-module/Chapter 5/Grammar Properties.w | 2 +- inform7/if-module/Chapter 5/Grammar Tokens.w | 28 +- inform7/if-module/Chapter 5/Grammar Types.w | 2 +- inform7/if-module/Chapter 5/Grammar Verbs.w | 10 +- .../if-module/Chapter 5/Noun Filter Tokens.w | 6 +- .../Chapter 5/Traverse for Grammar.w | 60 ++-- .../Chapter 2/Documentation References.w | 22 +- .../Chapter 2/Index File Services.w | 2 +- .../Chapter 2/External Files.w | 12 +- inform7/multimedia-module/Chapter 2/Figures.w | 6 +- .../Chapter 2/Sound Effects.w | 6 +- inter/codegen-module/Chapter 1/Pipelines.w | 2 +- .../Chapter 2/Template Reader.w | 10 +- .../problems-module/Chapter 1/Telemetry.w | 2 +- .../Chapter 2/Problems, Level 0.w | 68 ++-- .../Chapter 2/Problems, Level 1.w | 99 +++--- .../Chapter 2/Problems, Level 2.w | 206 ++++++------ .../Chapter 2/Problems, Level 3.w | 255 ++++++--------- .../How To Include This Module.w | 44 +++ .../Preliminaries/What This Module Does.w | 142 ++++++++- services/problems-test/Chapter 1/Unit Tests.w | 2 +- 304 files changed, 3657 insertions(+), 3189 deletions(-) diff --git a/README.md b/README.md index 6470b772f..522ee7a4a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Inform 7 -v10.1.0-alpha.1+6Q50 'Krypton' (20 May 2020) +v10.1.0-alpha.1+6Q51 'Krypton' (21 May 2020) ## About Inform 7 diff --git a/build.txt b/build.txt index a113778f5..258676256 100644 --- a/build.txt +++ b/build.txt @@ -1,3 +1,3 @@ Prerelease: alpha.1 -Build Date: 20 May 2020 -Build Number: 6Q50 +Build Date: 21 May 2020 +Build Number: 6Q51 diff --git a/docs/codegen-module/1-ppl.html b/docs/codegen-module/1-ppl.html index ffe69d1f4..efaf0a011 100644 --- a/docs/codegen-module/1-ppl.html +++ b/docs/codegen-module/1-ppl.html @@ -377,7 +377,7 @@ logging: (step->step_stage->stage_arg == EXT_TEXT_OUT_STAGE_ARG)) { if (STREAM_OPEN_TO_FILE(T, step->parsed_filename, ISO_ENC) == FALSE) { #ifdef PROBLEMS_MODULE - Problems::Fatal::filename_related("Can't open output file", step->parsed_filename); + Problems::fatal_on_file("Can't open output file", step->parsed_filename); #endif #ifndef PROBLEMS_MODULE Errors::fatal_with_file("Can't open output file", step->parsed_filename); diff --git a/docs/codegen-module/2-tr.html b/docs/codegen-module/2-tr.html index a5b7b7d30..1422707b8 100644 --- a/docs/codegen-module/2-tr.html +++ b/docs/codegen-module/2-tr.html @@ -178,7 +178,7 @@ or part — which would otherwise be an error very difficult to detect. LOG("Intervention at stage %d Segment %S Part %S\n", i6ti->intervention_stage, i6ti->segment_name, i6ti->part_name); #ifdef PROBLEMS_MODULE - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(Untestable), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(Untestable), "no template file of that name was ever read in", "so this attempt to intervene had no effect. " "The template files have names like 'Output.i6t', 'Parser.i6t' " @@ -196,7 +196,7 @@ or part — which would otherwise be an error very difficult to detect. LOG("Intervention at stage %d Segment %S Part %S\n", i6ti->intervention_stage, i6ti->segment_name, i6ti->part_name); #ifdef PROBLEMS_MODULE - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(Untestable), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(Untestable), "that template file didn't have a part with that name", "so this attempt to intervene had no effect. " "Each template file is divided internally into a number of " @@ -453,7 +453,7 @@ heading markers, in order to accommodate both old and new Inweb syntaxes. LOG("heading begins: <%S>\n", I6T_buffer); #ifdef PROBLEMS_MODULE Problems::quote_stream(1, I6T_buffer); - Problems::Issue::unlocated_problem(Task::syntax_tree(), _p_(...), + StandardProblems::unlocated_problem(Task::syntax_tree(), _p_(...), "An unknown '@...' marker has been found at column 0 in " "raw Inform 6 template material: specifically, '@%1'. ('@' " "has a special meaning in this first column, and this " @@ -499,7 +499,7 @@ heading markers, in order to accommodate both old and new Inweb syntaxes. inweb_syntax = INWEB_FIGURE_SYNTAX; } else if (Regexp::match(&mr, I6T_buffer, L" %(%c*%) *")) { #ifdef PROBLEMS_MODULE - Problems::Issue::unlocated_problem(Task::syntax_tree(), _p_(...), + StandardProblems::unlocated_problem(Task::syntax_tree(), _p_(...), "An '= (...)' marker has been found at column 0 in " "raw Inform 6 template material, of a kind not allowed."); #endif @@ -700,7 +700,7 @@ using template-hacking there are a handful of cases that can't be avoided, so... TEMPORARY_TEXT(M); WRITE_TO(M, message, quote); Problems::quote_stream(1, M); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(...)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(...)); Problems::issue_problem_segment( "I ran into a mistake in a template file: %1. The I6 " "template files (or .i6t files) are a very low-level part of Inform, " diff --git a/docs/core-module/1-mr.html b/docs/core-module/1-mr.html index 3cb6d63e8..2b796e4c6 100644 --- a/docs/core-module/1-mr.html +++ b/docs/core-module/1-mr.html @@ -102,7 +102,7 @@ equivalent of unlocking the doors and turning the lights on in the morning. Post mortem logging1.6; if (proceed) Shutdown and rennab1.7; - if (problem_count > 0) Problems::Fatal::exit(1); + if (problem_count > 0) ProblemSigils::exit(1); return 0; } @@ -116,7 +116,7 @@ plain text error written to s

-    Errors::set_internal_handler(&Problems::Issue::internal_error_fn);
+    Errors::set_internal_handler(&StandardProblems::internal_error_fn);
     PRINT("Inform 7 v[[Version Number]] has started.\n", FALSE, TRUE);
     Plugins::Manage::start();
     inform7_timer = Time::start_stopwatch(NULL, I"inform7 run");
@@ -135,7 +135,7 @@ isn't set up to allow more, so this error is not easy to generate.
     inform_project *proj;
     LOOP_OVER(proj, inform_project) {
         if (project)
-            Problems::Fatal::issue(
+            Problems::fatal(
                 "Multiple projects given on the command line");
         project = proj;
     }
@@ -154,7 +154,7 @@ but we won't assume that. Remember, 
     pathname *build_folder = Projects::build_path(project);
     if (Pathnames::create_in_file_system(build_folder) == 0)
-        Problems::Fatal::issue(
+        Problems::fatal(
             "Unable to create Build folder for project: is it read-only?");
 
     filename *DF = Filenames::in(build_folder, I"Debug log.txt");
@@ -166,7 +166,7 @@ but we won't assume that. Remember,     CommandLine::play_back_log();
 
     filename *PF = Filenames::in(build_folder, I"Problems.html");
-    Problems::Issue::start_problems_report(PF);
+    StandardProblems::start_problems_report(PF);
 
     HTML::set_link_abbreviation_path(Projects::path(project));
 
@@ -255,7 +255,7 @@ they can be rather lengthy.

-    Problems::write_reports(FALSE);
+    ProblemBuffer::write_reports(FALSE);
     LOG("Total of %d files written as streams.\n", total_file_writes);
     Writers::log_escape_usage();
     WRITE_TO(STDOUT, "Inform 7 has finished.\n");
@@ -361,12 +361,12 @@ rather than corevoid CoreMain::switch(int id, int val, text_stream *arg, void *state) {
     switch (id) {
         case CRASHALL_CLSW: debugger_mode = val;
-            Problems::Fatal::crash_on_problems(val); break;
+            ProblemSigils::crash_on_problems(val); break;
         case INDEX_CLSW: do_not_generate_index = val?FALSE:TRUE; break;
         case CENSUS_UPDATE_CLSW: do_not_update_census = val?FALSE:TRUE; break;
         case PROGRESS_CLSW: show_progress_indicator = val; break;
-        case SIGILS_CLSW: Problems::Fatal::echo_sigils(val); break;
-        case REQUIRE_PROBLEM_CLSW: Problems::Fatal::require(arg); break;
+        case SIGILS_CLSW: ProblemSigils::echo_sigils(val); break;
+        case REQUIRE_PROBLEM_CLSW: ProblemSigils::require(arg); break;
         case DIAGNOSTICS_CLSW: diagnostics_path = Pathnames::from_text(arg); break;
     }
     Supervisor::option(id, val, arg, state);
diff --git a/docs/core-module/1-wtc.html b/docs/core-module/1-wtc.html
index d1f47fbde..c4ff75c3a 100644
--- a/docs/core-module/1-wtc.html
+++ b/docs/core-module/1-wtc.html
@@ -204,7 +204,7 @@ rough stages. Twenty is plenty.
     return inform7_task->project;
 }
 
-target_vm *Task::vm(void) {
+target_vm *Task::vm(void) {
     if (inform7_task == NULL) internal_error("there is no current task");
     return inform7_task->task->for_vm;
 }
diff --git a/docs/core-module/10-cad.html b/docs/core-module/10-cad.html
index 92b32ea8c..5b4c1d6b8 100644
--- a/docs/core-module/10-cad.html
+++ b/docs/core-module/10-cad.html
@@ -671,7 +671,7 @@ except that the noun is optional. The only difference is right at the bottom.
     if (Node::is(p, CONSTANT_NT)) {
         if (PM_SpecificCalling_issued_at != current_sentence) {
             PM_SpecificCalling_issued_at = current_sentence;
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_SpecificCalling),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_SpecificCalling),
                 "a 'called' name can only be given to something "
                 "which is described vaguely",
                 "and can't be given to a definite object or value. "
@@ -724,7 +724,7 @@ context of a proper noun, as in "some tea", because it may be confusion of
         PM_DefiniteCommonNoun_issued_at = current_sentence;
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, W);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_DefiniteCommonNoun));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_DefiniteCommonNoun));
         Problems::issue_problem_segment(
             "In %1, I'm not able to understand what specific thing is meant "
             "by the phrase '%2'. You use the definite article 'the', which "
diff --git a/docs/core-module/10-cap.html b/docs/core-module/10-cap.html
index dc79a8e01..253dc8047 100644
--- a/docs/core-module/10-cap.html
+++ b/docs/core-module/10-cap.html
@@ -301,7 +301,7 @@ conditions, so this is where the condition in
     #ifdef IF_MODULE
     action_pattern *ap = RP[1];
     if (PL::Actions::Patterns::makes_callings(ap)) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PastActionCalled),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PastActionCalled),
             "a description of an action cannot both refer to past "
             "history and also use '(called ...)'",
             "because that would require Inform in general to remember "
@@ -483,7 +483,7 @@ limit that we were unable to construct a test case for it.
     spec->down->down->next = NULL;  truncate to just one
     Node::set_text(spec, Node::get_text(current_sentence));
     Problems::quote_source(1, current_sentence);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
     Problems::issue_problem_segment(
         "In %1, the phrase being constructed is just too "
         "long and complicated, and will need to be simplified. (This "
diff --git a/docs/core-module/10-pl.html b/docs/core-module/10-pl.html
index 765688b84..ae7df418a 100644
--- a/docs/core-module/10-pl.html
+++ b/docs/core-module/10-pl.html
@@ -251,7 +251,7 @@ Still:
         e_notation_problem_issued = TRUE;
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, W);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_WantonEngineering));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_WantonEngineering));
         Problems::issue_problem_segment(
             "In %1, you write '%2', which looks to me like the engineering "
             "notation for a real number - I'm guessing that the 'e' means "
diff --git a/docs/core-module/10-teav.html b/docs/core-module/10-teav.html
index 05ef71aa7..f03baaaac 100644
--- a/docs/core-module/10-teav.html
+++ b/docs/core-module/10-teav.html
@@ -242,7 +242,7 @@ higher up in Inform. Ultimately, the text must match <k-kind> in each case
 
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, W);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TypeCantVary));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TypeCantVary));
     Problems::issue_problem_segment(
         "In %1, '%2' is not a kind of value which a variable can safely have, "
         "as it cannot ever vary.");
@@ -256,7 +256,7 @@ higher up in Inform. Ultimately, the text must match <k-kind> in each case
 
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, W);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TypeUnmaintainable));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TypeUnmaintainable));
     Problems::issue_problem_segment(
         "In %1, '%2' is not a kind of value which a variable can safely have, "
         "as it cannot be guaranteed that the contents will always meet "
@@ -656,7 +656,7 @@ Again, this is part of a condition, and can't evaluate.
     spec->down = RP[1];
     if ((LocalVariables::are_we_using_table_lookup() == FALSE) &&
         (problem_count == 0)) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NoRowSelected),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NoRowSelected),
             "no row seems to have been chosen at this point",
             "so it doesn't make sense to talk about the entries "
             "within it. (By 'at this point', I mean the point "
diff --git a/docs/core-module/10-varc.html b/docs/core-module/10-varc.html
index 9fb15b75f..5a87b143f 100644
--- a/docs/core-module/10-varc.html
+++ b/docs/core-module/10-varc.html
@@ -482,13 +482,13 @@ has the standard form, but we check it anyway.
     subject_noun_phrase = A;
     verb_phrase = B;
 
-    if (verb_phrase->down == NULL) Problems::Issue::s_subtree_error(Task::syntax_tree(), "VP childless");
+    if (verb_phrase->down == NULL) StandardProblems::s_subtree_error(Task::syntax_tree(), "VP childless");
 
     if (Node::get_type(verb_phrase) != UNKNOWN_NT)
-        Problems::Issue::s_subtree_error(Task::syntax_tree(), "VP not a VP");
+        StandardProblems::s_subtree_error(Task::syntax_tree(), "VP not a VP");
 
     vu = Node::get_vu(verb_phrase);
-    if (vu == NULL) Problems::Issue::s_subtree_error(Task::syntax_tree(), "verb null");
+    if (vu == NULL) StandardProblems::s_subtree_error(Task::syntax_tree(), "verb null");
     verb_phrase_negated = (VerbUsages::is_used_negatively(vu))?TRUE:FALSE;
     prep = Node::get_prep(verb_phrase);
 
@@ -540,7 +540,7 @@ using a tense other than the present, and all is well.
     if (PM_DescLocalPast_location != current_sentence)
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_DescLocalPast),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DescLocalPast),
             "conditions written in the past tense cannot refer to "
             "temporary values",
             "because they have no past. For instance, the name given in a "
@@ -587,7 +587,7 @@ pattern) plus "in the Home" (a description).
 void ExParser::Subtrees::throw_past_problem(int desc) {
     if (PM_PastSubordinate_issued_at != current_sentence) {
         PM_PastSubordinate_issued_at = current_sentence;
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PastSubordinate),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PastSubordinate),
                 "subordinate clauses have to be in the present tense",
                 "so 'the Black Door was open' is fine, but not 'something which "
                 "was open'. Only the main verb can be in the past tense.");
diff --git a/docs/core-module/11-sc.html b/docs/core-module/11-sc.html
index f36a1b587..02dad8336 100644
--- a/docs/core-module/11-sc.html
+++ b/docs/core-module/11-sc.html
@@ -139,7 +139,7 @@ the meaning of the whole sentence.
 

-    if (A) Problems::Issue::s_subtree_error_set_position(Task::syntax_tree(), A);
+    if (A) StandardProblems::s_subtree_error_set_position(Task::syntax_tree(), A);
     if (conv_log_depth == 0) LOGIF(PREDICATE_CALCULUS, "-----------\n");
     conv_log_depth++;
     LOGIF(PREDICATE_CALCULUS, "[%d] Starting fs on: <%W>\n", conv_log_depth, W);
@@ -198,14 +198,14 @@ it can be applied.
 
 
     subject_phrase_subtree = A;
-    if (subject_phrase_subtree == NULL) Problems::Issue::s_subtree_error(Task::syntax_tree(), "SP subtree null");
+    if (subject_phrase_subtree == NULL) StandardProblems::s_subtree_error(Task::syntax_tree(), "SP subtree null");
     parse_node *verb_phrase_subtree = B;
-    if (verb_phrase_subtree == NULL) Problems::Issue::s_subtree_error(Task::syntax_tree(), "VP subtree null");
-    if (verb_phrase_subtree->down == NULL) Problems::Issue::s_subtree_error(Task::syntax_tree(), "VP subtree broken");
+    if (verb_phrase_subtree == NULL) StandardProblems::s_subtree_error(Task::syntax_tree(), "VP subtree null");
+    if (verb_phrase_subtree->down == NULL) StandardProblems::s_subtree_error(Task::syntax_tree(), "VP subtree broken");
     object_phrase_subtree = verb_phrase_subtree->down;
 
     verb_usage *vu = Node::get_vu(verb_phrase_subtree);
-    if (vu == NULL) Problems::Issue::s_subtree_error(Task::syntax_tree(), "verb null");
+    if (vu == NULL) StandardProblems::s_subtree_error(Task::syntax_tree(), "verb null");
     if ((SV_not_SN == FALSE) && (VerbUsages::get_tense_used(vu) != IS_TENSE))
         Disallow the past tenses in relative clauses1.4.1;
 
diff --git a/docs/core-module/11-tc.html b/docs/core-module/11-tc.html
index dddc8d8ea..8e12a76fd 100644
--- a/docs/core-module/11-tc.html
+++ b/docs/core-module/11-tc.html
@@ -242,7 +242,7 @@ parse the text to find what which property is referred to.
             Problems::quote_wording(2, Node::get_text(p));
             Problems::quote_property(3, prn);
             Problems::quote_wording(4, VW);
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_WithEitherOrValue));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_WithEitherOrValue));
             Problems::issue_problem_segment(
                 "The sentence '%1' seems to be trying to create something which "
                 "has '%2', where the %3 property is being set equal to %4. But "
@@ -262,7 +262,7 @@ parse the text to find what which property is referred to.
             Problems::quote_wording(2, Node::get_text(p));
             Problems::quote_property(3, prn);
             Problems::quote_kind(4, Properties::Valued::kind(prn));
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_WithValuelessValue));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_WithValuelessValue));
             Problems::issue_problem_segment(
                 "The sentence '%1' seems to be trying to create something which "
                 "has '%2', where the %3 property is being set in some way. But "
@@ -294,7 +294,7 @@ that the rest is property name; and otherwise
 
     wording W = Articles::remove_the(Node::get_text(p));
     if (Wordings::empty(W)) {
-        Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(BelievedImpossible),
+        Problems::Using::assertion_problem(Task::syntax_tree(), _p_(BelievedImpossible),
             "this looked to me as if it might be trying to create something "
             "which has certain properties",
             "and that made no sense on investigation. This sometimes happens "
@@ -315,7 +315,7 @@ that the rest is property name; and otherwise
 
 
     LOG("Failed property list: pname = <%W>; pval = <%W>\n", PW, VW);
-    Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_BadPropertyList),
+    Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_BadPropertyList),
         "this looked to me as if it might be trying to create something "
         "which has certain properties",
         "and that made no sense on investigation. This sometimes happens "
diff --git a/docs/core-module/11-tcp.html b/docs/core-module/11-tcp.html
index d7732877b..5ad1bc958 100644
--- a/docs/core-module/11-tcp.html
+++ b/docs/core-module/11-tcp.html
@@ -291,7 +291,7 @@ but it's a very subtle one, and we want to use it only when everything else
                 LOG("Rejecting as unarticled\n");
             if (tck->issue_error == FALSE) return NEVER_MATCH;
             Problems::quote_source(1, current_sentence);
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BareKindVariable));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BareKindVariable));
             Problems::issue_problem_segment(
                 "The sentence %1 seems to use a kind variable by its letter "
                 "alone in the context of a noun, which Inform doesn't allow. "
@@ -348,7 +348,7 @@ problem message has already been issued, but just in case not...
         if (tck->issue_error == FALSE) return NEVER_MATCH;
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, Node::get_text(spec));
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
         Problems::issue_problem_segment(
             "The sentence %1 seems to contain a value '%2' which I can't make "
             "any sense of.");
@@ -460,7 +460,7 @@ would work instead. If it would, we make the change within the proposition.
         if (tck->log_to_I6_text)
             LOG("Term $0 is $u not an object\n", &(pl->terms[0]), actually_find);
         Problems::quote_kind(4, actually_find);
-        Problems::Issue::tcp_problem(_p_(PM_EverywhereMisapplied), tck,
+        StandardProblems::tcp_problem(_p_(PM_EverywhereMisapplied), tck,
             "that seems to say that a value - specifically, %4 - is everywhere. "
             "To Inform, everywhere means 'in every room', and only objects "
             "can be everywhere - in fact not even all of those, as it's a "
@@ -479,7 +479,7 @@ would work instead. If it would, we make the change within the proposition.
         if (tck->log_to_I6_text)
             LOG("Term $0 is $u not an object\n", &(pl->terms[0]), actually_find);
         Problems::quote_kind(4, actually_find);
-        Problems::Issue::tcp_problem(_p_(PM_NowhereMisapplied), tck,
+        StandardProblems::tcp_problem(_p_(PM_NowhereMisapplied), tck,
             "that seems to say that a value - specifically, %4 - is nowhere. "
             "To Inform, nowhere means 'in no room', and only things can be "
             "nowhere. (For instance, 'Godot is nowhere.' is allowed - it means "
@@ -501,7 +501,7 @@ apply HERE inco
         if (tck->log_to_I6_text)
             LOG("Term $0 is $u not an object\n", &(pl->terms[0]), actually_find);
         Problems::quote_kind(4, actually_find);
-        Problems::Issue::tcp_problem(_p_(BelievedImpossible), tck,
+        StandardProblems::tcp_problem(_p_(BelievedImpossible), tck,
             "that seems to say that a value - specifically, %4 - is here. "
             "To Inform, here means 'in the room we're talking about', so only "
             "objects can be 'here'.");
@@ -609,7 +609,7 @@ only produce a problem message when the worst happens.
             LOG("Adjective '%W' undefined on $u\n", W, K);
         Problems::quote_wording(4, W);
         Problems::quote_kind(5, K);
-        Problems::Issue::tcp_problem(_p_(PM_AdjectiveMisapplied), tck,
+        StandardProblems::tcp_problem(_p_(PM_AdjectiveMisapplied), tck,
             "that seems to involve applying the adjective '%4' to %5 - and I "
             "have no definition of it which would apply in that situation. "
             "(Try looking it up in the Lexicon part of the Phrasebook index "
@@ -664,7 +664,7 @@ like "is" — are polymorphic. Here goes:
                 LOG("($u, $u) failed in $2\n", kinds_of_terms[0], kinds_of_terms[1], bp);
                 Problems::quote_kind(4, kinds_of_terms[0]);
                 Problems::quote_kind(5, kinds_of_terms[1]);
-                Problems::Issue::tcp_problem(_p_(PM_ComparisonFailed), tck,
+                StandardProblems::tcp_problem(_p_(PM_ComparisonFailed), tck,
                     "that would mean comparing two kinds of value which cannot mix - "
                     "%4 and %5 - so this must be incorrect.");
             }
@@ -709,7 +709,7 @@ produce a kinds_required
     if (Kinds::get_construct(kinds_of_terms[0]) != CON_relation) {
         Problems::quote_kind(4, kinds_of_terms[0]);
-        Problems::Issue::tcp_problem(_p_(PM_BadUniversal1), tck,
+        StandardProblems::tcp_problem(_p_(PM_BadUniversal1), tck,
             "that asks whether something relates something, and in Inform 'to relate' "
             "means that a particular relation applies between two things. Here, though, "
             "we have %4 rather than the name of a relation.");
@@ -717,7 +717,7 @@ produce a kinds_required    }
     if (Kinds::get_construct(kinds_of_terms[1]) != CON_combination) {
         Problems::quote_kind(4, kinds_of_terms[1]);
-        Problems::Issue::tcp_problem(_p_(BelievedImpossible), tck,
+        StandardProblems::tcp_problem(_p_(BelievedImpossible), tck,
             "that asks whether something relates something, and in Inform 'to relate' "
             "means that a particular relation applies between two things. Here, though, "
             "we have %4 rather than the combination of the two things.");
@@ -763,7 +763,7 @@ required.
     Problems::quote_kind(4, t0);
     Problems::quote_kind(5, t1);
     Problems::quote_relation(6, bp);
-    Problems::Issue::tcp_problem(_p_(PM_TypeCheckBP2), tck,
+    StandardProblems::tcp_problem(_p_(PM_TypeCheckBP2), tck,
         "that would mean applying %6 to kinds of value which do not "
         "fit - %4 and %5 - so this must be incorrect.");
 }
@@ -777,10 +777,10 @@ required.
     Problems::quote_kind(5, need_to_find);
     if (bp) {
         Problems::quote_relation(6, bp);
-        Problems::Issue::tcp_problem(_p_(PM_TypeCheckBP2a), tck,
+        StandardProblems::tcp_problem(_p_(PM_TypeCheckBP2a), tck,
             "that doesn't work because you use %6 with %4 instead of %5.");
     } else {
-        Problems::Issue::tcp_problem(_p_(PM_TypeCheckKind), tck,
+        StandardProblems::tcp_problem(_p_(PM_TypeCheckKind), tck,
             "%4 cannot be %5, so this must be incorrect.");
     }
 }
diff --git a/docs/core-module/12-ap.html b/docs/core-module/12-ap.html
index 4814ea0fd..281dd427f 100644
--- a/docs/core-module/12-ap.html
+++ b/docs/core-module/12-ap.html
@@ -329,7 +329,7 @@ which are dark" will do it).
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantAssertQuantifier),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantAssertQuantifier),
         "the relationship you describe is not exact enough",
         "so that I cannot be sure of the initial situation. A specific "
         "relationship would be something like 'the box is a container in "
@@ -492,7 +492,7 @@ through here, but it isn't exactly an everyday sentence.
 
 
     if (now_negated) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantAssertNonKind),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantAssertNonKind),
             "that seems to say what kind something doesn't have",
             "which is too vague. You must say what kind it does have.");
         return;
@@ -519,7 +519,7 @@ we're dealing with a backdrop. So we play dumb.
 
 
     if (now_negated) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantAssertNegatedEverywhere),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantAssertNegatedEverywhere),
             "that seems to say that something isn't everywhere",
             "which is too vague. You must say where it is.");
         return;
@@ -541,13 +541,13 @@ we're dealing with a backdrop. So we play dumb.
     inference_subject *subj = Calculus::Propositions::Assert::subject_of_term(pl->terms[0]);
     instance *ox = InferenceSubjects::as_object_instance(subj);
     if (now_negated) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
             "that seems to say that something isn't nowhere",
             "which is too vague. You must say where it is.");
         return;
     }
     if (ox == NULL) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
             "that seems to say that something generic is 'nowhere'",
             "which suggests it could some day have a physical location.");
         return;
@@ -570,13 +570,13 @@ problem aside for now.
     inference_subject *subj = Calculus::Propositions::Assert::subject_of_term(pl->terms[0]);
     instance *ox = InferenceSubjects::as_object_instance(subj);
     if (now_negated) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
             "that seems to say that something isn't here",
             "which is too vague. You must say where it is.");
         return;
     }
     if (ox == NULL) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NonInstanceHere),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NonInstanceHere),
             "that seems to say that something generic is 'here'",
             "which would give it a physical location. (It would be like saying "
             "'A number is here' - well, numbers are everywhere and nowhere.)");
@@ -627,7 +627,7 @@ success flag.
             wording W = Adjectives::get_text(aph, FALSE);
             Problems::quote_source(1, current_sentence);
             Problems::quote_wording(2, W);
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_CantAssertAdjective));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_CantAssertAdjective));
             if (parity == FALSE) Problems::issue_problem_segment(
                 "In the sentence %1, you ask me to arrange for something not to be "
                 "'%2' at the start of play. This is only possible when an adjective "
@@ -674,7 +674,7 @@ these kind atoms.
 
 
     if (now_negated) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantAssertNegatedRelations),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantAssertNegatedRelations),
             "that seems to make a negative statement about a relationship",
             "which is too vague. You must make positive assertions.");
         return;
@@ -713,14 +713,14 @@ these kind atoms.
 
     if ((Rvalues::is_nothing_object_constant(spec0)) ||
         (Rvalues::is_nothing_object_constant(spec1)))
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RelationFailedOnNothing),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RelationFailedOnNothing),
             "that is an assertion which involves 'nothing'",
             "which looks as if it might be trying to give me negative rather "
             "than positive information. There's no need to tell me something "
             "like 'Nothing is in the box.': just don't put anything in the box, "
             "and then nothing will be in it.");
     else
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
             "that is an assertion I can't puzzle out",
             "which seems to involve placing two things in some sort of "
             "relationship, but if so then I can't make it work. Perhaps the "
@@ -747,7 +747,7 @@ simpler and clearer.
         if (the_fn == NULL) { the_fn = pt1.function; side = 0; }
         if (the_fn) {
             if ((pl->terms[side].function) || (the_fn->fn_of.function)) {
-                Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
+                StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
                     "that is too complicated an assertion",
                     "and cannot be declared as part of the initial situation. (It "
                     "does make sense, and could be tested with 'if' - it's just "
diff --git a/docs/core-module/12-ca.html b/docs/core-module/12-ca.html
index f138c700c..c0083e55f 100644
--- a/docs/core-module/12-ca.html
+++ b/docs/core-module/12-ca.html
@@ -170,11 +170,11 @@ can suppress the following problem messages:
 
     LOG("Failed on task: $o\n", pl);
     if (task == TEST_ATOM_TASK)
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
             "this is not a condition I am able to test",
             "or at any rate not during play.");
     else
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantForceRelation),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantForceRelation),
             "this is not something I can make true with 'now'",
             "because it is too vague about the underlying cause which would "
             "need to be arranged.");
@@ -191,7 +191,7 @@ can suppress the following problem messages:
         (Frames::used_for_past_tense()) &&
         (suppress_C14ActionVarsPastTense == FALSE)) {
         if (problem_count == 0)
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ActionVarsPastTense),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ActionVarsPastTense),
                 "it is misleading to talk about the noun, the second noun "
                 "or the person asked to do something in past tenses",
                 "because in the past, those were different things and "
@@ -305,7 +305,7 @@ the I6 ofclass
                 if ((Kinds::get_construct(pl->assert_kind) == CON_list_of) && (problem_count == 0)) {
                     Problems::quote_source(1, current_sentence);
                     Problems::quote_kind(2, pl->assert_kind);
-                    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_CantCheckListContents));
+                    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_CantCheckListContents));
                     Problems::issue_problem_segment(
                         "In %1, you use a list which might or might not match a "
                         "definition requiring %2. But there's no efficient way to "
@@ -321,7 +321,7 @@ the I6 ofclass
         case NOW_ATOM_TRUE_TASK:
         case NOW_ATOM_FALSE_TASK:
             if (suppress_C14CantChangeKind == FALSE) {
-                Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantChangeKind),
+                StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantChangeKind),
                     "the kind of something is fixed",
                     "and cannot be changed during play with a 'now'.");
                 asch.schema = NULL;
@@ -347,7 +347,7 @@ to all backdrops which are currently everywhere.
             Calculus::Schemas::modify(sch, "MoveObject(*1, FoundEverywhere); MoveFloatingObjects();");
             return asch;
         case NOW_ATOM_FALSE_TASK:
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantChangeEverywhere),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantChangeEverywhere),
                 "not being 'everywhere' is not something which can be changed "
                 "during play using 'now'",
                 "because it's not exact enough about what needs to be done.");
@@ -389,7 +389,7 @@ propositions to be compiled, so this code is never used.)
             return asch;
         case NOW_ATOM_TRUE_TASK:
         case NOW_ATOM_FALSE_TASK:
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
                 "being 'here' is not something which can be changed during play",
                 "so it cannot be brought about or cancelled out with 'now'.");
             asch.schema = NULL; return asch;
diff --git a/docs/core-module/12-cdp.html b/docs/core-module/12-cdp.html
index 438c1a36c..821ef17a1 100644
--- a/docs/core-module/12-cdp.html
+++ b/docs/core-module/12-cdp.html
@@ -245,7 +245,7 @@ wrong in the calling routine, where they are needed.
 
     if ((LocalVariables::are_we_using_table_lookup()) && (!ct_locals_problem_thrown)) {
         ct_locals_problem_thrown = TRUE;
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantLookUpTableInDeferred),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantLookUpTableInDeferred),
             "I am not able to look up table entries in this complicated "
             "condition",
             "which seems to involve making a potentially large number "
@@ -266,7 +266,7 @@ possible.)
 
 
     if (negated_quantifier_found) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
             "this involves a very complicated negative thought",
             "which I'm not able to untangle. Perhaps you could rephrase "
             "this more simply, or split it into more than one sentence?");
diff --git a/docs/core-module/12-dtd.html b/docs/core-module/12-dtd.html
index 841e21e91..44e9baa34 100644
--- a/docs/core-module/12-dtd.html
+++ b/docs/core-module/12-dtd.html
@@ -170,7 +170,7 @@ that the resulting routine will be called inter_name *Calculus::Deferrals::compile_deferred_description_test(parse_node *spec) {
     pcalc_prop *prop = Specifications::to_proposition(spec);
     if (Calculus::Propositions::contains_callings(prop)) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantCallDeferredDescs),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantCallDeferredDescs),
             "'called' can't be used when testing a description",
             "since it would make a name for something which existed only "
             "so temporarily that it couldn't be used anywhere else.");
@@ -609,7 +609,7 @@ does not have run-time object or value creation.
         switch(pl->element) {
             case QUANTIFIER_ATOM:
                 if (Calculus::Atoms::is_existence_quantifier(pl)) {
-                    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantForceExistence),
+                    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantForceExistence),
                         "this is not explicit enough",
                         "and should set out definite relationships between specific "
                         "things, like 'now the cat is in the bag', not something "
@@ -618,7 +618,7 @@ does not have run-time object or value creation.
                     return;
                 }
                 if (Calculus::Atoms::is_now_assertable_quantifier(pl) == FALSE) {
-                    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantForceGeneralised),
+                    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantForceGeneralised),
                         "this can't be made true with 'now'",
                         "because it is too vague about what it applies to. It's fine "
                         "to say 'now all the doors are open' or 'now none of the doors "
@@ -630,7 +630,7 @@ does not have run-time object or value creation.
                 quantifier_count++;
                 break;
             case CALLED_ATOM:
-                Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantForceCalling),
+                StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantForceCalling),
                     "a 'now' is not allowed to call names",
                     "and it wouldn't really make sense to do so anyway. 'if "
                     "a person (called the victim) is in the Trap Room' makes "
@@ -680,7 +680,7 @@ from absolutely anywhere. Hence the following:
     else if ((q) && (q != for_all_quantifier)) {
         Problems::quote_source(1, current_sentence);
         Problems::quote_spec(2, spec);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
         Problems::issue_problem_segment(
             "In %1 you wrote the description '%2' in the context of a value, "
             "but descriptions used that way are not allowed to talk about "
@@ -702,7 +702,7 @@ from absolutely anywhere. Hence the following:
         LOG("Offending proposition: $D\n", prop);
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, Node::get_text(example));
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_LocalInDescription));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_LocalInDescription));
         Problems::issue_problem_segment(
             "You wrote %1, but descriptions used as values are not allowed to "
             "contain references to temporary values (defined by 'let', or by loops, "
@@ -875,7 +875,7 @@ defer it to a proposition with reason 
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RandomImpossible),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RandomImpossible),
         "this asks to find a random choice from a range which is too "
         "large or impractical",
         "so can't be done. For instance, 'a random person' is fine - "
@@ -1133,7 +1133,7 @@ until it returns 0, when the domain is exhausted.
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CalledInRepeat),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CalledInRepeat),
         "this tries to use '(called ...)' to give names to values "
         "arising in the course of working out what to repeat through",
         "but this is not allowed. (Sorry: it's too hard to get right.)");
@@ -1143,7 +1143,7 @@ until it returns 0, when the domain is exhausted.
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadRepeatDomain),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadRepeatDomain),
         "this describes a collection of values which can't be repeated through",
         "because the possible range is too large (or has no sensible ordering). "
         "For instance, you can 'repeat with D running through doors' because "
@@ -1414,7 +1414,7 @@ passes type-checking successfully.
         Problems::quote_source(1, current_sentence);
         Problems::quote_text(2, billing);
         Problems::quote_wording(3, EW);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
         Problems::issue_problem_segment(
             "In %1, you are asking for %2, but this should range over a "
             "simpler description than '%3', please - it should not include any "
@@ -1429,7 +1429,7 @@ passes type-checking successfully.
         Problems::quote_source(1, current_sentence);
         Problems::quote_text(2, billing);
         Problems::quote_wording(3, EW);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
         Problems::issue_problem_segment(
             "In %1, you are asking for %2, but '%3' looks as if it ranges "
             "over only a single specific object, not a whole collection of "
diff --git a/docs/core-module/12-qr.html b/docs/core-module/12-qr.html
index 4607cc72d..7054b3fc8 100644
--- a/docs/core-module/12-qr.html
+++ b/docs/core-module/12-qr.html
@@ -159,7 +159,7 @@ equality BP as everything else.
             LOG("Unable to apply inequality of $u and $u\n", kinds_of_terms[0], kinds_of_terms[1]);
         Problems::quote_kind(4, kinds_of_terms[0]);
         Problems::quote_kind(5, kinds_of_terms[1]);
-        Problems::Issue::tcp_problem(_p_(PM_InequalityFailed), tck,
+        StandardProblems::tcp_problem(_p_(PM_InequalityFailed), tck,
             "that would mean comparing two kinds of value which cannot mix - "
             "%4 and %5 - so this must be incorrect.");
         return NEVER_MATCH;
diff --git a/docs/core-module/12-ter.html b/docs/core-module/12-ter.html
index ebfbe1cbc..cf03b146e 100644
--- a/docs/core-module/12-ter.html
+++ b/docs/core-module/12-ter.html
@@ -137,7 +137,7 @@ any kind.
     if ((K_understanding) && (Kinds::Compare::eq(kinds_of_terms[0], K_understanding)) &&
             (Kinds::Compare::eq(kinds_of_terms[1], K_text))) {
             LOGIF(MATCHING, "No!\n");
-        Problems::Issue::tcp_problem(_p_(PM_TextIsNotTopic), tck,
+        StandardProblems::tcp_problem(_p_(PM_TextIsNotTopic), tck,
             "though they look the same, because both are written in double "
             "quotes, text values can't in fact be used as topics, so it's "
             "impossible to store this piece of text in that location.");
@@ -177,7 +177,7 @@ for a fairly common mistake:
         if (tck->log_to_I6_text)
             LOG("Comparison of object with $u value\n", kinds_of_terms[1]);
         Problems::quote_kind(4, kinds_of_terms[1]);
-        Problems::Issue::tcp_problem(_p_(PM_NonPropertyCompared), tck,
+        StandardProblems::tcp_problem(_p_(PM_NonPropertyCompared), tck,
             "taken literally that says that an object is the same as a "
             "value. Maybe you intended to say that the object "
             "has a property - but right now %4 is not yet a property; if you "
@@ -237,7 +237,7 @@ setting a global variable.
         if ((NonlocalVariables::is_constant(q)) && (prevailing_mood == CERTAIN_CE))
             allowed = TRUE;
         if (allowed == FALSE)
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantQualifyVariableValues),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantQualifyVariableValues),
                 "a variable can only be given its value straightforwardly or "
                 "qualified by 'usually'",
                 "not with 'always', 'seldom' or 'never'.");
@@ -307,7 +307,7 @@ of both A and B.
                     Kinds::RunTime::interpret_test_equality(st[0], st[1]));
             else if (problem_count == 0) {
                 LOG("$0 and $0; $u and $u\n", &(asch->pt0), &(asch->pt1), st[0], st[1]);
-                Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantCompareValues),
+                StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantCompareValues),
                     "that would involve comparing things which don't mean "
                     "anything to me",
                     "so I'm lost.");
@@ -377,7 +377,7 @@ lantern is bright".
 
     switch (task) {
         case TEST_ATOM_TASK:
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ResponseComparisonUnsafe),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ResponseComparisonUnsafe),
                 "for complicated internal reasons this comparison isn't safe to perform",
                 "and might give you a falsely negative result. To avoid what might "
                 "be misleading, you aren't allowed to compare a response to text.");
@@ -423,7 +423,7 @@ lantern is bright".
             Problems::quote_source(1, current_sentence);
             Problems::quote_kind(2, st[1]);
             Problems::quote_kind(3, st[0]);
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
             Problems::issue_problem_segment(
                 "In the line %1, you seem to be asking me to put %2 into %3, "
                 "which can't safely be done.");
@@ -444,12 +444,12 @@ one that's more helpfully specific and return 
     if (Rvalues::to_instance(asch->pt0.constant)) {
         if (Kinds::Compare::le(Specifications::to_kind(asch->pt0.constant), K_object))
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantEquateValues),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantEquateValues),
                 "equality is not something I can change",
                 "so either those are already the same or are different, and I "
                 "can't alter matters.");
         else
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantChangeNamedConstant),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantChangeNamedConstant),
                 "I can't change that",
                 "because it is a name for a constant value. Some named values, "
                 "like 'the score', can be changed, because they were defined "
diff --git a/docs/core-module/13-ca.html b/docs/core-module/13-ca.html
index 5b8ca61ea..3b8a0a889 100644
--- a/docs/core-module/13-ca.html
+++ b/docs/core-module/13-ca.html
@@ -104,7 +104,7 @@ function togglePopup(material_id) {
         case UNARY_MINUS_OPERATION: Emit unary minus1.11; break;
         case IMPLICIT_APPLICATION_OPERATION: Emit function application1.13; break;
         default:
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
                 "this doesn't seem to be an arithmetic operation",
                 "suggesting a problem with some inline definition.");
             break;
diff --git a/docs/core-module/13-kak.html b/docs/core-module/13-kak.html
index a7c38617f..85e71ed5b 100644
--- a/docs/core-module/13-kak.html
+++ b/docs/core-module/13-kak.html
@@ -243,17 +243,17 @@ kinds:
 void Kinds::Knowledge::kinds_problem_handler(int err_no, parse_node *pn, kind *K1, kind *K2) {
     switch (err_no) {
         case DimensionRedundant_KINDERROR:
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_DimensionRedundant),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DimensionRedundant),
                 "multiplication rules can only be given once",
                 "and this combination is already established.");
             break;
         case DimensionNotBaseKOV_KINDERROR:
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_DimensionNotBaseKOV),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DimensionNotBaseKOV),
                 "multiplication rules can only involve simple kinds of value",
                 "rather than complicated ones such as lists of other values.");
             break;
         case NonDimensional_KINDERROR:
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NonDimensional),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NonDimensional),
                 "multiplication rules can only be given between kinds of "
                 "value which are known to be numerical",
                 "and not all of these are. Saying something like 'Pressure is a "
@@ -263,7 +263,7 @@ kinds:
                 "Inform will realise.");
             break;
         case UnitSequenceOverflow_KINDERROR:
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnitSequenceOverflow),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnitSequenceOverflow),
                 "reading that sentence led me into calculating such a complicated "
                 "kind of value that I ran out of memory",
                 "which my programmer really didn't expect to happen. I think you "
@@ -272,7 +272,7 @@ kinds:
                 "weirdly tricky. Can you simplify?");
             break;
         case DimensionsInconsistent_KINDERROR:
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_DimensionsInconsistent),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DimensionsInconsistent),
                 "this is inconsistent with what is already known about those kinds of value",
                 "all three of which already have well-established relationships - see the "
                 "Kinds index for more.");
@@ -282,7 +282,7 @@ kinds:
             Problems::quote_source(2, pn);
             Problems::quote_kind(3, K1);
             Problems::quote_kind(4, K2);
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_KindUnalterable));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_KindUnalterable));
             Problems::issue_problem_segment(
                 "You wrote %1, but that seems to contradict %2, as %3 and %4 "
                 "are incompatible. (If %3 were a kind of %4 or vice versa "
@@ -294,7 +294,7 @@ kinds:
             Problems::quote_source(2, pn);
             Problems::quote_kind(3, K1);
             Problems::quote_kind(4, K2);
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_KindsCircular));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_KindsCircular));
             Problems::issue_problem_segment(
                 "You wrote %1, but that seems to contradict %2, as it would "
                 "make a circularity with %3 and %4 each being kinds of the "
@@ -302,13 +302,13 @@ kinds:
             Problems::issue_problem_end();
             break;
         case LPCantScaleYet_KINDERROR:
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LPCantScaleYet),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LPCantScaleYet),
                 "this tries to scale up or down a value which so far has no point of "
                 "reference to scale from",
                 "which is impossible.");
             break;
         case LPCantScaleTwice_KINDERROR:
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LPCantScaleTwice),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LPCantScaleTwice),
                 "this tries to specify the scaling for a kind of value whose "
                 "scaling is already established",
                 "which is impossible.");
diff --git a/docs/core-module/13-rsfk.html b/docs/core-module/13-rsfk.html
index cc3e8e352..dded419fa 100644
--- a/docs/core-module/13-rsfk.html
+++ b/docs/core-module/13-rsfk.html
@@ -243,14 +243,14 @@ chosen), but no problem message has been issued about this, or
         Problems::quote_wording_as_source(1, W);
         Problems::quote_kind(2, K);
         Problems::quote_text(3, storage_name);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_EmptyKind2));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_EmptyKind2));
         Problems::issue_problem_segment(
             "I am unable to put any value into the %3 %1, which needs to be %2, "
             "because the world does not contain %2.");
         Problems::issue_problem_end();
     } else {
         Problems::quote_kind(2, K);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_EmptyKind));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_EmptyKind));
         Problems::issue_problem_segment(
             "I am unable to find %2 to use here, because the world does not "
             "contain %2.");
@@ -266,7 +266,7 @@ chosen), but no problem message has been issued about this, or
     if (Wordings::nonempty(W)) {
         Problems::quote_wording_as_source(1, W);
         Problems::quote_kind(2, K);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
         Problems::issue_problem_segment(
             "I am unable to create %1 with the kind of value '%2', "
             "because this is a kind of value which is not allowed as "
@@ -277,7 +277,7 @@ chosen), but no problem message has been issued about this, or
         Problems::issue_problem_end();
     } else {
         Problems::quote_kind(1, K);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
         Problems::issue_problem_segment(
             "I am unable to create a value of the kind '%1' "
             "because this is a kind of value which is not allowed as "
@@ -295,7 +295,7 @@ chosen), but no problem message has been issued about this, or
 
 
     Problems::quote_wording_as_source(1, W);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
     Problems::issue_problem_segment(
         "I am unable to start %1 off with any value, because the "
         "instructions do not tell me what kind of value it should be "
@@ -877,7 +877,7 @@ recursively scanned through for us, so that if we have seen a construction
     } else {
         Problems::quote_source(1, current_sentence);
         Problems::quote_kind(2, K);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
         Problems::issue_problem_segment(
             "While working on '%1', I needed to be able to make a default value "
             "for the kind '%2', but there's no obvious way to make one.");
@@ -2090,7 +2090,7 @@ Z-machine array space.
     if (Kinds::RunTime::target_VM_supports(K) == FALSE) {
         if (VM_non_support_problem_issued == FALSE) {
             VM_non_support_problem_issued = TRUE;
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_KindRequiresGlulx));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_KindRequiresGlulx));
             Problems::quote_source(1, current_sentence);
             Problems::quote_kind(2, K);
             Problems::issue_problem_segment(
diff --git a/docs/core-module/14-ds2.html b/docs/core-module/14-ds2.html
index 7d8527e7f..7e2a0fcb3 100644
--- a/docs/core-module/14-ds2.html
+++ b/docs/core-module/14-ds2.html
@@ -375,9 +375,9 @@ to ensure that if we have
     if (problem_count > backtraced_problem_count) {
         if ((p) && (p->down) &&
             (Node::get_type(p) == INVOCATION_LIST_NT)) {
-            it_is_not_worth_adding = TRUE;
+            Strings::TextSubstitutions::it_is_not_worth_adding();
             Backtrace what phrase definitions the type-checker was looking at10.1.1;
-            it_is_not_worth_adding = FALSE;
+            Strings::TextSubstitutions::it_is_worth_adding();
             backtraced_problem_count = problem_count;
         }
     }
@@ -404,7 +404,7 @@ from a text substitution.)
     }
 
     int announce = TRUE;
-    text_stream *latest = Problems::Issue::latest_sigil();
+    text_stream *latest = Problems::latest_sigil();
     if (Str::eq_wide_string(latest, L"PM_AllInvsFailed")) announce = FALSE;
 
     if (announce) Produce the I was trying... banner10.1.1.1;
@@ -819,7 +819,7 @@ extension, which made use of the old undocumented     THIS_IS_AN_ORDINARY_PROBLEM;
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, Node::get_text(p->down));
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ValueAsStorageItem));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ValueAsStorageItem));
     Problems::issue_problem_segment(
         "You wrote %1, but '%2' is a value, not a place where a value is "
         "stored. "
@@ -839,7 +839,7 @@ extension, which made use of the old undocumented     THIS_IS_AN_ORDINARY_PROBLEM;
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, Node::get_text(p->down));
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ValueAsTableReference));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ValueAsTableReference));
     Problems::issue_problem_segment(
         "You wrote %1, but '%2' is a value, not a reference to an entry "
         "in a table.");
@@ -859,7 +859,7 @@ extension, which made use of the old undocumented             Problems::quote_text(3, "a kind of value");
         else
             Problems::quote_kind_of(3, p->down);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ExistingVarNotFound));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ExistingVarNotFound));
         Problems::issue_problem_segment(
             "In the sentence %1, I was expecting that '%2' would be the "
             "name of a temporary value, but it turned out to be %3.");
@@ -877,7 +877,7 @@ extension, which made use of the old undocumented     Problems::quote_wording(2, Node::get_text(p->down));
     Problems::quote_spec(3, p->down);
     Problems::quote_spec(4, val);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NotExactValueWanted));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NotExactValueWanted));
     Problems::issue_problem_segment(
         "In the sentence %1, I was expecting that '%2' would be the specific "
         "value '%4'.");
@@ -892,7 +892,7 @@ extension, which made use of the old undocumented     THIS_IS_AN_ORDINARY_PROBLEM;
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, Node::get_text(p->down));
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(...));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(...));
     Problems::issue_problem_segment(
         "In the sentence %1, I was expecting that '%2' would be a phrase.");
     Problems::issue_problem_end();
@@ -957,7 +957,7 @@ species; and then to misuse that phrase.
     else
         Problems::quote_kind_of(3, p->down);
     Problems::quote_kind(4, K);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_KindOfVariable));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_KindOfVariable));
     Problems::issue_problem_segment(
         "In the sentence %1, I was expecting that '%2' would be a new "
         "variable name (to hold %4), but it turned out to be %3.");
@@ -1242,7 +1242,7 @@ no way safely to adjudicate that at run-time.
 
     THIS_IS_AN_ORDINARY_PROBLEM;
     Problems::quote_source(1, current_sentence);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_UnequalValueAmbiguity));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_UnequalValueAmbiguity));
     Problems::issue_problem_segment(
         "The phrase %1 is ambiguous in a way that I can't disentangle. "
         "It has more than one plausible interpretation, such that it "
@@ -1386,7 +1386,7 @@ Room" is a number, because the kind of the property "carrying capacity" is
             Node::set_kind_resulting(inv, Properties::Valued::kind(prn));
         else {
             THIS_IS_AN_INTERESTING_PROBLEM {
-                Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TotalEitherOr),
+                StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TotalEitherOr),
                     "this seems to be an attempt to total up an either/or property",
                     "and by definition such a property has nothing to total.");
             }
@@ -1406,7 +1406,7 @@ with it.)
     LOG_DASH("(4I.a.1) failed as nonproperty");
     if (Kinds::get_construct(Node::get_kind_of_value(P)) == CON_table_column) {
         THIS_IS_AN_INTERESTING_PROBLEM {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TotalTableColumn),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TotalTableColumn),
                 "this seems to be an attempt to total up the column of a table",
                 "whereas it's only legal to use 'total' for properties.");
         }
@@ -1484,7 +1484,7 @@ L and R are more definite.
                 case REMAINDER_OPERATION: Problems::quote_text(6, "dividing"); Problems::quote_text(7, "by"); break;
                 case APPROXIMATION_OPERATION: Problems::quote_text(6, "rounding"); Problems::quote_text(7, "to"); break;
             }
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadArithmetic));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadArithmetic));
             Problems::issue_problem_segment(
                 "You wrote %1, but that seems to involve %6 %4 ('%2') %7 %5 ('%3'), "
                 "which is not good arithmetic.");
@@ -1561,7 +1561,7 @@ instance, if inv            if ((Routines::Compile::disallow_let()) && (Phrases::TypeData::is_a_let_assignment(ph))) {
                 THIS_IS_AN_INTERESTING_PROBLEM {
                     Problems::quote_source(1, current_sentence);
-                    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_LetCreatedInIf));
+                    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_LetCreatedInIf));
                     Problems::issue_problem_segment(
                         "You wrote %1, but when a temporary value is created "
                         "inside an 'if ..., ...' or an 'otherwise ...', it only "
@@ -1671,7 +1671,7 @@ in ith_token, a
                         Problems::quote_source(1, current_sentence);
                         Problems::quote_wording(2, W);
                         Problems::quote_kind(3, ikind);
-                        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NameOfKindMismatch));
+                        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NameOfKindMismatch));
                         Problems::issue_problem_segment(
                             "You wrote %1, but although '%2' is the name of a kind, "
                             "it isn't the name of a kind of %3, which this phrase needs.");
@@ -1684,7 +1684,7 @@ in ith_token, a
                     Problems::quote_source(1, current_sentence);
                     Problems::quote_wording(2, W);
                     Problems::quote_kind(3, ikind);
-                    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadLocalKOV));
+                    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadLocalKOV));
                     Problems::issue_problem_segment(
                         "You wrote %1, but although '%2' is the name of a kind, "
                         "it isn't a definite kind and is instead a general "
@@ -1702,7 +1702,7 @@ in ith_token, a
         THIS_IS_AN_ORDINARY_PROBLEM {
             Problems::quote_source(1, current_sentence);
             Problems::quote_wording(2, Node::get_text(ith_token));
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NameOfKindIsnt));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NameOfKindIsnt));
             Problems::issue_problem_segment(
                 "You wrote %1, but although '%2' does have a meaning, "
                 "it isn't the name of a kind, which this phrase needs.");
@@ -1798,7 +1798,7 @@ against a definition like:
     THIS_IS_A_GROSSER_THAN_GROSS_PROBLEM;
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, Node::get_text(p));
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
     Problems::issue_problem_segment(
         "In the line %1, you seem to be using '%2' to produce a value, but "
         "it's not clear what kind of value this will be. It seems to use "
@@ -1999,7 +1999,7 @@ this case in the type-checker is never exercised.
             Problems::quote_source(1, current_sentence);
             Problems::quote_wording(2, Node::get_text(target));
             Problems::quote_wording(3, Node::get_text(new_value));
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));  the parser seems not to allow these
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));  the parser seems not to allow these
             Problems::issue_problem_segment(
                 "You wrote %1, asking to change the object '%2'. This would "
                 "make sense if '%3' were an either/or property like 'open' "
@@ -2014,7 +2014,7 @@ this case in the type-checker is never exercised.
             Problems::quote_source(1, current_sentence);
             Problems::quote_wording(2, Node::get_text(target));
             Problems::quote_property(3, prn);
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
             Problems::issue_problem_segment(
                 "You wrote %1, but '%2' is not allowed to have the property '%3'.");
             Problems::issue_problem_end();
@@ -2063,7 +2063,7 @@ literal can mean are too generous.)
             Problems::quote_kind(3, Specifications::to_kind(target));
             Problems::quote_wording(4, Node::get_text(new_value));
             Problems::quote_kind(5, Specifications::to_kind(new_value));
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ChangeToWrongValue));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ChangeToWrongValue));
             Problems::issue_problem_segment(
                 "You wrote %1, but '%2' is supposed to be "
                 "%6 %3, so it cannot be set equal to %4, whose kind is %5.");
@@ -2184,7 +2184,7 @@ loops, or other control structures; for instance,
                 if (Frames::Blocks::inside_a_loop_body() == FALSE) {
                     THIS_IS_AN_INTERESTING_PROBLEM {
                         Problems::quote_source(1, current_sentence);
-                        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_CantUseOutsideLoop));
+                        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_CantUseOutsideLoop));
                         Problems::issue_problem_segment(
                             "%1 makes sense only inside a 'while' or 'repeat' loop.");
                         Problems::issue_problem_end();
@@ -2198,7 +2198,7 @@ loops, or other control structures; for instance,
                     THIS_IS_AN_INTERESTING_PROBLEM {
                         Problems::quote_source(1, current_sentence);
                         Problems::quote_wide_text(2, required);
-                        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_CantUseOutsideStructure));
+                        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_CantUseOutsideStructure));
                         Problems::issue_problem_segment(
                             "%1 makes sense only inside a '%2' block.");
                         Problems::issue_problem_end();
@@ -2218,7 +2218,7 @@ loops, or other control structures; for instance,
         if ((ph) && (ph->type_data.now_deprecated)) {
             THIS_IS_AN_INTERESTING_PROBLEM {
                 Problems::quote_source(1, current_sentence);
-                Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));  too moving a target to test
+                StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));  too moving a target to test
                 Problems::issue_problem_segment(
                     "'%1' uses a phrase which is now deprecated: you should rephrase "
                     "to avoid the need for it. I'd normally allow this, but you have "
@@ -2314,7 +2314,7 @@ and allowed only in phrases using the         (kind_needed) &&
         (!(Node::is(context, LVALUE_TR_CONTEXT_NT)))) {
         THIS_IS_A_GROSSER_THAN_GROSS_PROBLEM;
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_InexplicitTableEntryAsValue),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_InexplicitTableEntryAsValue),
             "this form of table entry can only be used in certain special phrases",
             "because it doesn't explicitly refer to a single value. (You can see "
             "which phrases in the Phrasebook index: it's allowed wherever a 'table "
@@ -2335,14 +2335,14 @@ and allowed only in phrases using the     kind *K2 = Specifications::to_kind(p->down->next);
     if (Kinds::unary_construction_material(K1) == NULL) {
         THIS_IS_A_GROSSER_THAN_GROSS_PROBLEM;
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_EntryOfNonList),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_EntryOfNonList),
             "that doesn't make sense to me as a list entry",
             "since the entry is taken from something which isn't a list.");
         return NEVER_MATCH;
     }
     if (Kinds::Compare::eq(K2, K_number) == FALSE) {
         THIS_IS_A_GROSSER_THAN_GROSS_PROBLEM;
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NonNumericListEntry),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NonNumericListEntry),
             "that doesn't make sense to me as a list entry",
             "because the indication of which entry is not a number. "
             "For instance, 'entry 3 of L' is allowed, but not 'entry "
@@ -2398,7 +2398,7 @@ a property when recovering from other problems.
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, Node::get_text(p));
     Problems::quote_wording(3, Node::get_text(the_property));
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
     Problems::issue_problem_segment(
         "In the sentence %1, it looks as if you intend '%2' to be a property "
         "of something, but there is no such property as '%3'.");
@@ -2413,7 +2413,7 @@ a property when recovering from other problems.
     THIS_IS_A_GROSSER_THAN_GROSS_PROBLEM;
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, Node::get_text(p));
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_EitherOrAsValue));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_EitherOrAsValue));
     Problems::issue_problem_segment(
         "In the sentence %1, it looks as if you intend '%2' to be the value "
         "of a property of something, but that property has no value: it's "
@@ -2437,7 +2437,7 @@ a property when recovering from other problems.
         Problems::quote_wording(3, Node::get_text(the_owner));
     else owner_quoted = FALSE;
     LOG("Owner tree is $T\n", the_owner);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyOfKind2));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyOfKind2));
     if (owner_quoted) {
         if (Wordings::nonempty(Node::get_text(p)))
             Problems::issue_problem_segment(
@@ -2477,7 +2477,7 @@ a property when recovering from other problems.
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, prn->name);
     Problems::quote_subject(3, owning_subject);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_LookedUpForbiddenProperty));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_LookedUpForbiddenProperty));
     Problems::issue_problem_segment(
         "In the sentence %1, you seem to be looking up the '%2' property, "
         "but '%3' is not allowed to have that property. ");
@@ -2502,7 +2502,7 @@ a property when recovering from other problems.
         if ((Kinds::get_construct(col_kind) != CON_table_column) ||
             (col_contents_kind == NULL)) {
             THIS_IS_A_GROSSER_THAN_GROSS_PROBLEM;
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
                 "that doesn't make sense to me as a table entry",
                 "since the entry is taken from something which isn't a table.");
             return NEVER_MATCH;
@@ -2512,7 +2512,7 @@ a property when recovering from other problems.
             Problems::quote_source(1, current_sentence);
             Problems::quote_kind(2, col_contents_kind);
             Problems::quote_kind(3, key_kind);
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TableCorrFruitless));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TableCorrFruitless));
             Problems::issue_problem_segment(
                 "In the sentence %1, you seem to be looking up a corresponding "
                 "entry in a table: but it's fruitless to go looking for %3 "
@@ -2530,13 +2530,13 @@ a property when recovering from other problems.
     THIS_IS_A_GROSS_PROBLEM;
     if (<structural-phrase-problem-diagnosis>(Node::get_text(p)) == FALSE) {
         if (Wordings::mismatched_brackets(Node::get_text(p))) {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnpairedBrackets),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnpairedBrackets),
                 "this is a phrase which I don't recognise",
                 "perhaps because it uses brackets '(' and ')' or braces '{' and '}' "
                 "in a way that doesn't make sense to me. Each open '(' or '{' has "
                 "to have a matching ')' or '}'.");
         } else {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnknownPhrase),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnknownPhrase),
                 "this is a phrase which I don't recognise",
                 "possibly because it is one you meant to define but never got round "
                 "to, or because the wording is wrong (see the Phrasebook section of "
@@ -2562,7 +2562,7 @@ up on misuse of structural phrases.
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_WrongContinue),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_WrongContinue),
         "this is a phrase which I don't recognise",
         "and which isn't defined. Perhaps you wanted the phrase which "
         "would skip to the next repetition of a loop, since that's "
@@ -2733,7 +2733,7 @@ of a relation.
     THIS_IS_AN_ORDINARY_PROBLEM;
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, Node::get_text(initial_value));
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
     Problems::issue_problem_segment(
         "The phrase %1 tries to use 'let' to give a temporary name to a value, "
         "but the value ('%2') is one that I can't understand.");
@@ -2755,7 +2755,7 @@ relevant code to issue a better problem message if it can.
     Lists::check_one(Node::get_text(initial_value));
     if (pc == problem_count) {
         Problems::quote_source(1, current_sentence);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_CantLetEmptyList));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_CantLetEmptyList));
         Problems::issue_problem_segment(
             "The phrase %1 tries to use 'let' to give a temporary name to the "
             "empty list '{ }', but because it's empty, I can't tell what kind of "
@@ -2774,7 +2774,7 @@ relevant code to issue a better problem message if it can.
 
 
     THIS_IS_AN_ORDINARY_PROBLEM;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
         "this isn't a definite kind",
         "and is instead a general description which might apply to many "
         "different kinds, so I can't see how to create this named value. "
@@ -2915,7 +2915,7 @@ intended and to report the problem with that one.
                 Problems::quote_wording(2, PW);
                 Problems::quote_kind(3, K);
                 Problems::quote_kind(4, W);
-                Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadIntermediateKind));
+                StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadIntermediateKind));
                 Problems::issue_problem_segment(
                     "In %1, the phrase '%2' doesn't seem to fit: I was hoping it would "
                     "be %4, but in fact it's %3.");
@@ -2932,7 +2932,7 @@ intended and to report the problem with that one.
             END_DASH_MODE;
         }
         if (problem_count == 0)
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
                 "the ingredients in this phrase do not fit it",
                 "and I am confused enough by this that I can't give a very helpful "
                 "problem message. Sorry about that.");
@@ -2943,7 +2943,7 @@ intended and to report the problem with that one.
 

-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_AllInvsFailed));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_AllInvsFailed));
     Problems::quote_source(1, current_sentence);
     Problems::issue_problem_segment(
         "You wrote %1, which I tried to match against several possible phrase "
@@ -2965,7 +2965,7 @@ unrecognised.
 

-    Problems::Issue::sentence_in_detail_problem(Task::syntax_tree(), _p_(PM_SayAList), W,
+    StandardProblems::sentence_in_detail_problem(Task::syntax_tree(), _p_(PM_SayAList), W,
         "this asked to say 'a list of...'",
         "which I read as being a general description applying to some "
         "lists and not others, so it's not something which can be said. "
@@ -2977,7 +2977,7 @@ unrecognised.
 

-    Problems::Issue::sentence_in_detail_problem(Task::syntax_tree(), _p_(BelievedImpossible), W,
+    StandardProblems::sentence_in_detail_problem(Task::syntax_tree(), _p_(BelievedImpossible), W,
         "this asked to say something which I do not recognise",
         "either as a value or as one of the possible text substitutions.");
 
@@ -3108,7 +3108,7 @@ us with the air of having just made a great discovery; well, you can't have Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(p)); Problems::quote_kind(3, kind_expected); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NothingForSomething)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NothingForSomething)); Problems::issue_problem_segment( "You wrote %1, but '%2' is literally no thing, and it consequently does " "not count as %3."); @@ -3180,7 +3180,7 @@ helpful about what exactly is wrong. Dash::clear_validation_case(); <action-pattern>(Node::get_text(p)); if (Dash::get_validation_case(&spec, &K, &K2)) { - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_UnknownTryAction1)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_UnknownTryAction1)); Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(p)); Problems::quote_wording(3, Node::get_text(spec)); @@ -3193,7 +3193,7 @@ helpful about what exactly is wrong. "made sense, but it turned out to be %5."); Problems::issue_problem_end(); } else { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnknownTryAction2), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnknownTryAction2), "this is not an action I recognise", "or else is malformed in a way I can't see how to sort out."); } @@ -3223,7 +3223,7 @@ substitution or not.

-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_SayComma));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_SayComma));
     Problems::issue_problem_segment(
         "In the line %1, I was expecting that '%2' would be something to "
         "'say', but unexpectedly it began with a comma. The usual form is "
@@ -3236,7 +3236,7 @@ substitution or not.
 

-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_SayUnicode));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_SayUnicode));
     Problems::issue_problem_segment(
         "In the line %1, I was expecting that '%2' would be something to "
         "'say', but it didn't look like any form of 'say' that I know. "
@@ -3256,7 +3256,7 @@ substitution or not.
 

-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_SayElseMisplaced));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_SayElseMisplaced));
     Problems::issue_problem_segment(
         "In the line %1, I was expecting that '%2' would be something to "
         "'say', but unexpectedly I found an 'otherwise' (or 'else'). That "
@@ -3269,7 +3269,7 @@ substitution or not.
 

-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_SayUnknownCondition));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_SayUnknownCondition));
     Problems::issue_problem_segment(
         "In the line %1, I was expecting that '%2' would be something to "
         "'say', but it didn't look like any form of 'say' that I know. So "
@@ -3296,7 +3296,7 @@ substitution or not.
 

-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_SayUnknown));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_SayUnknown));
     Problems::issue_problem_segment(
         "In the line %1, I was expecting that '%2' would be something to "
         "'say', but it didn't look like any form of 'say' that I know. So "
@@ -3328,7 +3328,7 @@ the clauses, summing up their status in turn:
 

-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_CompoundConditionFailed));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_CompoundConditionFailed));
     Problems::issue_problem_segment(
         "In the sentence %1, I was expecting that '%2' would be a condition. "
         "It didn't make sense as one long phrase, but because it was divided up by "
@@ -3386,7 +3386,7 @@ common misunderstanding.
 

-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NumberOfTurns));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NumberOfTurns));
     Issue the generic unknown wording message21.1.1;
     Problems::issue_problem_segment(
         "%PPerhaps by 'turns' you meant the number of turns of play to date? "
@@ -3398,7 +3398,7 @@ common misunderstanding.
 

-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_OutOfPlay));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_OutOfPlay));
     Issue the generic unknown wording message21.1.1;
     Problems::issue_problem_segment(
         "%PPeople sometimes say that things or people removed from all "
@@ -3414,7 +3414,7 @@ common misunderstanding.
 

-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_OptionlessOption));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_OptionlessOption));
     Issue the generic unknown wording message21.1.1;
     Problems::issue_problem_segment(
         "%PThe names of use options, on the rare occasions when they "
@@ -3429,7 +3429,7 @@ common misunderstanding.
 

-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ActivityOf));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ActivityOf));
     Issue the generic unknown wording message21.1.1;
     Problems::issue_problem_segment(
         "%PActivity names rarely end with 'of': for instance, when we talk "
@@ -3442,7 +3442,7 @@ common misunderstanding.
 

-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_MidTextUnicode));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_MidTextUnicode));
     Issue the generic unknown wording message21.1.1;
     Problems::issue_problem_segment(
         "%PMaybe you intended this to produce a Unicode character? "
@@ -3460,7 +3460,7 @@ common misunderstanding.
 

-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_UnknownCondition));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_UnknownCondition));
     Issue the generic unknown wording message21.1.1;
     Problems::issue_problem_segment(
         "%PNames which end in 'condition' often represent the current "
@@ -3477,7 +3477,7 @@ common misunderstanding.
 

-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ActivityWithFor));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ActivityWithFor));
     Issue the generic unknown wording message21.1.1;
     Problems::issue_problem_segment(
         "%PWere you by any chance meaning to refer to an activity by name, "
@@ -3490,7 +3490,7 @@ common misunderstanding.
 

-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_Unknown));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_Unknown));
     Issue the generic unknown wording message21.1.1;
     Problems::issue_problem_end();
 
@@ -3667,7 +3667,7 @@ action value, which is a specific action. THIS_IS_A_GROSSER_THAN_GROSS_PROBLEM; Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(p)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ActionNotSpecific)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ActionNotSpecific)); Problems::issue_problem_segment( "You wrote %1, but '%2' is too vague to describe a specific action. " "%PIt has to be an exact instruction about what is being done, and " @@ -3680,7 +3680,7 @@ action value, which is a specific action. THIS_IS_A_GROSSER_THAN_GROSS_PROBLEM; Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(p)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ActionTooSpecific)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ActionTooSpecific)); Problems::issue_problem_segment( "You wrote %1, but '%2' imposes too many restrictions on the " "action to be carried out, by saying something about the " @@ -3783,7 +3783,7 @@ it to a constant value, using the "description of..." constructor. THIS_IS_AN_INTERESTING_PROBLEM { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(p)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadQuantifierInDescription)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadQuantifierInDescription)); Problems::issue_problem_segment( "In %1 you wrote the description '%2' in the context of a value, " "but descriptions used that way are not allowed to talk about " @@ -3810,7 +3810,7 @@ defined a phrase for only one case: Problems::quote_wording(2, Node::get_text(p)); Problems::quote_kind(3, K); Problems::quote_kind(4, domain); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); Problems::issue_problem_segment( "In the line %1, the text '%2' seems to be a description of %3, but " "a description of %4 was required."); @@ -3832,7 +3832,7 @@ any universal quantifier ("all", etc.) is removed. THIS_IS_AN_ORDINARY_PROBLEM; Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(p)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); Problems::issue_problem_segment( "In the line %1, the text '%2' is given where a description of a collection " "of things or values was required. For instance, 'rooms which contain " @@ -3859,7 +3859,7 @@ have made an understandable confusion. THIS_IS_AN_ORDINARY_PROBLEM; Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(p)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); screened out at definition time + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); screened out at definition time Problems::issue_problem_segment( "In the line %1, '%2' ought to be a value, but isn't - there must be " "something fishy about the way it was created. %P" @@ -3953,14 +3953,14 @@ it says the value has the wrong kind. if (Node::is(p, LOCAL_VARIABLE_NT)) { local_variable *lvar = Node::get_constant_local_variable(p); Problems::quote_kind(4, LocalVariables::kind(lvar)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_LocalMismatch)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_LocalMismatch)); Problems::issue_problem_segment( "You wrote %1, but '%2' is a temporary name for %4 (created by 'let' " "or 'repeat'), whereas I was expecting to find %3 there."); Problems::issue_problem_end(); } else if (Kinds::Compare::eq(kind_expected, K_sayable_value)) { Problems::quote_kind(4, Specifications::to_kind(p)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_AllSayInvsFailed)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_AllSayInvsFailed)); if (Wordings::empty(Node::get_text(p))) Problems::issue_problem_segment( "You wrote %1, but that only works for sayable values, that is, " @@ -3976,7 +3976,7 @@ it says the value has the wrong kind. LOG("Found: $u; Expected: $u\n", Specifications::to_kind(p), kind_expected); Problems::quote_kind(4, Specifications::to_kind(p)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TypeMismatch)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TypeMismatch)); if (Wordings::empty(Node::get_text(p))) Problems::issue_problem_segment( "You wrote %1, but that has the wrong kind of value: %4 rather than %3."); @@ -4021,7 +4021,7 @@ same species as well. Problems::quote_wording(2, Node::get_text(p)); Problems::quote_kind(3, kind_expected); Problems::quote_kind_of(4, p); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_GenericDescription)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_GenericDescription)); Problems::issue_problem_segment( "You wrote %1, but '%2' is used in a context where I'd expect to see " "a (single) specific example of %3. Although what you wrote did " @@ -4035,7 +4035,7 @@ same species as well. Problems::quote_wording(2, Node::get_text(p)); Problems::quote_kind(3, kind_expected); Problems::quote_kind_of(4, p); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_LiteralDescriptionAsValue)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_LiteralDescriptionAsValue)); Problems::issue_problem_segment( "You wrote %1, but '%2' is used in a context where I'd expect to see " "a (single) specific example of %3, not a description."); @@ -4065,7 +4065,7 @@ resorts when it has nothing more specific to say. Problems::quote_wording(2, Node::get_text(p)); Problems::quote_kind(3, kind_expected); Problems::quote_kind_of(4, p); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); at any rate I haven't seen it lately + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); at any rate I haven't seen it lately Problems::issue_problem_segment( "You wrote %1, but '%2' seems to be %4, whereas I was expecting to " "find %3 there."); diff --git a/docs/core-module/14-rv.html b/docs/core-module/14-rv.html index 5b4b0ba17..667690696 100644 --- a/docs/core-module/14-rv.html +++ b/docs/core-module/14-rv.html @@ -944,7 +944,7 @@ in several contexts by using a tilde: if (parity == 1) { Emit::holster(VH, Properties::iname(prn_to_eval)); } else { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(Untestable), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(Untestable), "this refers to an either-or property with a negative " "that I can't unravel'", "which normally never happens. (Are you using 'change' " diff --git a/docs/core-module/15-cp.html b/docs/core-module/15-cp.html index 2255d0678..161ca9600 100644 --- a/docs/core-module/15-cp.html +++ b/docs/core-module/15-cp.html @@ -130,7 +130,7 @@ possible values these are.) Problems::quote_kind(2, common_kind); Problems::quote_wording(3, CKW); Problems::quote_wording(4, NKW); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_MixedExistingConstants)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_MixedExistingConstants)); Problems::issue_problem_segment( "In %1, one of the values you supply as a possibility is '%3', " "but this already has a meaning (as %2). This might be okay if " @@ -139,7 +139,7 @@ possible values these are.) } else if (prn == NULL) { Problems::quote_source(1, current_sentence); Problems::quote_kind(2, common_kind); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); because it won't parse + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); because it won't parse Problems::issue_problem_segment( "In %1, every value you supply as a possibility is %2. " "That would be okay if it were a property which is a condition " diff --git a/docs/core-module/15-cr.html b/docs/core-module/15-cr.html index 25be93ab7..56c261b99 100644 --- a/docs/core-module/15-cr.html +++ b/docs/core-module/15-cr.html @@ -126,7 +126,7 @@ as usual, but the right is more leniently handled. LOG("Comparative misapplied to $Y not $Y\n", prn, bp->comparative_property); Problems::quote_property(4, bp->comparative_property); Problems::quote_property(5, prn); - Problems::Issue::tcp_problem(_p_(PM_ComparativeMisapplied), tck, + StandardProblems::tcp_problem(_p_(PM_ComparativeMisapplied), tck, "that ought to make a comparison of %4 not %5."); return NEVER_MATCH; } diff --git a/docs/core-module/15-ep.html b/docs/core-module/15-ep.html index 4e1ef5a04..e7ad18358 100644 --- a/docs/core-module/15-ep.html +++ b/docs/core-module/15-ep.html @@ -119,7 +119,7 @@ and stored_in_negation
 property *Properties::EitherOr::obtain(wording W, inference_subject *infs) {
     if (<k-kind>(W)) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_KindAdjectiveClash),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_KindAdjectiveClash),
             "this tries to create a new either/or adjective with the same name "
             "as an existing kind",
             "which isn't allowed. For example, 'A hopper can be a container.' is "
@@ -198,7 +198,7 @@ around), but not to break one.
                 Problems::quote_property(4, neg);
                 Problems::quote_property(5, neg->negation);
             }
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BrokenNegationPair));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BrokenNegationPair));
             Problems::issue_problem_segment(
                 "In %1, you proposed to set up the properties '%2' and '%3' as "
                 "opposites of each other. But I can't allow that, because '%4' "
diff --git a/docs/core-module/15-ia.html b/docs/core-module/15-ia.html
index e0df6eb4c..464f4e114 100644
--- a/docs/core-module/15-ia.html
+++ b/docs/core-module/15-ia.html
@@ -106,7 +106,7 @@ ambiguously.
 

-    Problems::Issue::infs_contradiction_problem(_p_(PM_TwoAppearances),
+    StandardProblems::infs_contradiction_problem(_p_(PM_TwoAppearances),
         World::Inferences::where_inferred(inf), current_sentence, infs,
         "seems to have two different descriptions",
         "perhaps because you intended the second description to apply to something "
@@ -140,7 +140,7 @@ available;
                 if ((P_description) &&
                     (World::Permissions::find(infs, P_description, TRUE))) {
                     Properties::Valued::assert(P_description, infs, txt, CERTAIN_CE);
-                } else Problems::Issue::inference_problem(_p_(PM_IndefiniteTextMeaningless),
+                } else StandardProblems::inference_problem(_p_(PM_IndefiniteTextMeaningless),
                     infs, inf, "is not allowed",
                     "i.e., you can't write a double-quoted piece of text as a "
                     "sentence all by itself here. Some kinds or kinds of value "
diff --git a/docs/core-module/15-ma.html b/docs/core-module/15-ma.html
index 8e249c9cc..b38a96e2a 100644
--- a/docs/core-module/15-ma.html
+++ b/docs/core-module/15-ma.html
@@ -246,7 +246,7 @@ definition structure stands incomplete for a while. Filling it in is called
         mdef->prop = NULL;
         LOG("Validating mdef with headword %W... <%W>\n",
             mdef->headword, mdef->name_of_property_to_compare);
-        Problems::Issue::definition_problem(Task::syntax_tree(), _p_(PM_GradingUnknownProperty),
+        StandardProblems::definition_problem(Task::syntax_tree(), _p_(PM_GradingUnknownProperty),
             mdef->measurement_node,
             "that definition involves an unknown property",
             "assuming it was meant to be a definition in the form 'Definition: "
@@ -270,7 +270,7 @@ and issue a problem.
         mdef->region_threshold = Rvalues::to_encoded_notation(<<rp>>);
         if ((Kinds::Behaviour::is_quasinumerical(mdef->region_kind) == FALSE) &&
             (mdef->region_shape != MEASURE_T_EXACTLY)) {
-            Problems::Issue::definition_problem(Task::syntax_tree(), _p_(PM_GradingNonarithmeticKOV),
+            StandardProblems::definition_problem(Task::syntax_tree(), _p_(PM_GradingNonarithmeticKOV),
                 mdef->measurement_node,
                 "the property value given here has a kind which can't be "
                 "subject to numerical comparisons",
@@ -281,7 +281,7 @@ and issue a problem.
         }
         if (Kinds::Compare::compatible(mdef->region_kind,
             Properties::Valued::kind(mdef->prop)) != ALWAYS_MATCH) {
-            Problems::Issue::definition_problem(Task::syntax_tree(), _p_(PM_GradingWrongKOV),
+            StandardProblems::definition_problem(Task::syntax_tree(), _p_(PM_GradingWrongKOV),
                 mdef->measurement_node,
                 "the property value given here is the wrong kind",
                 "and does not match the property being looked at.");
@@ -290,7 +290,7 @@ and issue a problem.
         }
     } else {
         LOG("Can't get literal from <%W>\n", mdef->region_threshold_text);
-        Problems::Issue::definition_problem(Task::syntax_tree(), _p_(PM_GradingNonLiteral),
+        StandardProblems::definition_problem(Task::syntax_tree(), _p_(PM_GradingNonLiteral),
             mdef->measurement_node,
             "that definition is wrongly phrased",
             "assuming it was meant to be a grading adjective like 'Definition: a "
@@ -346,7 +346,7 @@ always to match <property-name>, and the text in the range must match
 

-    Problems::Issue::definition_problem(Task::syntax_tree(), _p_(PM_GradingMisphrased),
+    StandardProblems::definition_problem(Task::syntax_tree(), _p_(PM_GradingMisphrased),
         NounPhrases::new_raw(W),
         "that definition is wrongly phrased",
         "assuming it was meant to be a grading adjective like 'Definition: a "
@@ -383,7 +383,7 @@ always to match <property-name>, and the text in the range must match
 
     if (Wordings::length(AW) > 1) {
         if (shape != MEASURE_T_EXACTLY)
-            Problems::Issue::definition_problem(Task::syntax_tree(), _p_(PM_MultiwordGrading),
+            StandardProblems::definition_problem(Task::syntax_tree(), _p_(PM_MultiwordGrading),
                 q, "a grading adjective must be a single word",
                 "as in 'Definition: a container is large if its carrying capacity is "
                 "10 or more.': 'fairly large' would not be allowed because it would "
@@ -393,7 +393,7 @@ always to match <property-name>, and the text in the range must match
 
     if (Wordings::nonempty(CALLW)) {
         if (shape != MEASURE_T_EXACTLY)
-            Problems::Issue::definition_problem(Task::syntax_tree(), _p_(PM_GradingCalled),
+            StandardProblems::definition_problem(Task::syntax_tree(), _p_(PM_GradingCalled),
                 q, "callings are not allowed when defining grading adjectives",
                 "so 'Definition: a container is large if its carrying capacity is 10 "
                 "or more.' is fine, but so 'Definition: a container (called the bag) "
@@ -404,7 +404,7 @@ always to match <property-name>, and the text in the range must match
 
     if (sense != 1) {
         if (shape != MEASURE_T_EXACTLY)
-            Problems::Issue::definition_problem(Task::syntax_tree(), _p_(PM_GradingUnless),
+            StandardProblems::definition_problem(Task::syntax_tree(), _p_(PM_GradingUnless),
                 q, "'unless' is not allowed when defining grading adjectives",
                 "so 'Definition: a container is large if its carrying capacity is 10 "
                 "or more.' is fine, but so 'Definition: a container is modest unless "
diff --git a/docs/core-module/15-pov.html b/docs/core-module/15-pov.html
index 8a89119c0..0feb6f1bc 100644
--- a/docs/core-module/15-pov.html
+++ b/docs/core-module/15-pov.html
@@ -159,7 +159,7 @@ and it seems best to reject the extra complexity needed.
         Problems::quote_source(1, current_sentence);
         Problems::quote_property(2, prn);
         Problems::quote_kind(3, K);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_AnomalousProperty));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_AnomalousProperty));
         Problems::issue_problem_segment(
             "Sorry, but I'm going to have to disallow the sentence %1, even "
             "though it asks for something reasonable. A very small number "
diff --git a/docs/core-module/15-pr.html b/docs/core-module/15-pr.html
index b6b7941c0..8d2cbf718 100644
--- a/docs/core-module/15-pr.html
+++ b/docs/core-module/15-pr.html
@@ -207,7 +207,7 @@ either/or property where a valued property is wanted, or vice versa.
     int unfortunate = FALSE;
     if ((<k-kind>(W)) && (<<rp>> == K_value)) {
         unfortunate = TRUE;
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
             "the single word 'value' cannot be used as the name of a property",
             "because it has a much broader meaning already. Inform uses the "
             "word 'value' to mean any number, time of day, name of something, "
@@ -217,7 +217,7 @@ either/or property where a valued property is wanted, or vice versa.
             "room number' would be fine.");
     }
     if (Wordings::length(W) > MAX_WORDS_IN_ASSEMBLAGE-2) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PropertyNameTooLong),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PropertyNameTooLong),
             "this is too long a name for a single property to have",
             "and would become unwieldy.");
         W = Wordings::truncate(W, MAX_WORDS_IN_ASSEMBLAGE-2);
@@ -226,7 +226,7 @@ either/or property where a valued property is wanted, or vice versa.
         unfortunate = TRUE;
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, W);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyNameUnsuitable));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyNameUnsuitable));
         Problems::issue_problem_segment(
             "The sentence %1 seems to create a new property called '%2', but "
             "this is not a good name, and I think I must have misread what "
@@ -258,7 +258,7 @@ something.
             Problems::quote_source(1, current_sentence);
             Problems::quote_wording(2, W);
             Problems::quote_kind_of(3, spec);
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyNameClash));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyNameClash));
             Problems::issue_problem_segment(
                 "You wrote %1, but '%2' is not free to be the name of a fresh "
                 "property: it already has a meaning (as %3).");
@@ -676,14 +676,14 @@ to sentences like:
 
 
     if (prn == NULL)  {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NonPropertyTranslated),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NonPropertyTranslated),
             "this property does not exist",
             "so cannot be translated.");
         return;
     }
     if ((prn->translated) &&
         (Str::eq_wide_string(Produce::get_translation(Properties::iname(prn)), text) == FALSE)) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TranslatedTwice),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TranslatedTwice),
             "this property has already been translated",
             "so there must be some duplication somewhere.");
         return;
diff --git a/docs/core-module/15-spr2.html b/docs/core-module/15-spr2.html
index a31ae08df..55b406c35 100644
--- a/docs/core-module/15-spr2.html
+++ b/docs/core-module/15-spr2.html
@@ -167,7 +167,7 @@ that the two can never fall out of step.
 
 
     *X = FALSE;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RelationWithEitherOrProperty),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RelationWithEitherOrProperty),
         "verbs can only set properties with values",
         "not either/or properties like this one.");
 
@@ -177,7 +177,7 @@ that the two can never fall out of step.
     *X = FALSE;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RelationWithBadProperty),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RelationWithBadProperty),
         "that doesn't seem to be a property",
         "perhaps because you haven't defined it yet?");
 
@@ -282,17 +282,17 @@ be caught later on Inform's run. Problems::quote_kind(4, kinds_of_terms[1]); Problems::quote_kind(5, val_kind); if (Kinds::get_construct(kinds_of_terms[1]) == CON_property) - Problems::Issue::tcp_problem(_p_(PM_PropertiesEquated), tck, + StandardProblems::tcp_problem(_p_(PM_PropertiesEquated), tck, "that seems to say that two different properties are the same - " "like saying 'The indefinite article is the printed name': that " "might be true for some things, some of the time, but it makes no " "sense in a general statement like this one."); else if (prn == NULL) - Problems::Issue::tcp_problem(_p_(PM_UnknownPropertyType), tck, + StandardProblems::tcp_problem(_p_(PM_UnknownPropertyType), tck, "that tries to set the value of an unknown property to %4."); else { Problems::quote_property(6, prn); - Problems::Issue::tcp_problem(_p_(PM_PropertyType), tck, + StandardProblems::tcp_problem(_p_(PM_PropertyType), tck, "that tries to set the value of the '%6' property to %4 - which " "must be wrong because this property has to be %5."); } @@ -308,7 +308,7 @@ be caught later on Inform's run. LOG("Property value for impossible domain $u\n", kinds_of_terms[0]); Problems::quote_kind(4, kinds_of_terms[0]); Problems::quote_property(5, prn); - Problems::Issue::tcp_problem(_p_(BelievedImpossible), tck, + StandardProblems::tcp_problem(_p_(BelievedImpossible), tck, "that tries to set the property '%5' for %4. Values of that kind " "are not allowed to have properties. (Some kinds of value are, " "some aren't - see the Kinds index for details. It's a matter " diff --git a/docs/core-module/15-tpr.html b/docs/core-module/15-tpr.html index cfeba2c71..257967e4a 100644 --- a/docs/core-module/15-tpr.html +++ b/docs/core-module/15-tpr.html @@ -113,7 +113,7 @@ The right term, of course, has to be a property. kind **kinds_of_terms, kind **kinds_required, tc_problem_kit *tck) { if (Kinds::get_construct(kinds_of_terms[1]) == CON_property) return ALWAYS_MATCH; Problems::quote_kind(4, kinds_of_terms[1]); - Problems::Issue::tcp_problem(_p_(PM_BadProvides), tck, + StandardProblems::tcp_problem(_p_(PM_BadProvides), tck, "that asks whether something provides something, and in Inform 'to provide' " "means that an object (or value) has a property attached - for instance, " "containers provide the property 'carrying capacity'. Here, though, we have " diff --git a/docs/core-module/15-vp.html b/docs/core-module/15-vp.html index bff340ad9..6e7828082 100644 --- a/docs/core-module/15-vp.html +++ b/docs/core-module/15-vp.html @@ -110,7 +110,7 @@ possibility by widening the kind, when this can be done.)

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadKOVForRelationProperty),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadKOVForRelationProperty),
         "that property already exists and contains a kind of value incompatible with "
         "what we need here",
         "so you will need to give it a different name.");
@@ -193,7 +193,7 @@ to the end user.
     if ((Kinds::Behaviour::definite(K) == FALSE) && (prn->do_not_compile == FALSE)) {
         Problems::quote_wording(1, prn->name);
         Problems::quote_kind(2, K);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyIndefinite));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyIndefinite));
         if (current_sentence) {
             Problems::quote_source(3, current_sentence);
             Problems::issue_problem_segment(
@@ -316,7 +316,7 @@ storage methods at run-time if we wanted.)
     current_sentence = NULL;
     if (Kinds::RunTime::compile_default_value_vh(VH, K, prn->name, "property") == FALSE) {
         Problems::quote_wording(1, prn->name);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyUninitialisable));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyUninitialisable));
         Problems::issue_problem_segment(
             "I am unable to put any value into the property '%1', because "
             "it seems to have a kind of value which has no actual values.");
diff --git a/docs/core-module/16-cmw.html b/docs/core-module/16-cmw.html
index d065be95c..285ad68e3 100644
--- a/docs/core-module/16-cmw.html
+++ b/docs/core-module/16-cmw.html
@@ -184,7 +184,7 @@ in plugins which add inconsistent properties.
         property *prn = World::Inferences::get_property(inf);
         if (Wordings::nonempty(prn->name))
             if (World::Permissions::find(infs, prn, TRUE) == NULL)
-                Problems::Issue::inference_problem(_p_(PM_PropertyNotPermitted),
+                StandardProblems::inference_problem(_p_(PM_PropertyNotPermitted),
                     infs, inf, "is not allowed to exist",
                     "because you haven't said it is. What properties something can "
                     "have depends on what kind of thing it is: see the Index for "
@@ -279,7 +279,7 @@ about the Portal, to stand.
 
     LOG("Checking infs $j compatible with infs $j for property $Y:\n  $I\n  $I\n",
         infs, boss, prn, narrow, wide);
-    Problems::Issue::infs_contradiction_problem(_p_(PM_InstanceContradiction),
+    StandardProblems::infs_contradiction_problem(_p_(PM_InstanceContradiction),
         World::Inferences::where_inferred(narrow), World::Inferences::where_inferred(wide), infs,
         "therefore has to have two contradictory states of the same property at once",
         "which is impossible. When a kind's definition says that something is 'always' "
diff --git a/docs/core-module/16-in.html b/docs/core-module/16-in.html
index 3ccab83eb..4cb11c1b3 100644
--- a/docs/core-module/16-in.html
+++ b/docs/core-module/16-in.html
@@ -399,7 +399,7 @@ knowledge means that the inferences must have a certainty of likely or better.
             Problems::quote_property(2, prn);
             Problems::quote_kind(3, VK);
             Problems::quote_kind(4, PK);
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_LateInferenceProblem));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_LateInferenceProblem));
             Problems::issue_problem_segment(
                 "You wrote %1, but that tries to set the value of the '%2' "
                 "property to %3 - which must be wrong because this property "
@@ -886,7 +886,7 @@ and so clashed are impossible.)
         (Plugins::Call::explain_contradiction(list, i, d, infs))) return;
     if (i->inference_type == PROPERTY_INF) {
         if (i->inferred_property == P_variable_initial_value)
-        Problems::Issue::two_sentences_problem(_p_(PM_VariableContradiction),
+        StandardProblems::two_sentences_problem(_p_(PM_VariableContradiction),
             list->inferred_from,
             "this looks like a contradiction",
             "because the initial value of this variable seems to be being set "
@@ -902,7 +902,7 @@ and so clashed are impossible.)
                         Problems::quote_subject(4, infs);
                         Problems::quote_spec(5, i->inferred_property_value);
                         Problems::quote_spec(6, list->inferred_property_value);
-                        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RelationContradiction2));
+                        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RelationContradiction2));
                         Problems::issue_problem_segment(
                             "I'm finding a contradiction at the sentence %1, "
                             "because it means I can't set up %3. "
@@ -917,7 +917,7 @@ and so clashed are impossible.)
                         Problems::quote_subject(4, infs);
                         Problems::quote_spec(5, i->inferred_property_value);
                         Problems::quote_spec(6, list->inferred_property_value);
-                        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RelationContradiction));
+                        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RelationContradiction));
                         Problems::issue_problem_segment(
                             "I'm finding a contradiction at the sentences %1 and %2, "
                             "because between them they set up rival versions of %3. "
@@ -929,7 +929,7 @@ and so clashed are impossible.)
                     return;
                 }
             }
-            Problems::Issue::two_sentences_problem(_p_(PM_PropertyContradiction),
+            StandardProblems::two_sentences_problem(_p_(PM_PropertyContradiction),
                 list->inferred_from,
                 "this looks like a contradiction",
                 "because the same property seems to be being set in each of these sentences, "
@@ -938,14 +938,14 @@ and so clashed are impossible.)
     } else
         #ifdef IF_MODULE
         if (i->inference_type == IS_ROOM_INF) {
-        Problems::Issue::two_sentences_problem(_p_(PM_WhenIsARoomNotARoom),
+        StandardProblems::two_sentences_problem(_p_(PM_WhenIsARoomNotARoom),
             list->inferred_from,
             "this looks like a contradiction",
             "because apparently something would have to be both a room and not a "
             "room at the same time.");
     } else
         #endif
-        Problems::Issue::two_sentences_problem(_p_(PM_Contradiction),
+        StandardProblems::two_sentences_problem(_p_(PM_Contradiction),
             list->inferred_from,
             "this looks like a contradiction",
             "which might be because I have misunderstood what was meant to be the subject "
diff --git a/docs/core-module/17-rs.html b/docs/core-module/17-rs.html
index 848078ddb..6411e801e 100644
--- a/docs/core-module/17-rs.html
+++ b/docs/core-module/17-rs.html
@@ -165,7 +165,7 @@ enormous.
 

-void Strings::compile_response_launchers(void) {
+void Strings::compile_response_launchers(void) {
     response_message *resp;
     LOOP_OVER(resp, response_message) {
         if (resp->launcher_compiled == FALSE) {
@@ -393,7 +393,7 @@ track of the content of each response.
     Compile the array holding the current text of each response7.1;
     Compile the PrintResponse routine7.2;
     Compile the Response Divisions array7.3;
-    Strings::TextSubstitutions::compile_text_routines_in_response_mode();
+    Strings::TextSubstitutions::compile_text_routines_in_response_mode();
 }
 

§7.1. Note that each rule is allowed to tell us that it already has a better @@ -543,7 +543,7 @@ divided up by the extensions containing the rules which produce them.

§8.

-ph_stack_frame *Strings::frame_for_response(response_message *resp) {
+ph_stack_frame *Strings::frame_for_response(response_message *resp) {
     if (resp == NULL) return NULL;
     return resp->original_stack_frame;
 }
@@ -657,13 +657,13 @@ text needs to be printed in a particular way.
     int code = <<r>>;
     if ((rule_being_compiled == NULL) ||
         (Rules::rule_is_named(rule_being_compiled) == FALSE)) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ResponseContextWrong),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ResponseContextWrong),
             "lettered responses can only be used in named rules",
             "not in any of the other contexts in which quoted text can appear.");
         return;
     }
     if (Rules::rule_defines_response(rule_being_compiled, code)) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ResponseDuplicated),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ResponseDuplicated),
             "this duplicates a response letter",
             "which is not allowed: if a bracketed letter like (A) is used to mark "
             "some text as a response, then it can only occur once in its rule.");
diff --git a/docs/core-module/17-tl.html b/docs/core-module/17-tl.html
index d928816d6..9e33da690 100644
--- a/docs/core-module/17-tl.html
+++ b/docs/core-module/17-tl.html
@@ -346,7 +346,7 @@ different for compilation purposes.
     literal_text *lt = Strings::TextLiterals::compile_literal(VH, TRUE, W);
     if (lt) lt->as_boxed_quotation = TRUE;
     else
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_EmptyQuotationBox),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_EmptyQuotationBox),
             "a boxed quotation can't be empty",
             "though I suppose you could make it consist of just a few spaces "
             "to get a similar effect if you really needed to.");
diff --git a/docs/core-module/17-ts.html b/docs/core-module/17-ts.html
index 6c9c9c442..d76967522 100644
--- a/docs/core-module/17-ts.html
+++ b/docs/core-module/17-ts.html
@@ -270,9 +270,23 @@ since it often confuses newcomers:
 
 
 text_substitution *current_ts_being_compiled = NULL;
+int it_is_not_worth_adding = FALSE;  To suppress the "It may be worth adding..."
 
+void Strings::TextSubstitutions::it_is_worth_adding(void) {
+    it_is_not_worth_adding = FALSE;
+}
+void Strings::TextSubstitutions::it_is_not_worth_adding(void) {
+    it_is_not_worth_adding = TRUE;
+}
+
+

§10.

+ +
define ENDING_MESSAGE_PROBLEMS_CALLBACK Strings::TextSubstitutions::append_text_substitution_proviso
+
+
 void Strings::TextSubstitutions::append_text_substitution_proviso(void) {
     if (it_is_not_worth_adding) return;
+    if (compiling_text_routines_mode == FALSE) return;
     if ((current_ts_being_compiled) &&
         (current_ts_being_compiled->local_names_existed_at_usage_time)) {
         Frames::log(Frames::current_stack_frame());
@@ -289,7 +303,7 @@ since it often confuses newcomers:
     }
 }
 
-

§10. So much for the cues. As with text literals in the previous section, it's +

§11. So much for the cues. As with text literals in the previous section, it's now time to redeem our promises and compile the TS_X routines. These routines can't be produced all at once, and are sometimes not needed at all: the responses mechanism makes this quite fiddly, and so do the existence of @@ -306,7 +320,7 @@ yet done, returning the number we compile.

 text_substitution *latest_ts_compiled = NULL;
-int Strings::TextSubstitutions::compilation_coroutine(int in_response_mode) {
+int Strings::TextSubstitutions::compilation_coroutine(int in_response_mode) {
     Strings::compile_response_launchers();
     int N = 0;
     compiling_text_routines_mode = TRUE;
@@ -320,7 +334,7 @@ yet done, returning the number we compile.
         if (ts->responding_to_rule) responding = TRUE;
         if ((ts->dont_need_after_all == FALSE) && (responding == in_response_mode) &&
             (ts->tr_done_already == FALSE)) {
-            Strings::TextSubstitutions::compile_single_substitution(ts);
+            Strings::TextSubstitutions::compile_single_substitution(ts);
         }
         N++;
     }
@@ -329,14 +343,14 @@ yet done, returning the number we compile.
     return N;
 }
 
-

§11. We can now forget about the coroutine management, and just compile a single +

§12. We can now forget about the coroutine management, and just compile a single text substitution. The main thing is to copy over references to local variables from the stack frame creating this text substitution to the stack frame compiling it.

-void Strings::TextSubstitutions::compile_single_substitution(text_substitution *ts) {
+void Strings::TextSubstitutions::compile_single_substitution(text_substitution *ts) {
     LOGIF(TEXT_SUBSTITUTIONS, "Compiling text routine %d %08x %W\n",
         ts->allocation_id, (int) (ts->parked_stack_frame), ts->unsubstituted_text);
 
@@ -352,7 +366,7 @@ compiling it.
     if (phsf) LocalVariables::copy(Frames::current_stack_frame(), phsf);
     LocalVariables::monitor_local_parsing(Frames::current_stack_frame());
 
-    Compile a say-phrase11.1;
+    Compile a say-phrase12.1;
 
     int makes_local_references =
         LocalVariables::local_parsed_recently(Frames::current_stack_frame());
@@ -375,12 +389,12 @@ compiling it.
     current_ts_being_compiled = NULL;
 }
 
-

§11.1. Of course, if we used Inform's standard phrase mechanism exactly, then +

§12.1. Of course, if we used Inform's standard phrase mechanism exactly, then the whole thing would be circular, because that would once again generate a request for a new text substitution to be compiled later...

-

Compile a say-phrase11.1 = +

Compile a say-phrase12.1 =

@@ -427,17 +441,17 @@ a request for a new text substitution to be compiled later...
     END_COMPILATION_MODE;
     Modules::set_current_to(cm);
 
-
  • This code is used in §11.
-

§12. See the "Responses" section for why, but we sometimes want to force +

  • This code is used in §12.
+

§13. See the "Responses" section for why, but we sometimes want to force the coroutine to go through the whole queue once, then go back to the start again — which would be very inefficient except that in this mode we aren't doing very much; most TSs will be passed quickly over.

-void Strings::TextSubstitutions::compile_text_routines_in_response_mode(void) {
+void Strings::TextSubstitutions::compile_text_routines_in_response_mode(void) {
     latest_ts_compiled = NULL;
-    Strings::TextSubstitutions::compilation_coroutine(TRUE);
+    Strings::TextSubstitutions::compilation_coroutine(TRUE);
     latest_ts_compiled = NULL;
 }
 
diff --git a/docs/core-module/18-lc.html b/docs/core-module/18-lc.html index a74f496d2..725ebcfc2 100644 --- a/docs/core-module/18-lc.html +++ b/docs/core-module/18-lc.html @@ -281,7 +281,7 @@ incomparable, and "thing" being the max of "person" and "door").
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, Node::get_text(spec));
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadConstantListEntry));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadConstantListEntry));
     Problems::issue_problem_segment(
         "The constant list %1 contains an entry '%2' which isn't any "
         "form of constant I'm able to read.");
@@ -298,7 +298,7 @@ incomparable, and "thing" being the max of "person" and "door").
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, Node::get_text(spec));
     Problems::quote_spec(3, spec);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NonconstantConstantListEntry));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NonconstantConstantListEntry));
     Problems::issue_problem_segment(
         "The constant list %1 contains an entry '%2' which does make sense, "
         "but isn't a constant (it's %3). Only constants can appear as entries in "
@@ -314,7 +314,7 @@ incomparable, and "thing" being the max of "person" and "door").
     Problems::quote_wording(2, Node::get_text(spec));
     Problems::quote_kind(3, E);
     Problems::quote_kind(4, previous_K);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_IncompatibleConstantListEntry));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_IncompatibleConstantListEntry));
     Problems::issue_problem_segment(
         "The constant list %1 contains an entry '%2' whose kind is '%3', but "
         "that's not compatible with the kind I had established from looking at "
diff --git a/docs/core-module/19-tb.html b/docs/core-module/19-tb.html
index 23da531f8..bbc5f0663 100644
--- a/docs/core-module/19-tb.html
+++ b/docs/core-module/19-tb.html
@@ -185,7 +185,7 @@ suggests is never a good idea.
             (Kinds::Compare::lt(<<rp>>, K_object))) {
             Problems::quote_table(1, t);
             Problems::quote_wording(2, t->table_name_text);
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TableCoincidesWithKind));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TableCoincidesWithKind));
             Problems::issue_problem_segment(
                 "The name %1 will have to be disallowed because '%2' is also the "
                 "name of a kind, or of the plural of a kind. (For instance, writing "
@@ -351,7 +351,7 @@ two forms in any case.
 
 
     *X = TABLE_HAS_ONLY_NAME;  for recovery
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TableMisnamed),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TableMisnamed),
         "this isn't allowed as the name of a Table",
         "since a table is required either to have a number, or to be a table 'of' "
         "something (or both). For example: 'Table 5', 'Table of Blue Meanies', and "
@@ -433,7 +433,7 @@ table and then destroy the temporary one made here.
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
         "this table does not strictly speaking start a paragraph",
         "and I'm afraid we need to speak strictly here. Even a comment coming before "
         "the start of the table is too much.");
@@ -471,7 +471,7 @@ table and then destroy the temporary one made here.
 
     if (<s-type-expression-or-value>(t->table_name_text)) {
         Problems::quote_wording_as_source(1, t->table_name_text);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TableNameAmbiguous));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TableNameAmbiguous));
         Problems::issue_problem_segment(
             "The table name %1 will have to be disallowed as it is text which "
             "already has a meaning to Inform. For instance, creating the 'Table "
@@ -532,7 +532,7 @@ number only, that must. Suppose that "Table 2 - Trees" already exists. Then:
 
     if (existing_table_with_same_name == NULL) {
         Problems::quote_table(1, t);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TableNotContinuation));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TableNotContinuation));
         Problems::issue_problem_segment(
             "It looks as if %1 is meant to be related to an existing table, "
             "but I can't find one if it is. %P"
@@ -552,7 +552,7 @@ number only, that must. Suppose that "Table 2 - Trees" already exists. Then:
         Problems::quote_table(1, t);
         Problems::quote_table(2, existing_table_with_same_name);
         Problems::quote_wording(3, HW);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TableNameDuplicate));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TableNameDuplicate));
         Problems::issue_problem_segment(
             "I can't create %1 because its name overlaps with one that already "
             "exists: %2. %P"
@@ -632,7 +632,7 @@ node for each column.
         row_count++;
     }
     if ((row_count < 2) && (t->blank_rows == 0)) {
-        Problems::Issue::table_problem(_p_(PM_TableWithoutRows),
+        StandardProblems::table_problem(_p_(PM_TableWithoutRows),
             t, NULL, PN, "%1 has no rows.");
         return;
     }
@@ -652,7 +652,7 @@ a node in the parse tree representing the column's use within this table.
         parse_node *overflow = NounPhrases::new_raw(CW);
         int limit = MAX_COLUMNS_PER_TABLE;
         Problems::quote_number(4, &limit);
-        Problems::Issue::table_problem(_p_(PM_TableTooManyColumns),
+        StandardProblems::table_problem(_p_(PM_TableTooManyColumns),
             t, NULL, overflow,
             "There are %4 columns in %1 already, and that's the absolute limit, "
             "so the column %3 can't be added.");
@@ -680,7 +680,7 @@ a node in the parse tree representing the column's use within this table.
         int given_col = col_count + 1;  i.e., counting from 1 rather than 0
         Problems::quote_number(5, &(given_col));
         Problems::quote_number(6, &(t->no_columns));
-        Problems::Issue::table_problem(_p_(PM_TableRowFull),
+        StandardProblems::table_problem(_p_(PM_TableRowFull),
             t, NULL, cell,
             "In row %4 of the table %1, the entry %3 won't fit, because its row "
             "is already full. (This entry would be in column %5 and the table has "
@@ -804,7 +804,7 @@ wants a row for each man, and the continuation wants a row for each woman.
             Problems::quote_table(2, old_t);
             Problems::quote_wording(3, old_t->blank_rows_for_each_text);
             Problems::quote_wording(4, t->blank_rows_for_each_text);
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TableContinuationContradicts));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TableContinuationContradicts));
             Problems::issue_problem_segment(
                 "The table %1 says that it should have a blank row for each "
                 "%4, but the original %2 already says it has a blank for each "
@@ -885,7 +885,7 @@ used in continuation rows for columns not mentioned.)
         Problems::quote_table(2, old_t);
         if (missing == 1) Problems::quote_text(3, "a column");
         else Problems::quote_text(3, "columns");
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TableContinuationAddsCols));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TableContinuationAddsCols));
         Problems::issue_problem_segment(
             "The table %1 won't work as a continuation, because it contains "
             "%3 not found in the original %2.");
@@ -915,7 +915,7 @@ be "wider" than the old one.)
         Problems::quote_table(2, old_t);
         if (missing == 1) Problems::quote_text(3, "a column");
         else Problems::quote_text(3, "columns");
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TableReplacementMissesCols));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TableReplacementMissesCols));
         Problems::issue_problem_segment(
             "The table %1 won't work as a replacement, because it's missing "
             "%3 found in the original %2.");
@@ -944,7 +944,7 @@ columns and in the same order.
         current_sentence = t->table_created_at->source_table;
         Problems::quote_table(1, t);
         Problems::quote_table(2, old_t);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TableAmendmentMisfit));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TableAmendmentMisfit));
         Problems::issue_problem_segment(
             "Columns in %1 do not exactly match the original %2. I can only "
             "make changes to rows in an existing table if the amended versions "
@@ -1127,7 +1127,7 @@ us issue more contextual problem messages.
     Problems::quote_wording(5,
         Nouns::nominative(table_being_examined->columns[table_cell_col].column_identity->name));
     Problems::quote_number(6, &table_cell_row);
-    Problems::Issue::table_problem(_p_(PM_NonconstantActionInTable),
+    StandardProblems::table_problem(_p_(PM_NonconstantActionInTable),
         table_being_examined, NULL, table_cell_node,
         "In %1, I'm reading the text %3 in column %4 (%5) of row %6, but this is "
         "an action involving a variable, that is, a value that might vary in play. "
@@ -1157,7 +1157,7 @@ people — it needs to be "yourself" instead, since "player" is a variable.
             Nouns::nominative(table_being_examined->columns[table_cell_col].column_identity->name));
         Problems::quote_number(6, &table_cell_row);
         Problems::quote_subject(7, infs);
-        Problems::Issue::table_problem(_p_(PM_TablePlayerEntry),
+        StandardProblems::table_problem(_p_(PM_TablePlayerEntry),
             table_being_examined, NULL, table_cell_node,
             "In %1, the entry %3 in column %4 (%5) of row %6 is the name of a value "
             "which varies, not a constant, and can't be stored as a table entry. %P"
@@ -1169,7 +1169,7 @@ people — it needs to be "yourself" instead, since "player" is a variable.
         Problems::quote_wording(5,
             Nouns::nominative(table_being_examined->columns[table_cell_col].column_identity->name));
         Problems::quote_number(6, &table_cell_row);
-        Problems::Issue::table_problem(_p_(PM_TableVariableEntry),
+        StandardProblems::table_problem(_p_(PM_TableVariableEntry),
             table_being_examined, NULL, table_cell_node,
             "In %1, the entry %3 in column %4 (%5) of row %6 is the name of a value "
             "which varies, not a constant, so it can't be stored as a table entry.");
@@ -1196,7 +1196,7 @@ people — it needs to be "yourself" instead, since "player" is a variable.
     Problems::quote_wording(5,
         Nouns::nominative(table_being_examined->columns[table_cell_col].column_identity->name));
     Problems::quote_number(6, &table_cell_row);
-    Problems::Issue::table_problem(_p_(PM_TableUnknownEntry),
+    StandardProblems::table_problem(_p_(PM_TableUnknownEntry),
         table_being_examined, NULL, table_cell_node,
         "In %1, I'm reading the text %3 in column %4 (%5) of row %6, but I don't "
         "know what this means. %PThis should usually be a value, like a number "
@@ -1275,7 +1275,7 @@ people — it needs to be "yourself" instead, since "player" is a variable.
         Problems::quote_wording(5,
             Nouns::nominative(table_being_examined->columns[table_cell_col].column_identity->name));
         Problems::quote_number(6, &table_cell_row);
-        Problems::Issue::table_problem(_p_(PM_TableDescriptionEntry),
+        StandardProblems::table_problem(_p_(PM_TableDescriptionEntry),
             t, NULL, cell,
             "In %1, the entry %3 in column %4 (%5) of row %6 is a general description "
             "of things with no definite value, and can't be stored as a table entry.");
@@ -1328,7 +1328,7 @@ people — it needs to be "yourself" instead, since "player" is a variable.
                 if (N >= 0) t->blank_rows = N;
                 else {
                     Problems::quote_wording(4, t->blank_rows_text);
-                    Problems::Issue::table_problem(_p_(PM_TableUnknownBlanks),
+                    StandardProblems::table_problem(_p_(PM_TableUnknownBlanks),
                         t, NULL, current_sentence,
                         "%1 asked to have '%4' extra blank rows, but that would "
                         "only make sense for a literal number like '15' or a "
@@ -1354,7 +1354,7 @@ people — it needs to be "yourself" instead, since "player" is a variable.
                     t->blank_rows += Instances::count(K);
                 } else {
                     Problems::quote_wording(4, t->blank_rows_for_each_text);
-                    Problems::Issue::table_problem(_p_(PM_TableKindlessBlanks),
+                    StandardProblems::table_problem(_p_(PM_TableKindlessBlanks),
                         t, NULL, current_sentence,
                         "%1 asked to have extra blank rows for each '%4', but that "
                         "isn't a kind, so I can't see how many blank rows to make.");
@@ -1576,7 +1576,7 @@ time to find a clear wording for:
         current_sentence = amendments->table_created_at->source_table;
         Problems::quote_table(1, main_table);
         Problems::quote_table(2, amendments);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TableAmendmentMismatch));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TableAmendmentMismatch));
         Problems::issue_problem_segment(
             "I'm currently trying to amend rows in %1 according to the instructions "
             "in %2. To do that, I have to match each amendment row in turn, which "
diff --git a/docs/core-module/19-tc.html b/docs/core-module/19-tc.html
index ec191f92b..aea5957c5 100644
--- a/docs/core-module/19-tc.html
+++ b/docs/core-module/19-tc.html
@@ -202,7 +202,7 @@ of entry in the column.
     Problems::quote_kind(4, K);
     Problems::quote_kind(5, K);
     Problems::quote_table(6, t);
-    Problems::Issue::table_problem(_p_(PM_TableColumnDescription),
+    StandardProblems::table_problem(_p_(PM_TableColumnDescription),
         t, tc, NULL,
         "In %1, you've written the heading of the column '%2' to say that each entry "
         "should be %4. But descriptions aren't allowed as table entries - tables "
@@ -277,7 +277,7 @@ text is passed to the following routine in turn:
     for (int i=0; i<t->no_columns; i++)
         if (t->columns[i].column_identity == tc) {
             Problems::quote_wording(4, W);
-            Problems::Issue::table_problem(_p_(PM_DuplicateColumnName),
+            StandardProblems::table_problem(_p_(PM_DuplicateColumnName),
                 t, NULL, NULL,
                 "In %1, the column name %4 cannot be used, because there's already "
                 "a column of the same name. (You can't have two columns with the "
@@ -338,7 +338,7 @@ what looks like text into grammar for parsing.
 
     *X = NEW_TC_PROBLEM;
     Problems::quote_wording(4, W);
-    Problems::Issue::table_problem(_p_(PM_TableColumnArticle),
+    StandardProblems::table_problem(_p_(PM_TableColumnArticle),
         table_being_examined, NULL, table_cell_node,
         "In %1, the column name %3 cannot be used, because there would be too "
         "much ambiguity arising from its ordinary meaning as an article. (It "
@@ -350,7 +350,7 @@ what looks like text into grammar for parsing.
 
 
     *X = NEW_TC_PROBLEM;
-    Problems::Issue::table_problem(_p_(PM_TableColumnAlready),
+    StandardProblems::table_problem(_p_(PM_TableColumnAlready),
         table_being_examined, NULL, table_cell_node,
         "In %1, the column name %3 cannot be used, because it already means "
         "something else.");
@@ -361,7 +361,7 @@ what looks like text into grammar for parsing.
 
 
     *X = NEW_TC_PROBLEM;
-    Problems::Issue::table_problem(_p_(PM_TableColumnBracketed),
+    StandardProblems::table_problem(_p_(PM_TableColumnBracketed),
         table_being_examined, NULL, table_cell_node,
         "In %1, the column name %3 cannot be used, because it is in brackets. "
         "(Perhaps you intended to use the brackets to give the kind of the "
@@ -462,7 +462,7 @@ column in turn:
     Problems::quote_kind(4, EK);
     Problems::quote_kind(5, K);
     Problems::quote_table(6, tcu->column_identity->table_from_which_kind_inferred);
-    Problems::Issue::table_problem(_p_(PM_TableColumnInconsistent),
+    StandardProblems::table_problem(_p_(PM_TableColumnInconsistent),
         t, tcu->column_identity, tcu->entries,
         "In %1, you've written the heading of the column %3 to say that each entry "
         "should be %4. But a column with the same name also appears in %6, and each "
@@ -474,7 +474,7 @@ column in turn:
 

-    Problems::Issue::table_problem(_p_(PM_TableColumnBrackets),
+    StandardProblems::table_problem(_p_(PM_TableColumnBrackets),
         t, tcu->column_identity, tcu->entries,
         "In %1, I can't use the column heading %3. Brackets are only allowed in "
         "table column names when giving the kind of value which will be stored in "
@@ -546,7 +546,7 @@ their kind is ostensibly K_un
     Problems::quote_number(4, &quoted_col);
     Problems::quote_number(5, &table_cell_row);
     Problems::quote_source(6, tcu->observed_constant_cell);
-    Problems::Issue::table_problem(_p_(PM_TableKindBelowValue),
+    StandardProblems::table_problem(_p_(PM_TableKindBelowValue),
         t, tcu->column_identity, cell,
         "In %1, column %4 (%2), the entry %3 (row %5) is the name of a kind. "
         "This isn't a specific value. You're allowed to write in the name "
@@ -566,7 +566,7 @@ their kind is ostensibly K_un
     Problems::quote_number(4, &quoted_col);
     Problems::quote_number(5, &table_cell_row);
     Problems::quote_source(6, tcu->observed_kind_cell);
-    Problems::Issue::table_problem(_p_(PM_TableKindTwice),
+    StandardProblems::table_problem(_p_(PM_TableKindTwice),
         t, tcu->column_identity, cell,
         "In %1, column %4 (%2), the entry %3 (row %5) is the name of a kind. "
         "This isn't a specific value. You're allowed to write in the name "
@@ -583,7 +583,7 @@ their kind is ostensibly K_un
     Problems::quote_number(4, &quoted_col);
     Problems::quote_number(5, &table_cell_row);
     Problems::quote_source(6, tcu->observed_kind_cell);
-    Problems::Issue::table_problem(_p_(PM_TableValueBelowKind),
+    StandardProblems::table_problem(_p_(PM_TableValueBelowKind),
         t, tcu->column_identity, cell,
         "In %1, column %4 (%2), the entry %3 (row %5) is a genuine, non-blank "
         "entry: it's a specific value. That's fine, of course - the whole "
@@ -603,7 +603,7 @@ their kind is ostensibly K_un
     int quoted_col = i + 1;  i.e., counting from 1
     Problems::quote_number(6, &quoted_col);
     Problems::quote_number(7, &table_cell_row);
-    Problems::Issue::table_problem(_p_(PM_TableIncompatibleEntry),
+    StandardProblems::table_problem(_p_(PM_TableIncompatibleEntry),
         t, tcu->column_identity, cell,
         "In %1, column %6 (%2), the entry %3 (row %7) doesn't fit what I know "
         "about '%2' - it's %4, whereas I think every entry ought to be %5.");
@@ -618,7 +618,7 @@ their kind is ostensibly K_un
     Problems::quote_wording(7, Nouns::nominative(tcu->column_identity->name));
     Problems::quote_number(8, &quoted_col);
     Problems::quote_number(9, &table_cell_row);
-    Problems::Issue::table_problem(_p_(PM_TableIncompatibleEntry2),
+    StandardProblems::table_problem(_p_(PM_TableIncompatibleEntry2),
         t, tcu->column_identity, cell,
         "In %1, column %8 (%2), the entry %3 (row %9) has the wrong kind to be in "
         "the '%2' column - it's %4, whereas I think every entry ought to be %5. %P"
@@ -640,7 +640,7 @@ happens:
     Problems::quote_wording(7, Nouns::nominative(tcu->column_identity->name));
     Problems::quote_kind(4, K);
     Problems::quote_kind(5, CK);
-    Problems::Issue::table_problem(_p_(PM_TableColumnIncompatible),
+    StandardProblems::table_problem(_p_(PM_TableColumnIncompatible),
         t, tcu->column_identity, cell,
         "In %1, the column '%2' is declared as holding %4, but when the same "
         "column appeared in table %6, the contents were said there to be %5. %P"
@@ -659,7 +659,7 @@ happens:
         i, Nouns::nominative(tcu->column_identity->name), K, tcu->entries);
     if ((Kinds::get_construct(K) == CON_list_of) &&
         (Kinds::Compare::eq(Kinds::unary_construction_material(K), K_value))) {
-        Problems::Issue::table_problem(_p_(PM_TableColumnEmptyLists),
+        StandardProblems::table_problem(_p_(PM_TableColumnEmptyLists),
             t, NULL, tcu->entries,
             "In %1, the column %3 seems to consist only of empty lists. "
             "This means that I can't tell what kind of value it should hold - "
@@ -673,10 +673,10 @@ happens:
     if (K == NULL) {
         int quoted_col = i + 1;  i.e., counting from 1
         Problems::quote_number(4, &quoted_col);
-        Problems::Issue::table_problem(_p_(PM_TableKindlessColumn),
+        StandardProblems::table_problem(_p_(PM_TableKindlessColumn),
             t, tcu->column_identity, NULL,
             "Column %4 (%2) of %1 contains no values and doesn't tell me "
-            "anything about its kind%|, "
+            "anything about its kind%S.%L, "
             "which means that I don't know how to deal with it. You should "
             "either put a value into the column somewhere, or else write "
             "the kind in as part of the heading: '%2 (a number)', say.");
diff --git a/docs/core-module/19-tod.html b/docs/core-module/19-tod.html
index 27b67c98e..95934b20c 100644
--- a/docs/core-module/19-tod.html
+++ b/docs/core-module/19-tod.html
@@ -126,7 +126,7 @@ name, meaning as yet unknown).
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TableDefiningTheImpossible),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TableDefiningTheImpossible),
         "you can only use 'defined by' to set up values and things",
         "as created with sentences like 'The tree species are defined by Table 1.' "
         "or 'Some men are defined by the Table of Eligible Bachelors.'");
@@ -155,7 +155,7 @@ name, meaning as yet unknown).
 
 
     *X = FALSE;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TableUndefined),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TableUndefined),
     "you can only use 'defined by' in terms of a table",
     "which lists the value names in the first column.");
 
@@ -273,7 +273,7 @@ connection with ordinary tables. return; } if ((t) && (t->has_been_amended) && (Kinds::Compare::le(K, K_object))) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TableCantDefineAndAmend), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TableCantDefineAndAmend), "you can't use 'defined by' to define objects using a table " "which is amended by another table", "since that could too easily lead to ambiguities about what " @@ -288,7 +288,7 @@ connection with ordinary tables.

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TableDefiningObject),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TableDefiningObject),
         "you can only use 'defined by' to set up values and things",
         "as created with sentences like 'The tree species are defined by Table 1.' "
         "or 'Some men are defined by the Table of Eligible Bachelors.' - trying to "
@@ -304,7 +304,7 @@ connection with ordinary tables.
         LOG("K is $u\n", K);
         Problems::quote_source(1, current_sentence);
         Problems::quote_kind(2, K);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TableOfBuiltInKind));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TableOfBuiltInKind));
         Problems::issue_problem_segment(
             "You wrote %1, but this would mean making each of the names in "
             "the first column %2 that's new. This is a kind which can't have "
@@ -316,7 +316,7 @@ connection with ordinary tables.
         (Kinds::Behaviour::is_uncertainly_defined(K) == FALSE)) {
         Problems::quote_source(1, current_sentence);
         Problems::quote_kind(2, K);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TableOfExistingKind));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TableOfExistingKind));
         Problems::issue_problem_segment(
             "You wrote %1, but this would mean making each of the names in "
             "the first column %2 that's new. That looks reasonable, since this is a "
@@ -335,7 +335,7 @@ connection with ordinary tables.
 
     if (Calculus::Propositions::contains_quantifier(
         Specifications::to_proposition(what))) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TableOfQuantifiedKind),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TableOfQuantifiedKind),
             "you can't use 'defined by' a table while also talking about the "
             "number of things to be defined",
             "since that could too easily lead to contradictions. (So 'Six doors are "
@@ -395,9 +395,9 @@ have occurred, but if it does then the creation has worked.
 
         Assertions::Creator::tabular_definitions(t);
         NounPhrases::annotate_by_articles(name_entry);
-        Problems::Buffer::redirect_problem_sentence(current_sentence, name_entry, pn->next);
+        ProblemBuffer::redirect_problem_sentence(current_sentence, name_entry, pn->next);
         Assertions::Copular::make_assertion(name_entry, pn->next);
-        Problems::Buffer::redirect_problem_sentence(NULL, NULL, NULL);
+        ProblemBuffer::redirect_problem_sentence(NULL, NULL, NULL);
         Node::set_text(name_entry, NW);
         evaluation = NULL;
         if (<k-kind>(NW))
@@ -423,7 +423,7 @@ lots of rows, so we issue the problem just once.
 
     if (blank_objections == 0) {
         Problems::quote_number(4, &row_count);
-        Problems::Issue::table_problem(_p_(PM_TableWithBlankNames),
+        StandardProblems::table_problem(_p_(PM_TableWithBlankNames),
             t, NULL, name_entry,
             "%1 is being used to create values, so that the first column needs "
             "to contain names for these new things. It's not allowed to contain "
@@ -443,7 +443,7 @@ of the contents.)
 
 
     Problems::quote_number(4, &row_count);
-    Problems::Issue::table_problem(_p_(PM_TableEntryGeneric),
+    StandardProblems::table_problem(_p_(PM_TableEntryGeneric),
         t, NULL, name_entry,
         "In row %4 of %1, the entry %3 is the name of a kind of value, "
         "so it can't be the name of a new object.");
@@ -460,7 +460,7 @@ of the contents.)
     Problems::quote_kind_of(3, evaluation);
     Problems::quote_kind(4, K);
     Problems::quote_number(5, &row_count);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TableCreatedClash));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TableCreatedClash));
     Problems::issue_problem_segment(
         "You wrote %1, and row %5 of the first column of that table is %2, which "
         "I ought to create as a new value of %4. But I can't do that: it already "
@@ -476,7 +476,7 @@ of the contents.)
     LOG("Eval is $P\n", evaluation);
     Problems::quote_source(4, name_entry);
     Problems::quote_number(5, &row_count);
-    Problems::Issue::table_problem(_p_(PM_TableDefiningNothing),
+    StandardProblems::table_problem(_p_(PM_TableDefiningNothing),
         t, NULL, name_entry,
         "In row %5 of %1, the entry %4 seems not to have defined "
         "a thing there, so perhaps the first column did not consist "
@@ -554,7 +554,7 @@ some misleading names we don't want to allow for these properties.
 
     *X = NEW_TC_PROBLEM;
     Problems::quote_wording(3, W);
-    Problems::Issue::table_problem(_p_(PM_TableColumnLocation),
+    StandardProblems::table_problem(_p_(PM_TableColumnLocation),
         table_being_examined, NULL, table_cell_node,
         "In %1, the column name %3 cannot be used, because there would be too "
         "much ambiguity arising from its ordinary meaning referring to the "
@@ -595,10 +595,10 @@ assertion handler, simulating sentences like "The P of X is Y".
         name_entry && data_entry;
         name_entry = name_entry->next,
             data_entry = data_entry->next) {
-        Problems::Buffer::redirect_problem_sentence(current_sentence, name_entry, data_entry);
+        ProblemBuffer::redirect_problem_sentence(current_sentence, name_entry, data_entry);
         Make an assertion that this name has that property6.4.3.1;
     }
-    Problems::Buffer::redirect_problem_sentence(current_sentence, NULL, NULL);
+    ProblemBuffer::redirect_problem_sentence(current_sentence, NULL, NULL);
 
  • This code is used in §6.4.

§6.4.3.1. Note that a blank means "don't assert this property", it doesn't mean diff --git a/docs/core-module/2-pwst.html b/docs/core-module/2-pwst.html index fc92927a1..a218a8198 100644 --- a/docs/core-module/2-pwst.html +++ b/docs/core-module/2-pwst.html @@ -78,7 +78,7 @@ group. switch (CE->error_category) { case OPEN_FAILED_CE: Problems::quote_stream(1, Filenames::get_leafname(CE->details_file)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(Untestable)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(Untestable)); Problems::issue_problem_segment( "I can't open the file '%1' of source text. %P" "If you are using the 'Source' subfolder of Materials to " @@ -89,7 +89,7 @@ group. case EXT_MISWORDED_CE: Problems::quote_work(1, CE->copy->found_by->work); Problems::quote_stream(2, CE->details); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ExtMiswordedBeginsHere)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ExtMiswordedBeginsHere)); Problems::issue_problem_segment( "The extension %1, which your source text makes use of, seems to be " "damaged or incorrect: its identifying opening line is wrong. " @@ -99,7 +99,7 @@ group. case KIT_MISWORDED_CE: Problems::quote_work(1, CE->copy->found_by->work); Problems::quote_stream(2, CE->details); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(Untestable)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(Untestable)); Problems::issue_problem_segment( "The kit %1, which your source text makes use of, seems to be " "damaged or incorrect: its identifying opening line is wrong. " @@ -112,7 +112,7 @@ group. Problems::quote_work(1, CE->copy->found_by->work); Problems::quote_number(2, &max); Problems::quote_number(3, &overage); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ExtTitleTooLong)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ExtTitleTooLong)); Problems::issue_problem_segment( "The extension %1, which your source text makes use of, has a " "title which is too long, exceeding the maximum allowed " @@ -126,7 +126,7 @@ group. Problems::quote_work(1, CE->copy->found_by->work); Problems::quote_number(2, &max); Problems::quote_number(3, &overage); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ExtAuthorTooLong)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ExtAuthorTooLong)); Problems::issue_problem_segment( "The extension %1, which your source text makes use of, has an " "author name which is too long, exceeding the maximum allowed " @@ -137,14 +137,14 @@ group. case LEXER_CE: switch (CE->error_subcategory) { case STRING_TOO_LONG_LEXERERROR: - Problems::Issue::lexical_problem(Task::syntax_tree(), _p_(PM_TooMuchQuotedText), + StandardProblems::lexical_problem(Task::syntax_tree(), _p_(PM_TooMuchQuotedText), "Too much text in quotation marks", CE->details_word, "...\" The maximum length is very high, so this is more " "likely to be because a close quotation mark was " "forgotten."); break; case WORD_TOO_LONG_LEXERERROR: - Problems::Issue::lexical_problem(Task::syntax_tree(), _p_(PM_WordTooLong), + StandardProblems::lexical_problem(Task::syntax_tree(), _p_(PM_WordTooLong), "Word too long", CE->details_word, "(Individual words of unquoted text can run up to " "128 letters long, which ought to be plenty. The longest " @@ -159,7 +159,7 @@ group. "words are fine.)"); break; case I6_TOO_LONG_LEXERERROR: - Problems::Issue::lexical_problem(Task::syntax_tree(), _p_(Untestable), well, not at all conveniently + StandardProblems::lexical_problem(Task::syntax_tree(), _p_(Untestable), well, not at all conveniently "Verbatim Inform 6 extract too long", CE->details_word, "... -). The maximum length is quite high, so this " "may be because a '-)' was forgotten. Still, if " @@ -167,7 +167,7 @@ group. "using several verbatim inclusions in a row."); break; case STRING_NEVER_ENDS_LEXERERROR: - Problems::Issue::lexical_problem_S(Task::syntax_tree(), _p_(PM_UnendingQuote), + StandardProblems::lexical_problem_S(Task::syntax_tree(), _p_(PM_UnendingQuote), "Some source text ended in the middle of quoted text", CE->details, "This probably means that a quotation mark is missing " @@ -179,7 +179,7 @@ group. "me to lose track.)"); break; case COMMENT_NEVER_ENDS_LEXERERROR: - Problems::Issue::lexical_problem_S(Task::syntax_tree(), _p_(PM_UnendingComment), + StandardProblems::lexical_problem_S(Task::syntax_tree(), _p_(PM_UnendingComment), "Some source text ended in the middle of a comment", CE->details, "This probably means that a ']' is missing somewhere. " @@ -193,7 +193,7 @@ group. "the comment."); break; case I6_NEVER_ENDS_LEXERERROR: - Problems::Issue::lexical_problem_S(Task::syntax_tree(), _p_(PM_UnendingI6), + StandardProblems::lexical_problem_S(Task::syntax_tree(), _p_(PM_UnendingI6), "Some source text ended in the middle of a verbatim passage " "of Inform 6 code", CE->details, @@ -207,7 +207,7 @@ group. switch (CE->error_subcategory) { case UnexpectedSemicolon_SYNERROR: Problems::quote_source(1, NounPhrases::new_raw(CE->details_W)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_UnexpectedSemicolon)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_UnexpectedSemicolon)); Problems::issue_problem_segment( "The text %1 is followed by a semicolon ';', which only makes " "sense to me inside a rule or phrase (where there's a heading, " @@ -217,7 +217,7 @@ group. break; case ParaEndsInColon_SYNERROR: Problems::quote_source(1, NounPhrases::new_raw(CE->details_W)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ParaEndsInColon)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ParaEndsInColon)); Problems::issue_problem_segment( "The text %1 seems to end a paragraph with a colon. (Rule declarations " "can end a sentence with a colon, so maybe there's accidentally a " @@ -226,7 +226,7 @@ group. break; case SentenceEndsInColon_SYNERROR: Problems::quote_source(1, NounPhrases::new_raw(CE->details_W)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_SentenceEndsInColon)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_SentenceEndsInColon)); Problems::issue_problem_segment( "The text %1 seems to have a colon followed by a full stop, which is " "punctuation I don't understand."); @@ -234,7 +234,7 @@ group. break; case SentenceEndsInSemicolon_SYNERROR: Problems::quote_source(1, NounPhrases::new_raw(CE->details_W)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_SentenceEndsInSemicolon)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_SentenceEndsInSemicolon)); Problems::issue_problem_segment( "The text %1 seems to have a semicolon followed by a full stop, which is " "punctuation I don't understand."); @@ -242,7 +242,7 @@ group. break; case SemicolonAfterColon_SYNERROR: Problems::quote_source(1, NounPhrases::new_raw(CE->details_W)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_SemicolonAfterColon)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_SemicolonAfterColon)); Problems::issue_problem_segment( "The text %1 seems to have a semicolon following a colon, which is " "punctuation I don't understand."); @@ -250,7 +250,7 @@ group. break; case SemicolonAfterStop_SYNERROR: Problems::quote_source(1, NounPhrases::new_raw(CE->details_W)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_SemicolonAfterStop)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_SemicolonAfterStop)); Problems::issue_problem_segment( "The text %1 seems to have a semicolon following a full stop, which is " "punctuation I don't understand."); @@ -260,7 +260,7 @@ group. Problems::quote_source(1, NounPhrases::new_raw(CE->details_W)); Problems::quote_source(2, NounPhrases::new_raw(Wordings::up_to(CE->details_W, CE->details_N-1))); Problems::quote_source(3, NounPhrases::new_raw(Wordings::from(CE->details_W, CE->details_N))); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_HeadingOverLine)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_HeadingOverLine)); Problems::issue_problem_segment( "The text %1 seems to be a heading, but contains a " "line break, which is not allowed: so I am reading it " @@ -274,7 +274,7 @@ group. Problems::quote_source(1, NounPhrases::new_raw(CE->details_W)); Problems::quote_source(2, NounPhrases::new_raw(Wordings::new(Wordings::last_wn(CE->details_W)+1, CE->details_N-1))); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_HeadingStopsBeforeEndOfLine)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_HeadingStopsBeforeEndOfLine)); Problems::issue_problem_segment( "The text %1 seems to be a heading, but does not occupy " "the whole of its line of source text, which continues %2. " @@ -289,49 +289,49 @@ group. break; case ExtNoBeginsHere_SYNERROR: - Problems::Issue::extension_problem(_p_(PM_ExtNoBeginsHere), + StandardProblems::extension_problem(_p_(PM_ExtNoBeginsHere), ExtensionManager::from_copy(C), "has no 'begins here' sentence"); break; case ExtNoEndsHere_SYNERROR: - Problems::Issue::extension_problem(_p_(PM_ExtNoEndsHere), + StandardProblems::extension_problem(_p_(PM_ExtNoEndsHere), ExtensionManager::from_copy(C), "has no 'ends here' sentence"); break; case ExtSpuriouslyContinues_SYNERROR: - Problems::Issue::extension_problem(_p_(PM_ExtSpuriouslyContinues), + StandardProblems::extension_problem(_p_(PM_ExtSpuriouslyContinues), ExtensionManager::from_copy(C), "continues after the 'ends here' sentence"); break; case ExtMultipleEndsHere_SYNERROR: - Problems::Issue::extension_problem(_p_(PM_ExtMultipleEndsHere), + StandardProblems::extension_problem(_p_(PM_ExtMultipleEndsHere), ExtensionManager::from_copy(C), "has more than one 'ends here' sentence"); break; case ExtMultipleBeginsHere_SYNERROR: - Problems::Issue::extension_problem(_p_(PM_ExtMultipleBeginsHere), + StandardProblems::extension_problem(_p_(PM_ExtMultipleBeginsHere), ExtensionManager::from_copy(C), "has more than one 'begins here' sentence"); break; case ExtBeginsAfterEndsHere_SYNERROR: - Problems::Issue::extension_problem(_p_(PM_ExtBeginsAfterEndsHere), + StandardProblems::extension_problem(_p_(PM_ExtBeginsAfterEndsHere), ExtensionManager::from_copy(C), "has a further 'begins here' after an 'ends here'"); break; case ExtEndsWithoutBegins_SYNERROR: - Problems::Issue::extension_problem(_p_(BelievedImpossible), + StandardProblems::extension_problem(_p_(BelievedImpossible), ExtensionManager::from_copy(C), "has an 'ends here' with nothing having begun"); break; case BadTitleSentence_SYNERROR: current_sentence = CE->details_node; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadTitleSentence), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadTitleSentence), "the initial bibliographic sentence can only be a title in double-quotes", "possibly followed with 'by' and the name of the author."); break; case UnknownLanguageElement_SYNERROR: current_sentence = CE->details_node; - Problems::Issue::sentence_problem( + StandardProblems::sentence_problem( Task::syntax_tree(), _p_(PM_UnknownLanguageElement), "this heading contains a stipulation about the current " "Inform language definition which I can't understand", @@ -340,7 +340,7 @@ group. break; case UnknownVirtualMachine_SYNERROR: current_sentence = CE->details_node; - Problems::Issue::sentence_problem( + StandardProblems::sentence_problem( Task::syntax_tree(), _p_(PM_UnknownVirtualMachine), "this heading contains a stipulation about the Setting " "for story file format which I can't understand", @@ -349,7 +349,7 @@ group. break; case UseElementWithdrawn_SYNERROR: current_sentence = CE->details_node; - Problems::Issue::sentence_problem( + StandardProblems::sentence_problem( Task::syntax_tree(), _p_(PM_UseElementWithdrawn), "the ability to activate or deactivate compiler elements " "in source text has been withdrawn", @@ -357,7 +357,7 @@ group. break; case IncludeExtQuoted_SYNERROR: current_sentence = CE->details_node; - Problems::Issue::sentence_problem( + StandardProblems::sentence_problem( Task::syntax_tree(), _p_(PM_IncludeExtQuoted), "the name of an included extension should be given without double " "quotes in an Include sentence", @@ -367,7 +367,7 @@ group. case BogusExtension_SYNERROR: current_sentence = CE->details_node; Problems::quote_source(1, current_sentence); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BogusExtension)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BogusExtension)); Problems::issue_problem_segment( "I can't find the extension requested by: %1. %P" "You can get hold of extensions which people have made public at " @@ -379,7 +379,7 @@ group. current_sentence = CE->details_node; Problems::quote_source(1, current_sentence); Problems::quote_stream(2, CE->details); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ExtVersionTooLow)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ExtVersionTooLow)); Problems::issue_problem_segment( "I can't find the right version of the extension requested by %1 - " "I can only find %2. %P" @@ -390,7 +390,7 @@ group. break; case ExtVersionMalformed_SYNERROR: current_sentence = CE->details_node; - Problems::Issue::sentence_problem( + StandardProblems::sentence_problem( Task::syntax_tree(), _p_(PM_ExtVersionMalformed), "a version number must have the form N/DDDDDD", "as in the example '2/040426' for release 2 made on 26 April 2004. " @@ -401,7 +401,7 @@ group. current_sentence = CE->details_node; Problems::quote_source(1, current_sentence); Problems::quote_stream(2, CE->details); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ExtInadequateVM)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ExtInadequateVM)); Problems::issue_problem_segment( "You wrote %1: but my copy of that extension stipulates that it " "is '%2'. That means it can only be used with certain of " @@ -414,7 +414,7 @@ group. current_sentence = CE->details_node; Problems::quote_extension(1, ExtensionManager::from_copy(C)); Problems::quote_wording(2, CE->details_W); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ExtMisidentifiedEnds)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ExtMisidentifiedEnds)); Problems::issue_problem_segment( "The extension %1, which your source text makes use of, seems to be " "malformed: its 'begins here' sentence correctly identifies it, but " @@ -428,7 +428,7 @@ group. current_sentence = CE->details_node; Problems::quote_source(1, current_sentence); Problems::quote_extension_id(2, CE->details_work); - Problems::Issue::handmade_problem( + StandardProblems::handmade_problem( Task::syntax_tree(), _p_(PM_HeadingInPlaceOfUnincluded)); Problems::issue_problem_segment( "In the sentence %1, it looks as if you intend to replace a section " @@ -439,7 +439,7 @@ group. break; case UnequalHeadingInPlaceOf_SYNERROR: current_sentence = CE->details_node; - Problems::Issue::sentence_problem( + StandardProblems::sentence_problem( Task::syntax_tree(), _p_(PM_UnequalHeadingInPlaceOf), "these headings are not of the same level", "so it is not possible to make the replacement. (Level here means " @@ -452,7 +452,7 @@ group. Problems::quote_extension_id(2, CE->details_work); Problems::quote_source(3, CE->details_node2); Problems::quote_extension_id(4, CE->details_work2); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_HeadingInPlaceOfSubordinate)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_HeadingInPlaceOfSubordinate)); Problems::issue_problem_segment( "In the sentence %1, it looks as if you intend to replace a section " "of source text from the extension '%2', but that doesn't really make " @@ -466,7 +466,7 @@ group. Problems::quote_extension_id(2, CE->details_work); Problems::quote_wording(3, CE->details_W); Problems::quote_stream(4, CE->details); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_HeadingInPlaceOfUnknown)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_HeadingInPlaceOfUnknown)); Problems::issue_problem_segment( "In the sentence %1, it looks as if you intend to replace a section " "of source text from the extension '%2', but that extension does " diff --git a/docs/core-module/2-si.html b/docs/core-module/2-si.html index 1dbf273f5..077cc0844 100644 --- a/docs/core-module/2-si.html +++ b/docs/core-module/2-si.html @@ -73,11 +73,11 @@ contradiction of some kind:

-void Problems::Issue::two_sentences_problem(SIGIL_ARGUMENTS, parse_node *other_sentence,
+void StandardProblems::two_sentences_problem(SIGIL_ARGUMENTS, parse_node *other_sentence,
     char *message, char *explanation) {
     ACT_ON_SIGIL
     if (current_sentence == other_sentence) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), PASS_SIGIL, message, explanation);
+        StandardProblems::sentence_problem(Task::syntax_tree(), PASS_SIGIL, message, explanation);
         return;
     }
     Problems::quote_source(1, current_sentence);
@@ -86,7 +86,7 @@ contradiction of some kind:
     Problems::quote_text(4, explanation);
     Problems::issue_problem_begin(Task::syntax_tree(), explanation);
     Problems::issue_problem_segment(
-        "You wrote %1, but in another sentence %2: %Sagain, %%%Lbut %%%3%|, %4");
+        "You wrote %1, but in another sentence %2: %Sagain, %3.%Lbut %3, %4");
     Problems::issue_problem_end();
 }
 
@@ -95,7 +95,7 @@ parse tree, and concerning an instance:

-void Problems::Issue::contradiction_problem(SIGIL_ARGUMENTS, parse_node *A, parse_node *B,
+void StandardProblems::contradiction_problem(SIGIL_ARGUMENTS, parse_node *A, parse_node *B,
         instance *I, char *message, char *explanation) {
     ACT_ON_SIGIL
     Problems::quote_source(1, A);
@@ -108,11 +108,11 @@ parse tree, and concerning an instance:
         Problems::issue_problem_segment("You wrote %1, but in another sentence %2: ");
     else
         Problems::issue_problem_segment("You wrote %1: ");
-    Problems::issue_problem_segment("%Sagain, %%%3 %4%|, %5");
+    Problems::issue_problem_segment("%Sagain, %3 %4.%L%3 %4, %5");
     Problems::issue_problem_end();
 }
 
-void Problems::Issue::infs_contradiction_problem(SIGIL_ARGUMENTS, parse_node *A, parse_node *B,
+void StandardProblems::infs_contradiction_problem(SIGIL_ARGUMENTS, parse_node *A, parse_node *B,
         inference_subject *infs, char *message, char *explanation) {
     ACT_ON_SIGIL
     Problems::quote_source(1, A);
@@ -124,7 +124,7 @@ parse tree, and concerning an instance:
     if (Wordings::eq(Node::get_text(A), Node::get_text(B)) == FALSE)
         Problems::issue_problem_segment("You wrote %1, but in another sentence %2: ");
     else Problems::issue_problem_segment("You wrote %1: ");
-    Problems::issue_problem_segment("%Sagain, %%%3 %4%|, %5");
+    Problems::issue_problem_segment("%Sagain, %3 %4.%L%3 %4, %5");
     Problems::issue_problem_end();
 }
 
@@ -134,7 +134,7 @@ table we are in, yet still only cite a small part of it —

-void Problems::Issue::table_problem(SIGIL_ARGUMENTS, table *t, table_column *tc, parse_node *data,
+void StandardProblems::table_problem(SIGIL_ARGUMENTS, table *t, table_column *tc, parse_node *data,
     char *message) {
     ACT_ON_SIGIL
     current_sentence = t->headline_fragment;
@@ -150,7 +150,7 @@ table we are in, yet still only cite a small part of it —
 

-void Problems::Issue::equation_problem(SIGIL_ARGUMENTS, equation *eqn, char *p, char *text) {
+void StandardProblems::equation_problem(SIGIL_ARGUMENTS, equation *eqn, char *p, char *text) {
     ACT_ON_SIGIL
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, eqn->equation_text);
@@ -161,7 +161,7 @@ table we are in, yet still only cite a small part of it —
     Problems::issue_problem_end();
 }
 
-void Problems::Issue::equation_problem_S(SIGIL_ARGUMENTS, equation *eqn, text_stream *p, char *text) {
+void StandardProblems::equation_problem_S(SIGIL_ARGUMENTS, equation *eqn, text_stream *p, char *text) {
     ACT_ON_SIGIL
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, eqn->equation_text);
@@ -172,7 +172,7 @@ table we are in, yet still only cite a small part of it —
     Problems::issue_problem_end();
 }
 
-void Problems::Issue::equation_symbol_problem(SIGIL_ARGUMENTS, equation *eqn, wording W, char *text) {
+void StandardProblems::equation_symbol_problem(SIGIL_ARGUMENTS, equation *eqn, wording W, char *text) {
     ACT_ON_SIGIL
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, W);
@@ -186,7 +186,7 @@ table we are in, yet still only cite a small part of it —
 

§5. Inline definition problems.

-void Problems::Issue::inline_problem(SIGIL_ARGUMENTS, phrase *ph, text_stream *definition,
+void StandardProblems::inline_problem(SIGIL_ARGUMENTS, phrase *ph, text_stream *definition,
     char *message) {
     ACT_ON_SIGIL
     Problems::quote_source(1, current_sentence);
@@ -207,7 +207,7 @@ table we are in, yet still only cite a small part of it —
 

-void Problems::Issue::tcp_problem(SIGIL_ARGUMENTS, tc_problem_kit *tck, char *prototype) {
+void StandardProblems::tcp_problem(SIGIL_ARGUMENTS, tc_problem_kit *tck, char *prototype) {
     if (tck->issue_error) {
         ACT_ON_SIGIL
         Problems::quote_source(1, current_sentence);
@@ -229,18 +229,18 @@ these problems at any particular sentence.
 

-void Problems::Issue::object_problem(SIGIL_ARGUMENTS, instance *I,
+void StandardProblems::object_problem(SIGIL_ARGUMENTS, instance *I,
         char *message, char *explanation) {
     ACT_ON_SIGIL
     Problems::quote_object(1, I);
     Problems::quote_text(2, message);
     Problems::quote_text(3, explanation);
     Problems::issue_problem_begin(Task::syntax_tree(), explanation);
-    Problems::issue_problem_segment("The %1 %2%|, %3");
+    Problems::issue_problem_segment("The %1 %2%S.%L, %3");
     Problems::issue_problem_end();
 }
 
-void Problems::Issue::object_problem_at_sentence(SIGIL_ARGUMENTS, instance *I,
+void StandardProblems::object_problem_at_sentence(SIGIL_ARGUMENTS, instance *I,
         char *message, char *explanation) {
     ACT_ON_SIGIL
     Problems::quote_source(1, current_sentence);
@@ -248,11 +248,11 @@ these problems at any particular sentence.
     Problems::quote_text(3, explanation);
     Problems::quote_object(4, I);
     Problems::issue_problem_begin(Task::syntax_tree(), explanation);
-    Problems::issue_problem_segment("You wrote %1, but the %4 %2%|, %3");
+    Problems::issue_problem_segment("You wrote %1, but the %4 %2%S.%L, %3");
     Problems::issue_problem_end();
 }
 
-void Problems::Issue::subject_problem_at_sentence(SIGIL_ARGUMENTS, inference_subject *infs,
+void StandardProblems::subject_problem_at_sentence(SIGIL_ARGUMENTS, inference_subject *infs,
         char *message, char *explanation) {
     ACT_ON_SIGIL
     Problems::quote_source(1, current_sentence);
@@ -260,7 +260,7 @@ these problems at any particular sentence.
     Problems::quote_text(3, explanation);
     Problems::quote_subject(4, infs);
     Problems::issue_problem_begin(Task::syntax_tree(), explanation);
-    Problems::issue_problem_segment("You wrote %1, but the %4 %2%|, %3");
+    Problems::issue_problem_segment("You wrote %1, but the %4 %2%S.%L, %3");
     Problems::issue_problem_end();
 }
 
@@ -271,7 +271,7 @@ we are dealing with is genuinely an object).

-void Problems::Issue::subject_creation_problem(SIGIL_ARGUMENTS, inference_subject *subj,
+void StandardProblems::subject_creation_problem(SIGIL_ARGUMENTS, inference_subject *subj,
         char *message, char *explanation) {
     ACT_ON_SIGIL
     Problems::quote_subject(1, subj);
@@ -282,12 +282,12 @@ we are dealing with is genuinely an object).
         Problems::quote_source(4, NounPhrases::new_raw(W));
         Problems::issue_problem_begin(Task::syntax_tree(), explanation);
         Problems::issue_problem_segment(
-            "I've made something called %4 but it %2%|, %3");
+            "I've made something called %4 but it %2%S.%L, %3");
         Problems::issue_problem_end();
     } else {
         Problems::issue_problem_begin(Task::syntax_tree(), explanation);
         Problems::issue_problem_segment(
-            "I've made something called '%1' but it %2%|, %3");
+            "I've made something called '%1' but it %2%S.%L, %3");
         Problems::issue_problem_end();
     }
 }
@@ -300,7 +300,7 @@ making no sense.
 

-void Problems::Issue::inference_problem(SIGIL_ARGUMENTS, inference_subject *infs, inference *inf,
+void StandardProblems::inference_problem(SIGIL_ARGUMENTS, inference_subject *infs, inference *inf,
         char *message, char *explanation) {
     ACT_ON_SIGIL
     Problems::quote_subject(1, infs);
@@ -310,7 +310,7 @@ making no sense.
     Problems::quote_property(5, World::Inferences::get_property(inf));
     Problems::issue_problem_begin(Task::syntax_tree(), explanation);
     Problems::issue_problem_segment(
-        "You wrote %2: but the property %5 for the %1 %3%|, %4");
+        "You wrote %2: but the property %5 for the %1 %3%S.%L, %4");
     Problems::issue_problem_end();
 }
 
@@ -319,13 +319,13 @@ abstract, rather than with the actual property of some specific object.

-void Problems::Issue::property_problem(SIGIL_ARGUMENTS, property *prn, char *message, char *explanation) {
+void StandardProblems::property_problem(SIGIL_ARGUMENTS, property *prn, char *message, char *explanation) {
     ACT_ON_SIGIL
     Problems::quote_property(1, prn);
     Problems::quote_text(2, message);
     Problems::quote_text(3, explanation);
     Problems::issue_problem_begin(Task::syntax_tree(), explanation);
-    Problems::issue_problem_segment("The %1 %2%|, %3");
+    Problems::issue_problem_segment("The %1 %2%S.%L, %3");
     Problems::issue_problem_end();
 }
 
@@ -333,7 +333,7 @@ abstract, rather than with the actual property of some specific object.

-void Problems::Issue::extension_problem(SIGIL_ARGUMENTS, inform_extension *E, char *message) {
+void StandardProblems::extension_problem(SIGIL_ARGUMENTS, inform_extension *E, char *message) {
     ACT_ON_SIGIL
     Problems::quote_extension(1, E);
     Problems::quote_text(2, message);
@@ -349,7 +349,7 @@ sometimes not.
 

-void Problems::Issue::release_problem(SIGIL_ARGUMENTS, char *message, filename *name) {
+void StandardProblems::release_problem(SIGIL_ARGUMENTS, char *message, filename *name) {
     ACT_ON_SIGIL
     Problems::quote_text(1, message);
     TEMPORARY_TEXT(fn);
@@ -362,7 +362,7 @@ sometimes not.
     DISCARD_TEXT(fn);
 }
 
-void Problems::Issue::release_problem_path(SIGIL_ARGUMENTS, char *message, pathname *path) {
+void StandardProblems::release_problem_path(SIGIL_ARGUMENTS, char *message, pathname *path) {
     ACT_ON_SIGIL
     Problems::quote_text(1, message);
     TEMPORARY_TEXT(pn);
@@ -375,7 +375,7 @@ sometimes not.
     DISCARD_TEXT(pn);
 }
 
-void Problems::Issue::release_problem_at_sentence(SIGIL_ARGUMENTS, char *message, filename *name) {
+void StandardProblems::release_problem_at_sentence(SIGIL_ARGUMENTS, char *message, filename *name) {
     ACT_ON_SIGIL
     Problems::quote_text(1, message);
     TEMPORARY_TEXT(fn);
@@ -394,7 +394,7 @@ own quaint syntax, and where there is syntax, there are error messages:
 

-void Problems::Issue::map_problem(SIGIL_ARGUMENTS, parse_node *q, char *message) {
+void StandardProblems::map_problem(SIGIL_ARGUMENTS, parse_node *q, char *message) {
     ACT_ON_SIGIL
     Problems::quote_source(1, q);
     Problems::quote_text(2, message);
@@ -403,7 +403,7 @@ own quaint syntax, and where there is syntax, there are error messages:
     Problems::issue_problem_end();
 }
 
-void Problems::Issue::map_problem_wanted_but(SIGIL_ARGUMENTS, parse_node *q, char *i_wanted_a, int vw1) {
+void StandardProblems::map_problem_wanted_but(SIGIL_ARGUMENTS, parse_node *q, char *i_wanted_a, int vw1) {
     ACT_ON_SIGIL
     Problems::quote_source(1, q);
     Problems::quote_text(2, i_wanted_a);
diff --git a/docs/core-module/2-up.html b/docs/core-module/2-up.html
index 9d9a22905..551927920 100644
--- a/docs/core-module/2-up.html
+++ b/docs/core-module/2-up.html
@@ -76,14 +76,14 @@ function togglePopup(material_id) {
 non-problem messages when everything was fine. That all happens here:
 

-
define PROBLEMS_INITIAL_REPORTER Problems::Using::start_problems_report
-define PROBLEMS_FINAL_REPORTER Problems::Using::final_report
+
define START_PROBLEM_FILE_PROBLEMS_CALLBACK Problems::Using::start_problems_report
+define INFORMATIONAL_ADDENDA_PROBLEMS_CALLBACK Problems::Using::final_report
 
-void Problems::Using::start_problems_report(filename *F) {
-    if (STREAM_OPEN_TO_FILE(problems_file, F, UTF8_ENC) == FALSE)
-        Problems::Fatal::filename_related("Can't open problem log", F);
-    HTML::header(problems_file, I"Translating the Source",
+void Problems::Using::start_problems_report(filename *F, text_stream *P) {
+    if (STREAM_OPEN_TO_FILE(P, F, UTF8_ENC) == FALSE)
+        Problems::fatal_on_file("Can't open problem log", F);
+    HTML::header(P, I"Translating the Source",
         Supervisor::file_from_installation(CSS_FOR_STANDARD_PAGES_IRES),
         Supervisor::file_from_installation(JAVASCRIPT_FOR_STANDARD_PAGES_IRES));
 }
@@ -92,12 +92,12 @@ non-problem messages when everything was fine. That all happens here:
     int total_words = 0;
 
     if (problem_count > 0) {
-        Problems::Buffer::redirect_problem_stream(problems_file);
+        ProblemBuffer::redirect_problem_stream(problems_file);
         Problems::issue_problem_begin(Task::syntax_tree(), "*");
         if (disaster_struck) Issue problem summary for an internal error2.1
         else Issue problem summary for a run with problem messages2.2;
         Problems::issue_problem_end();
-        Problems::Buffer::redirect_problem_stream(NULL);
+        ProblemBuffer::redirect_problem_stream(NULL);
     } else {
         int rooms = 0, things = 0;
         Problems::Using::html_outcome_image(problems_file, "ni_succeeded", "Succeeded");
@@ -184,7 +184,7 @@ command line — deserves the truth.
 

-    Problems::Buffer::redirect_problem_stream(problems_file);
+    ProblemBuffer::redirect_problem_stream(problems_file);
     text_stream *OUT = problems_file;
     HTML_OPEN("p");
     Problems::issue_problem_begin(Task::syntax_tree(), "**");
@@ -197,7 +197,7 @@ command line — deserves the truth.
 
     if (telemetry_recording) {
         Telemetry::ensure_telemetry_file();
-        Problems::Buffer::redirect_problem_stream(telmy);
+        ProblemBuffer::redirect_problem_stream(telmy);
         Problems::issue_problem_begin(Task::syntax_tree(), "**");
         Problems::issue_problem_segment(
             "The %5-word source text has successfully been translated "
@@ -206,7 +206,7 @@ command line — deserves the truth.
         Problems::issue_problem_end();
         WRITE_TO(telmy, "\n");
     }
-    Problems::Buffer::redirect_problem_stream(STDOUT);
+    ProblemBuffer::redirect_problem_stream(STDOUT);
     WRITE_TO(STDOUT, "\n");
     Problems::issue_problem_begin(Task::syntax_tree(), "**");
     Problems::issue_problem_segment(
@@ -215,7 +215,7 @@ command line — deserves the truth.
         "Inform 6 to complete compilation. There were %1 %2 and %3 %4.");
     Problems::issue_problem_end();
     STREAM_FLUSH(STDOUT);
-    Problems::Buffer::redirect_problem_stream(NULL);
+    ProblemBuffer::redirect_problem_stream(NULL);
 
     ProgressBar::final_state_of_progress_bar();
     text_stream *STATUS = ProgressBar::begin_outcome();
@@ -241,11 +241,11 @@ success or failure. We also use special images on special occasions.
 to issue its first problem of the run:
 

-
define FIRST_PROBLEM_CALLBACK Problems::Using::html_outcome_failed
+
define FIRST_PROBLEMS_CALLBACK Problems::Using::html_outcome_failed
 
 void Problems::Using::html_outcome_failed(OUTPUT_STREAM) {
-    if (Problems::Issue::internal_errors_have_occurred())
+    if (StandardProblems::internal_errors_have_occurred())
         Problems::Using::html_outcome_image(problems_file, "ni_failed_badly", "Failed");
     else
         Problems::Using::html_outcome_image(problems_file, "ni_failed", "Failed");
@@ -254,7 +254,7 @@ to issue its first problem of the run:
 void Problems::Using::html_outcome_image(OUTPUT_STREAM, char *image, char *verdict) {
     char *vn = "";
     int be_festive = TRUE;
-    if (Problems::Issue::internal_errors_have_occurred() == FALSE) be_festive = FALSE;
+    if (StandardProblems::internal_errors_have_occurred() == FALSE) be_festive = FALSE;
     if (be_festive) {
         switch (Time::feast()) {
             case CHRISTMAS_FEAST: vn = "_2"; break;
@@ -262,7 +262,7 @@ to issue its first problem of the run:
         }
         if (vn[0]) outcome_image_style = CENTRED_OUTCOME_IMAGE_STYLE;
     }
-    Problems::Issue::issue_problems_banner(OUT, verdict);
+    StandardProblems::issue_problems_banner(OUT, verdict);
     switch (outcome_image_style) {
         case CENTRED_OUTCOME_IMAGE_STYLE:
             HTML_OPEN("p");
@@ -296,6 +296,81 @@ to issue its first problem of the run:
     }
 }
 
+

§5. This is a more elaborate form of the standard StandardProblems::sentence_problem, +used when an assertion sentence has gone wrong. Experience from the early +builds of the Public Beta showed that many people tried syntaxes which +Inform did not recognise, and which cause Inform to misread the primary +verb of the sentence. It would then issue a Problem — because the sentence +would be peculiar — but this problem report would itself be odd, and +make little sense to the user. So we look to see if the current sentence +is an assertion with a primary verb: and if it is, we hunt through it +for alternative verbs which might have been intended, and try to produce +a message which diagnoses the problem rather better. +

+ +
+void Problems::Using::assertion_problem(parse_node_tree *T, SIGIL_ARGUMENTS,
+    char *message, char *explanation) {
+    wording RTW = EMPTY_WORDING;  "rather than" text
+    ACT_ON_SIGIL
+    if ((current_sentence == NULL) || (current_sentence->down == NULL) ||
+        (Node::get_type(current_sentence->down) != VERB_NT)) {
+        LOG("(Assertion error reverting to sentence error.)\n");
+        StandardProblems::sentence_problem(T, PASS_SIGIL, message, explanation);
+        return;
+    }
+
+    LOG("(Assertion error: looking for alternative verbs in <%W>.)\n",
+        Node::get_text(current_sentence));
+    wording AW = Wordings::trim_both_ends(Node::get_text(current_sentence));
+    LOOP_THROUGH_WORDING(i, AW)
+        if ((i != Wordings::first_wn(Node::get_text(current_sentence->down))) &&
+            (Word::unexpectedly_upper_case(i) == FALSE)) {
+            wording W = Wordings::from(Node::get_text(current_sentence), i);
+            int j = <meaningful-nonimperative-verb>(W);
+            if (j > 0) RTW = Wordings::new(i, j);
+        }
+    Problems::quote_source(1, current_sentence);
+    Problems::quote_text(2, message);
+    Problems::quote_text(3, explanation);
+    Problems::issue_problem_begin(T, explanation);
+    Problems::issue_problem_segment("You wrote %1: %Sagain, %2.%Lbut %2, %3");
+    if (Wordings::nonempty(RTW)) {
+        Problems::quote_wording(4, Node::get_text(current_sentence->down));
+        Problems::quote_wording(5, RTW);
+        Problems::issue_problem_segment(  see also PM_AmbiguousVerb
+            " %P(It may help to know that I am reading the primary verb here "
+            "as '%4', not '%5'.)");
+    }
+    Problems::Using::diagnose_further();
+    Problems::issue_problem_end();
+}
+
+void Problems::Using::diagnose_further(void) {
+    if (current_sentence == NULL) return;
+    if (Wordings::empty(Node::get_text(current_sentence))) return;
+    int sqc = 0;
+    LOOP_THROUGH_WORDING(i, Node::get_text(current_sentence))
+        sqc += Word::singly_quoted(i);
+    if (sqc >= 2)
+        Problems::issue_problem_segment(
+            " %P(I notice what look like single quotation marks in this "
+            "sentence. If you meant to write some quoted text, it needs to "
+            "be in double quotes, \"like this\" and not 'like this'.)");
+
+    control_structure_phrase *csp =
+        ControlStructures::detect(Node::get_text(current_sentence));
+    if (csp)
+        Problems::issue_problem_segment(
+            " %P(The way this sentence starts makes me think it might have been "
+            "intended as part of a rule rather than being a statement about the "
+            "the way things are at the beginning of play. For example, 'If the "
+            "player is in the Penalty Zone, say \"An alarm sounds.\" is not "
+            "allowed: it has to be put in the form of a rule showing Inform "
+            "what circumstances apply - for example 'Every turn: if the player is "
+            "in the Penalty Zone, say \"An alarm sounds.\")");
+}
+
diff --git a/docs/core-module/20-eq.html b/docs/core-module/20-eq.html index 8ae4aad00..158c48949 100644 --- a/docs/core-module/20-eq.html +++ b/docs/core-module/20-eq.html @@ -296,7 +296,7 @@ We know that this begins with the word "equation", or we wouldn't be here
     *X = 0;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_EquationMisnumbered),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_EquationMisnumbered),
         "the top line of this equation declaration seems not to be a "
         "legal equation number or name",
         "and should read something like 'Equation 6', or 'Equation - "
@@ -357,7 +357,7 @@ We know that this begins with the word "equation", or we wouldn't be here
     if (Wordings::nonempty(NA)) {
         if (<s-type-expression-or-value>(NA)) {
             Problems::quote_wording_as_source(1, NA);
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_EquationMisnamed));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_EquationMisnamed));
             Problems::issue_problem_segment(
                 "The equation name %1 will have to be disallowed as it is text "
                 "which already has a meaning to Inform. For instance, creating "
@@ -452,7 +452,7 @@ is expected to declare every symbol occurring in it.
         for (equation_symbol *ev = eqn->symbol_list; ev; ev = ev->next)
             if (ev->var_kind == NULL) {
                 if (ev->next == NULL) {
-                    Problems::Issue::equation_symbol_problem(_p_(BelievedImpossible),
+                    StandardProblems::equation_symbol_problem(_p_(BelievedImpossible),
                         eqn, eqn->where_text,
                         "each symbol in a equation has to be declared with a kind of "
                         "value or else an actual value. So '...where N = 1701.' or "
@@ -541,7 +541,7 @@ mass, too.
 
     *X = EQW_IDENTIFIES_PROBLEM;
     if (!preform_lookahead_mode)
-    Problems::Issue::equation_symbol_problem(_p_(PM_EquationSymbolNonValue),
+    StandardProblems::equation_symbol_problem(_p_(PM_EquationSymbolNonValue),
         equation_being_declared, Wordings::one_word(R[1]),
         "this has neither a kind of value nor an actual value.");
 
@@ -552,7 +552,7 @@ mass, too.
     *X = EQW_IDENTIFIES_PROBLEM;
     if (!preform_lookahead_mode)
-    Problems::Issue::equation_symbol_problem(_p_(PM_EquationSymbolEqualsKOV),
+    StandardProblems::equation_symbol_problem(_p_(PM_EquationSymbolEqualsKOV),
         equation_being_declared, Wordings::one_word(R[1]),
         "'is' should be used, not '=', for a kind of value rather "
         "than an actual value.");
@@ -564,7 +564,7 @@ mass, too.
 
     *X = -1;
     if (!preform_lookahead_mode)
-    Problems::Issue::equation_symbol_problem(_p_(PM_EquationSymbolMalformed),
+    StandardProblems::equation_symbol_problem(_p_(PM_EquationSymbolMalformed),
         equation_being_declared, W,
         "a symbol in a equation has to be a sequence of one to ten "
         "letters optionally followed by a number from 0 to 99, so "
@@ -578,7 +578,7 @@ mass, too.
 
     *X = -1;
     if (!preform_lookahead_mode)
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_EquationSymbolMisdeclared),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_EquationSymbolMisdeclared),
         "the symbols here are not declared properly",
         "and should each be declared with a kind of value or else an "
         "actual value.");
@@ -641,7 +641,7 @@ still using it in equations:
     if (X == EQW_IDENTIFIES_KIND) {
         K = XP;
         if (temp) {
-            Problems::Issue::equation_symbol_problem(_p_(PM_EquationSymbolVague), eqn, W,
+            StandardProblems::equation_symbol_problem(_p_(PM_EquationSymbolVague), eqn, W,
                 "when an equation is named for use in a 'let' "
                 "phrase, any variables listed under 'where...' have "
                 "to be given definite values, not just vaguely said "
@@ -655,7 +655,7 @@ still using it in equations:
         K = Specifications::to_kind(spec);
     }
     if ((K) && (Kinds::Behaviour::is_quasinumerical(K) == FALSE)) {
-        Problems::Issue::equation_symbol_problem(_p_(PM_EquationSymbolNonNumeric), eqn, W,
+        StandardProblems::equation_symbol_problem(_p_(PM_EquationSymbolNonNumeric), eqn, W,
             "this has a kind of value on which arithmetic cannot be done, "
             "so it can have no place in an equation.");
         return FALSE;
@@ -674,7 +674,7 @@ of the symbols:
     for (equation_symbol *ev = eqn->symbol_list; ev; ev = ev->next)
         if (Wordings::match_cs(W, ev->name)) {
             if (Kinds::Compare::eq(K, ev->var_kind) == FALSE) {
-                Problems::Issue::equation_symbol_problem(_p_(PM_EquationSymbolBadSub), eqn, W,
+                StandardProblems::equation_symbol_problem(_p_(PM_EquationSymbolBadSub), eqn, W,
                     "you're using 'where' to substitute something into this "
                     "symbol which has the wrong kind of value.");
             }
@@ -682,7 +682,7 @@ of the symbols:
             ev->var_const = spec;
             return TRUE;
         }
-    Problems::Issue::equation_symbol_problem(_p_(PM_EquationSymbolSpurious), eqn, W,
+    StandardProblems::equation_symbol_problem(_p_(PM_EquationSymbolSpurious), eqn, W,
         "when 'where' is used to supply values to plug into a "
         "named equation as part of a 'let' phrase, you can only "
         "supply values for symbols actually used in that equation. "
@@ -944,7 +944,7 @@ has to be issued, or else a pointer to the parsed tree if we succeed.
         Equation fails in the shift-reduce parser28.3;
     equation_node *result = Equations::enode_sr_result();
     if (bl != 0) {
-        Problems::Issue::equation_problem(_p_(BelievedImpossible), eqn, "",
+        StandardProblems::equation_problem(_p_(BelievedImpossible), eqn, "",
             "this seems to use brackets in a mismatched way, since there "
             "are different numbers of left and right brackets '(' and ')'.");
         return NULL;
@@ -993,7 +993,7 @@ allow implicit multiplication.)
                 Look for this symbol name28.1.1.1;
         }
     if (token == NULL) {
-        Problems::Issue::equation_problem_S(_p_(PM_EquationTokenUnrecognised), eqn, text_of_symbol,
+        StandardProblems::equation_problem_S(_p_(PM_EquationTokenUnrecognised), eqn, text_of_symbol,
             "the symbol '%3' is one that I don't recognise. It doesn't "
             "seem to be declared after the equation - for instance, "
             "by adding 'where %3 is a number'.");
@@ -1023,7 +1023,7 @@ capacity; and so is the number 0 itself.
 
 
     if ((p[i] == '0') && (Characters::isdigit(p[i+1]))) {
-        Problems::Issue::equation_problem(_p_(PM_EquationLeadingZero), eqn, "",
+        StandardProblems::equation_problem(_p_(PM_EquationLeadingZero), eqn, "",
             "a number in an equation isn't allowed to begin with a "
             "'0' digit, so an equation like 'M = 007+Q' is against the rules.");
         return NULL;
@@ -1038,7 +1038,7 @@ capacity; and so is the number 0 itself.
     parse_node *spec = NULL;
     if (<s-type-expression>(NW)) spec = <<rp>>;
     else {
-        Problems::Issue::equation_problem(_p_(BelievedImpossible), eqn, "",
+        StandardProblems::equation_problem(_p_(BelievedImpossible), eqn, "",
             "there's a literal number in that equation which doesn't make "
             "sense to me.");
         return NULL;
@@ -1092,7 +1092,7 @@ capacity; and so is the number 0 itself.
         default: {
             TEMPORARY_TEXT(symbol);
             PUT_TO(symbol, c);
-            Problems::Issue::equation_problem_S(_p_(PM_EquationOperatorUnrecognised), eqn, symbol,
+            StandardProblems::equation_problem_S(_p_(PM_EquationOperatorUnrecognised), eqn, symbol,
                 "the symbol '%3' is one that I don't recognise. I was "
                 "expecting an arithmetic sign, '+', '-', '*','/', or '^', "
                 "or else '=' or a bracket '(' or ')'.");
@@ -1127,7 +1127,7 @@ between; and in log pi
         Equation fails in the shift-reduce parser28.3;
     enode_count++;
     if (enode_count >= MAX_ENODES_IN_EXPRESSION - 2) {
-        Problems::Issue::equation_problem(_p_(PM_EquationTooComplex), eqn, "",
+        StandardProblems::equation_problem(_p_(PM_EquationTooComplex), eqn, "",
             "this is too long and complex an equation.");
         return NULL;
     }
@@ -1142,7 +1142,7 @@ a parser like this, so we'll fall back on this:
 

-    Problems::Issue::equation_problem(_p_(PM_EquationMispunctuated), eqn, "",
+    StandardProblems::equation_problem(_p_(PM_EquationMispunctuated), eqn, "",
         "this seems to be wrongly punctuated, and doesn't make sense as a "
         "mathematical formula.");
     return NULL;
@@ -1444,13 +1444,13 @@ out first: we want the top node in the tree to be the unique int Equations::eqn_typecheck(equation *eqn) {
     switch (Equations::enode_count_equals(eqn->parsed_equation)) {
         case 0:
-            Problems::Issue::equation_problem(_p_(PM_EquationDoesntEquate), eqn, "",
+            StandardProblems::equation_problem(_p_(PM_EquationDoesntEquate), eqn, "",
                 "this equation doesn't seem to contain an equals sign, and "
                 "without '=' there is no equating anything with anything.");
             return FALSE;
         case 1:
             if (Equations::enode_is_equals(eqn->parsed_equation) == FALSE) {
-                Problems::Issue::equation_problem(_p_(PM_EquationEquatesBadly), eqn, "",
+                StandardProblems::equation_problem(_p_(PM_EquationEquatesBadly), eqn, "",
                     "the equals sign '=' here seems to be buried inside the "
                     "formula, not at the surface. For instance, 'F = ma' is "
                     "fine, but 'F(m=a)' would not make sense - the '=' would "
@@ -1459,7 +1459,7 @@ out first: we want the top node in the tree to be the unique             }
             break;
         default:
-            Problems::Issue::equation_problem(_p_(PM_EquationEquatesMultiply), eqn, "",
+            StandardProblems::equation_problem(_p_(PM_EquationEquatesMultiply), eqn, "",
                 "this equation seems to contain more than one equals "
                 "sign '='.");
             return FALSE;
@@ -1556,7 +1556,7 @@ integers to reals.
     if (Kinds::Compare::eq(L, R) == FALSE) {
         result = FALSE;
         LOG("Tried to equate $u and $u\n", L, R);
-        Problems::Issue::equation_problem(_p_(PM_EquationIncomparable), eqn, "",
+        StandardProblems::equation_problem(_p_(PM_EquationIncomparable), eqn, "",
             "this equation tries to set two values equal which have "
             "different kinds from each other.");
     }
@@ -1605,7 +1605,7 @@ we're unable to see what equations \(h^n\) can appear in.
             kind *OPK = Kinds::FloatingPoint::underlying(tok->enode_operands[1]->gK_after);
             RK = Kinds::Dimensions::arithmetic_on_kinds(OPK, NULL, REALROOT_OPERATION);
             if (RK == NULL) {
-                Problems::Issue::equation_problem(_p_(PM_EquationCantRoot-G), eqn, "",
+                StandardProblems::equation_problem(_p_(PM_EquationCantRoot-G), eqn, "",
                     "the square root function 'root' can only be used on quantities "
                     "whose dimensions are themselves a square - for example, the "
                     "root of the area 100 sq m makes sense (it's 10m), but the root "
@@ -1642,7 +1642,7 @@ of dimensions; if \(n=0\) then we have a dimensionless value, and choose
         n = power->rational_n; m = power->rational_m;
         if ((m > 1) && (real == FALSE)) {
             result = FALSE;
-            Problems::Issue::equation_problem(_p_(PM_EquationCantPower2-G), eqn, "",
+            StandardProblems::equation_problem(_p_(PM_EquationCantPower2-G), eqn, "",
                 "except for the special cases of squaring and cubing, the '^' "
                 "raise-to-power symbol can only be used to power a value using "
                 "real rather than integer arithmetic.");
@@ -1650,7 +1650,7 @@ of dimensions; if \(n=0\) then we have a dimensionless value, and choose
     } else if ((Kinds::Compare::eq(Kinds::FloatingPoint::underlying(power->gK_after), K_number) == FALSE) ||
         (power->eqn_type != CONSTANT_EQN)) {
         result = FALSE;
-        Problems::Issue::equation_problem(_p_(PM_EquationDimensionPower), eqn, "",
+        StandardProblems::equation_problem(_p_(PM_EquationDimensionPower), eqn, "",
             "the '^' raise-to-power symbol can only be used to raise a value "
             "with dimensions to a specific number. So 'mv^2' is fine, but not "
             "'mv^n' or 'mv^(1+n)'. (This is because I would need to work out what "
@@ -1662,7 +1662,7 @@ of dimensions; if \(n=0\) then we have a dimensionless value, and choose
     if (n >= 1) {
         kind *K = Kinds::Dimensions::to_rational_power(F, n, m);
         if (K == NULL)  {
-            Problems::Issue::equation_problem(_p_(BelievedImpossible), eqn, "",
+            StandardProblems::equation_problem(_p_(BelievedImpossible), eqn, "",
                 "this would involve taking a fractional power of an amount whose "
                 "dimensions are not of that power form - for example, the square "
                 "root of the area 100 sq m makes sense (it's 10m), but the square "
@@ -1749,7 +1749,7 @@ section:
             Problems::quote_text(6, "taking the cube root of");
             break;
     }
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
     Problems::issue_problem_segment(
         "You wrote %1, but that equation seems to involve %6 %4, which is not "
         "good arithmetic.");
@@ -1784,7 +1784,7 @@ section:
             Problems::quote_text(6, "combining"); Problems::quote_text(7, "with");
             break;
     }
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_EquationBadArithmetic));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_EquationBadArithmetic));
     Problems::issue_problem_segment(
         "You wrote %1, but that equation seems to involve "
         "%6 %4 %7 %5, which is not good arithmetic.");
@@ -1891,7 +1891,7 @@ specified by \((w_1, w_2)\), according to the equation         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, W);
         Problems::quote_wording(3, eqn->equation_text);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_EquationBadTarget));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_EquationBadTarget));
         Problems::issue_problem_segment(
             "In %1, you asked to let %2 be given by the equation '%3', "
             "but '%2' isn't a symbol in that equation.");
@@ -1904,7 +1904,7 @@ specified by \((w_1, w_2)\), according to the equation         Problems::quote_wording(2, W);
         Problems::quote_wording(3, eqn->equation_text);
         Problems::quote_spec(4, to_solve->var_const);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_EquationConstantTarget));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_EquationConstantTarget));
         Problems::issue_problem_segment(
             "In %1, you asked to let %2 be given by the equation '%3', "
             "but '%2' isn't something which can vary freely in that equation - "
@@ -1931,7 +1931,7 @@ potentially incorrect. Re-typechecking will recalculate these.
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, W);
         Problems::quote_wording(3, eqn->equation_text);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_EquationInsoluble));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_EquationInsoluble));
         Problems::issue_problem_segment(
             "In %1, you asked to let %2 be given by the equation '%3', "
             "but I am unable to rearrange the equation in any simple way "
@@ -1989,7 +1989,7 @@ need to exist as local variables in the current stack frame.
     Problems::quote_wording(2, W);
     Problems::quote_wording(3, eqn->equation_text);
     Problems::quote_wording(4, ev->name);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_EquationSymbolMissing));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_EquationSymbolMissing));
     Problems::issue_problem_segment(
         "In %1, you asked to let %2 be given by the equation '%3', "
         "but I can't see what to use for '%4'. The usual idea is "
@@ -2032,7 +2032,7 @@ casting between quasinumerical kinds, we'll have to return to this.)
         Problems::quote_wording(4, ev->name);
         Problems::quote_kind(5, K);
         Problems::quote_kind(6, ev->var_kind);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_EquationSymbolWrongKOV));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_EquationSymbolWrongKOV));
         Problems::issue_problem_segment(
             "In %1, you asked to let %2 be given by the equation '%3', "
             "but in that equation '%4' is supposedly %6 - whereas right "
@@ -2111,7 +2111,7 @@ casting between quasinumerical kinds, we'll have to return to this.)
 void Equations::enode_compilation_error(equation *eqn, equation_node *tok) {
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, eqn->equation_text);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_HardIntegerRoot));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_HardIntegerRoot));
     Problems::issue_problem_segment(
         "In %1, you asked me to solve the equation '%2', but that would have "
         "involved taking a tricky root of a whole number. Using real numbers "
diff --git a/docs/core-module/21-ac.html b/docs/core-module/21-ac.html
index d9acd5c79..44f168524 100644
--- a/docs/core-module/21-ac.html
+++ b/docs/core-module/21-ac.html
@@ -217,7 +217,7 @@ noun for it; for example, the "announcing activity".
 
 
     *X = FALSE;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ActivityNoteUnknown),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ActivityNoteUnknown),
         "one of the notes about this activity makes no sense",
         "and should be either 'documented at SYMBOL' or 'future action'.");
 
@@ -234,7 +234,7 @@ noun for it; for example, the "announcing activity". if ((Kinds::Behaviour::definite(creation_kind) == FALSE) && (Kinds::Compare::eq(creation_kind, K_nil) == FALSE)) { LOG("I'm reading the kind as: $u\n", creation_kind); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ActivityIndefinite), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ActivityIndefinite), "this is an activity on a kind which isn't definite", "and doesn't tell me enough about what sort of value the activity " "should work on. For example, 'Divining is an activity on numbers' " @@ -252,7 +252,7 @@ noun for it; for example, the "announcing activity". if (Kinds::Compare::eq(creation_kind, K_nil)) creation_kind = K_object; } else { if (Kinds::Compare::eq(creation_kind, K_nil) == FALSE) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ActivityMisnamed), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ActivityMisnamed), "the name of this activity implies that it acts on nothing", "which doesn't fit with what you say about it. For example, " "'Painting is an activity on brushes' isn't allowed because " @@ -275,7 +275,7 @@ noun for it; for example, the "announcing activity". else spec = Specifications::new_UNKNOWN(av->name); if (!(Node::is(spec, UNKNOWN_NT)) && (!(Node::is(spec, PROPERTY_VALUE_NT)))) { LOG("%W means $P\n", av->name, spec); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadActivityName), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadActivityName), "this already has a meaning", "and so cannot be the name of a newly created activity."); } else { @@ -347,7 +347,7 @@ noun for it; for example, the "announcing activity". *X = NOT_APPLICABLE; Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ActivityVarAnd)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ActivityVarAnd)); Problems::issue_problem_segment( "You wrote %1, which I am reading as a request to make " "a new named variable for an activity - a value associated " @@ -370,7 +370,7 @@ noun for it; for example, the "announcing activity". if (Node::get_type(cnode) == PROPER_NOUN_NT) { Problems::quote_source(1, current_sentence); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ActivityVariableNameless)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ActivityVariableNameless)); Problems::issue_problem_segment( "You wrote %1, which I am reading as a request to make " "a new named variable for an activity - a value associated " @@ -396,7 +396,7 @@ noun for it; for example, the "announcing activity". } else { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(cnode->down)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ActivityVarOverspecific)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ActivityVarOverspecific)); Problems::issue_problem_segment( "You wrote %1, which I am reading as a request to make " "a new named variable for an activity - a value associated " @@ -414,7 +414,7 @@ noun for it; for example, the "announcing activity". LOG("Offending SP: $T", spec); Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(cnode->down)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ActivityVarUnknownKOV)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ActivityVarUnknownKOV)); Problems::issue_problem_segment( "You wrote %1, but '%2' is not the name of a kind of " "value which I know (such as 'number' or 'text')."); @@ -424,7 +424,7 @@ noun for it; for example, the "announcing activity". if (Kinds::Compare::eq(Specifications::to_kind(spec), K_value)) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(cnode->down)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ActivityVarValue)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ActivityVarValue)); Problems::issue_problem_segment( "You wrote %1, but saying that a variable is a 'value' " "does not give me a clear enough idea what it will hold. " diff --git a/docs/core-module/21-fao.html b/docs/core-module/21-fao.html index 07a5a1e6a..47368d577 100644 --- a/docs/core-module/21-fao.html +++ b/docs/core-module/21-fao.html @@ -190,7 +190,7 @@ can be what rulebook does if it none of its rules cause an outcome.
     if (outcomes_being_parsed->default_outcome_declared) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_DefaultOutcomeTwice),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DefaultOutcomeTwice),
             "the default outcome for this rulebook has already been declared",
             "and this is something which can only be done once.");
     } else {
@@ -203,7 +203,7 @@ can be what rulebook does if it none of its rules cause an outcome.
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadDefaultOutcome),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadDefaultOutcome),
         "the default outcome given for the rulebook isn't what I expected",
         "which would be one of 'default success', 'default failure' or "
         "'default no outcome'.");
@@ -259,7 +259,7 @@ each of these still has one of the three results noted above; which will be
 
 
     *X = UNRECOGNISED_OUTCOME;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadOutcomeClarification),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadOutcomeClarification),
         "the bracketed clarification isn't what I expected",
         "which would be one of '(success)', '(failure)' or '(no outcome)'.");
 
@@ -272,7 +272,7 @@ each of these still has one of the three results noted above; which will be int def = FALSE; if (default_rbno_flag) { if (outcomes_being_parsed->default_named_outcome) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_DefaultNamedOutcomeTwice), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DefaultNamedOutcomeTwice), "at most one of the named outcomes from a rulebook " "can be the default", "and here we seem to have two."); @@ -280,7 +280,7 @@ each of these still has one of the three results noted above; which will be } def = TRUE; if (outcomes_being_parsed->default_outcome_declared) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_DefaultOutcomeAlready), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DefaultOutcomeAlready), "the default outcome for this rulebook has already " "been declared", "and this is something which can only be done once."); @@ -298,7 +298,7 @@ each of these still has one of the three results noted above; which will be last = ro; } if (dup) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_DuplicateOutcome), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DuplicateOutcome), "this duplicates a previous assignment of the same outcome", "and to the same rulebook."); } else { @@ -583,7 +583,7 @@ can be used in a void context as a sort of return-from-rule phrase. int parametrisation = PARAMETER_FOCUS; if (Kinds::Compare::eq(parameter_kind, K_action_name)) parametrisation = ACTION_FOCUS; else if (Kinds::Behaviour::definite(parameter_kind) == FALSE) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RulebookIndefinite), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RulebookIndefinite), "this is a rulebook for values of a kind which isn't definite", "and doesn't tell me enough about what sort of value the rulebook " "should work on. For example, 'The mystery rules are a number based " diff --git a/docs/core-module/21-rb.html b/docs/core-module/21-rb.html index 8cb1da303..2062e56d2 100644 --- a/docs/core-module/21-rb.html +++ b/docs/core-module/21-rb.html @@ -251,7 +251,7 @@ generated from the PHUD elsewhere. Phrases::Usage::log(phud); Problems::quote_source(1, current_sentence); Problems::quote_wording(2, PW); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_MultipleCCR)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_MultipleCCR)); Problems::issue_problem_segment( "You wrote %1, but the situation this refers to ('%2') is " "not a single action. Rules in the form of 'check', 'carry " diff --git a/docs/core-module/21-rl.html b/docs/core-module/21-rl.html index 4b0e3681e..9bef03a90 100644 --- a/docs/core-module/21-rl.html +++ b/docs/core-module/21-rl.html @@ -275,7 +275,7 @@ slightly differently. (Not all rule names do: those for timed events do not.) if (<unsuitable-name>(W)) { if (PM_RuleWithComma_issued_at != Wordings::first_wn(W)) { PM_RuleWithComma_issued_at = Wordings::first_wn(W); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RuleWithComma), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RuleWithComma), "a rule name is not allowed to contain punctuation, or " "to consist only of an article like 'a' or 'an', or to " "contain double-quoted text", @@ -418,7 +418,7 @@ conditions have not been met. } else { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, acl->text_of_condition); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadRuleConstraint)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadRuleConstraint)); Problems::issue_problem_segment( "In %1, you placed a constraint '%2' on a rule, but this isn't " "a condition I can understand."); @@ -536,7 +536,7 @@ about the kind of the rule; and this enables us to check for incompatibilities. Problems::quote_kind(6, P2); Problems::quote_wording_as_source(7, R->kind_of_rule_set_from->primary_name); Problems::quote_wording_as_source(8, RB->primary_name); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RuleInIncompatibleRulebooks)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RuleInIncompatibleRulebooks)); Problems::issue_problem_segment( "You've asked to put the rule '%2' into the rulebook %8, " "which is based on %5 and produces %6; but it was originally " @@ -627,7 +627,7 @@ it's perfectly typesafe to ignore the basis value entirely. Problems::quote_wording(3, R->name); Problems::quote_kind(4, KR); Problems::quote_kind(5, KS); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RulesCantInterchange)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RulesCantInterchange)); Problems::issue_problem_segment( "In the sentence %1 you've asked to use the rule '%2' in " "place of '%3', but one is based on %4 whereas the other " @@ -1078,7 +1078,7 @@ rules with I6 definitions, i.e., where return R->explicitly_named; } -response_message *Rules::rule_defines_response(rule *R, int code) { +response_message *Rules::rule_defines_response(rule *R, int code) { if (R == NULL) return NULL; if (code < 0) return NULL; return R->lettered_responses[code]; @@ -1105,7 +1105,7 @@ rules with I6 definitions, i.e., where Problems::quote_stream(3, letter); if (c == 0) Problems::quote_text(4, "no lettered responses at all"); else Problems::quote_stream(4, offers); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NoSuchResponse)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NoSuchResponse)); Problems::issue_problem_segment( "You wrote %1, but the '%2' doesn't have a response " "lettered '%3'. (It has %4.)"); diff --git a/docs/core-module/21-rl2.html b/docs/core-module/21-rl2.html index 6d2ca5fd6..3ca61b6f5 100644 --- a/docs/core-module/21-rl2.html +++ b/docs/core-module/21-rl2.html @@ -246,7 +246,7 @@ phrase definitions and timed events don't open the rulebook name.

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RulebookWithAt),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RulebookWithAt),
         "this would create a rulebook whose name begins with 'at'",
         "which is forbidden since it would lead to ambiguities in "
         "the way people write rules. A rule beginning with 'At' "
@@ -260,7 +260,7 @@ phrase definitions and timed events don't open the rulebook name.
 

-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RulebookWithTo),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RulebookWithTo),
             "this would create a rulebook whose name begins with 'to'",
             "which is forbidden since it would lead to ambiguities in "
             "the way people write rules. A rule beginning with 'To' "
@@ -274,7 +274,7 @@ phrase definitions and timed events don't open the rulebook name.
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RulebookWithDefinition),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RulebookWithDefinition),
         "this would create a rulebook whose name begins with 'definition'",
         "which is forbidden since it would lead to ambiguities in "
         "the way people write rules. A rule beginning with 'Definition' "
@@ -503,7 +503,7 @@ built (for instance, scene endings).
     *X = NOT_APPLICABLE;
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, W);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RulebookVariableAnd));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RulebookVariableAnd));
     Problems::issue_problem_segment(
         "You wrote %1, which I am reading as a request to make "
         "a new named variable for a rulebook - a value associated "
@@ -519,7 +519,7 @@ built (for instance, scene endings).
 void Rulebooks::add_variable(rulebook *rb, parse_node *cnode) {
     if (Node::get_type(cnode) != PROPERTYCALLED_NT) {
         Problems::quote_source(1, current_sentence);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RulebookVarUncalled));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RulebookVarUncalled));
         Problems::issue_problem_segment(
             "You wrote %1, which I am reading as a request to make "
             "a new named variable for an rulebook - a value associated "
@@ -542,7 +542,7 @@ built (for instance, scene endings).
         (Descriptions::is_qualified(spec))) {
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, Node::get_text(cnode->down));
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RulebookVariableTooSpecific));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RulebookVariableTooSpecific));
         Problems::issue_problem_segment(
             "You wrote %1, which I am reading as a request to make "
             "a new named variable for a rulebook - a value associated "
@@ -559,7 +559,7 @@ built (for instance, scene endings).
         LOG("Offending SP: $T", spec);
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, Node::get_text(cnode->down));
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RulebookVariableBadKind));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RulebookVariableBadKind));
         Problems::issue_problem_segment(
             "You wrote %1, but '%2' is not the name of a kind of "
             "value which I know (such as 'number' or 'text').");
@@ -571,7 +571,7 @@ built (for instance, scene endings).
     if (K == NULL) {
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, Node::get_text(cnode->down));
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RulebookVariableKindless));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RulebookVariableKindless));
         Problems::issue_problem_segment(
             "You wrote %1, but I was expecting to see a kind of value there, "
             "and '%2' isn't something I recognise as a kind.");
@@ -582,7 +582,7 @@ built (for instance, scene endings).
     if (Kinds::Compare::eq(K, K_value)) {
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, Node::get_text(cnode->down));
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RulebookVariableVague));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RulebookVariableVague));
         Problems::issue_problem_segment(
             "You wrote %1, but saying that a variable is a 'value' "
             "does not give me a clear enough idea what it will hold. "
@@ -916,7 +916,7 @@ sub-section on linked lists of booked rules in the section on Rules.
 
     if (Rules::Bookings::get_rule(the_new_rule) == ref_rule) {
         if (side != INSTEAD_SIDE)
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BeforeOrAfterSelf),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BeforeOrAfterSelf),
                 "a rule can't be before or after itself",
                 "so this makes no sense to me.");
         return;
@@ -930,7 +930,7 @@ sub-section on linked lists of booked rules in the section on Rules.
         if (ph) {
             action_name *an = Phrases::Context::required_action(&(ph->runtime_context_data));
             if ((an) && (PL::Actions::is_out_of_world(an)))
-                Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_OOWinIWRulebook),
+                StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_OOWinIWRulebook),
                     "this rulebook has no effect on actions which happen out of world",
                     "so I'm not going to let you file this rule in it. ('Check', "
                     "'Carry out' and 'Report' work fine for out of world actions: "
@@ -1058,7 +1058,7 @@ parses the object noun phrase with the following:
 
 
     *X = NOT_APPLICABLE;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NonOutcomeProperty),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NonOutcomeProperty),
         "the only properties of a rulebook are its outcomes",
         "for the time being at least.");
 
diff --git a/docs/core-module/21-rps.html b/docs/core-module/21-rps.html index 7d671741b..1bd446851 100644 --- a/docs/core-module/21-rps.html +++ b/docs/core-module/21-rps.html @@ -239,7 +239,7 @@ subject and object NPs. *X = FALSE; Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NoSuchRuleExists)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NoSuchRuleExists)); Problems::issue_problem_segment( "In %1, you gave '%2' where a rule was required."); Problems::issue_problem_end(); @@ -441,7 +441,7 @@ a given rule appears in, and (within limits) where. A simple example:
     *X = BAD_RULE_PLACEMENT;
     Problems::quote_source(1, current_sentence);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_UnspecifiedRulebookPlacement));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_UnspecifiedRulebookPlacement));
     Problems::issue_problem_segment(
         "In %1, you didn't specify in which rulebook the rule was to "
         "be listed, only which existing rule it should go before or "
@@ -462,7 +462,7 @@ a given rule appears in, and (within limits) where. A simple example:
 
 
     Problems::quote_source(1, current_sentence);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ImproperRulePlacement));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ImproperRulePlacement));
     Problems::issue_problem_segment(
         "In %1, you used the special verb 'to be listed' - which specifies "
         "how rules are listed in rulebooks - in a way I didn't recognise. "
@@ -477,7 +477,7 @@ a given rule appears in, and (within limits) where. A simple example:
 
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, W);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NoSuchRulebookPlacement));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NoSuchRulebookPlacement));
     Problems::issue_problem_segment(
         "In %1, you gave '%2' where a rulebook was required.");
     Problems::issue_problem_end();
@@ -516,7 +516,7 @@ a given rule appears in, and (within limits) where. A simple example:
     if ((sense == FALSE) &&
         ((new_rule_placement != MIDDLE_PLACEMENT) || (side != IN_SIDE))) {
         Problems::quote_source(1, current_sentence);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadRulePlacementNegation));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadRulePlacementNegation));
         Problems::issue_problem_segment(
             "In %1, you used the special verb 'to be listed' - which specifies "
             "how rules are listed in rulebooks - in a way too complicated to "
@@ -552,7 +552,7 @@ a given rule appears in, and (within limits) where. A simple example:
             Problems::quote_source(1, current_sentence);
             Problems::quote_wording(2, the_rulebook->primary_name);
             Problems::quote_wording(3, relative_to_which->name);
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PlaceWithMissingRule));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PlaceWithMissingRule));
             Problems::issue_problem_segment(
                 "In %1, you talk about the position of the rule '%3' "
                 "in the rulebook '%2', but in fact that rule isn't in this "
diff --git a/docs/core-module/22-cs.html b/docs/core-module/22-cs.html
index f00130839..2b0f2a1f3 100644
--- a/docs/core-module/22-cs.html
+++ b/docs/core-module/22-cs.html
@@ -441,7 +441,7 @@ points", say). This is where we do it:
             (Phrases::TypeData::arithmetic_operation(ph) == -1)) {
             current_sentence = Phrases::declaration_node(ph);
             Problems::quote_source(1, current_sentence);
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ReturnKindVague));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ReturnKindVague));
             Problems::issue_problem_segment(
                 "The declaration %1 tries to set up a phrase which decides a "
                 "value which is too vaguely described. For example, 'To decide "
@@ -458,7 +458,7 @@ points", say). This is where we do it:
                 PUT_TO(var_letter, 'A'+k-1);
                 Problems::quote_source(1, current_sentence);
                 Problems::quote_stream(2, var_letter);
-                Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ReturnKindUndetermined));
+                StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ReturnKindUndetermined));
                 Problems::issue_problem_segment(
                     "The declaration %1 tries to set up a phrase which decides a "
                     "value which is too vaguely described, because it involves "
@@ -480,7 +480,7 @@ points", say). This is where we do it:
             (Phrases::Usage::has_name_as_constant(&(ph->usage_data)))) {
             current_sentence = Phrases::declaration_node(ph);
             Problems::quote_source(1, current_sentence);
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NamedInline));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NamedInline));
             Problems::issue_problem_segment(
                 "The declaration %1 tries to give a name to a phrase which is "
                 "defined using inline Inform 6 code in (- markers -). Such "
@@ -600,7 +600,7 @@ can be called multiple times in the course of the evening.)
         if (PL::Actions::ScopeLoops::compilation_coroutine() > 0)
             repeat = TRUE;
         #endif
-        if (Strings::TextSubstitutions::compilation_coroutine(FALSE) > 0)
+        if (Strings::TextSubstitutions::compilation_coroutine(FALSE) > 0)
             repeat = TRUE;
         if (Calculus::Propositions::Deferred::compilation_coroutine() > 0)
             repeat = TRUE;
diff --git a/docs/core-module/22-dptd.html b/docs/core-module/22-dptd.html
index c72a3782a..32feb1709 100644
--- a/docs/core-module/22-dptd.html
+++ b/docs/core-module/22-dptd.html
@@ -540,7 +540,7 @@ language altogether, but there we are; spilt milk.
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_SayWithPhraseOptions),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_SayWithPhraseOptions),
         "phrase options are not allowed for 'say' phrases",
         "because the commas would lead to ambiguous sentences, and because the "
         "content of a substitution is intended to be something conceptually simple "
@@ -632,7 +632,7 @@ messages.
         Problems::quote_source(4, Prepositions::get_where_pu_created(prep));
     Problems::quote_wording(2, W);
     Problems::quote_wording(3, Wordings::new(<<rel1>>, <<rel2>>));
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_MasksRelation));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_MasksRelation));
     Problems::issue_problem_segment(
         "I don't want you to define a phrase with the wording you've used in "
         "in %1 because it could be misunderstood. There is already a definition "
@@ -699,7 +699,7 @@ haven't yet been parsed, so that we don't yet know it will be meaningful.
     *XP = K_number;
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, W);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_UnknownValueToDecide));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_UnknownValueToDecide));
     Problems::issue_problem_segment(
         "The phrase you describe in %1 seems to be trying to decide a value, "
         "but '%2' is not a kind that I recognise. (I had expected something "
@@ -728,7 +728,7 @@ haven't yet been parsed, so that we don't yet know it will be meaningful.
     } else internal_error("to phrase without to");
     if (Kinds::Compare::eq(phtd->return_kind, K_truth_state)) {
         if (no_truth_state_returns++ > 0)
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TruthStateToDecide),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TruthStateToDecide),
             "phrases are not allowed to decide a truth state",
             "and should be defined with the form 'To decide if ...' rather than "
             "'To decide what truth state is ...'.");
@@ -873,7 +873,7 @@ the hyphen, and this is sorely needed with complicated functional kinds.
 
 
     *X = NOT_APPLICABLE;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TokenWithEmptyBrackets),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TokenWithEmptyBrackets),
         "nothing is between the opening bracket '(' and its matching close bracket ')'",
         "so I can't see what is meant to be the fixed text and what is meant to be "
         "changeable. The idea is to put brackets around whatever varies from one "
@@ -885,7 +885,7 @@ the hyphen, and this is sorely needed with complicated functional kinds.
 
 
     *X = NOT_APPLICABLE;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TokenWithoutCloseBracket),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TokenWithoutCloseBracket),
         "the opening bracket '(' has no matching close bracket ')'",
         "so I can't see what is meant to be the fixed text and what is meant to be "
         "changeable. The idea is to put brackets around whatever varies from one "
@@ -897,7 +897,7 @@ the hyphen, and this is sorely needed with complicated functional kinds.
 
 
     *X = NOT_APPLICABLE;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TokenWithoutOpenBracket),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TokenWithoutOpenBracket),
         "a close bracket ')' appears here with no matching open '('",
         "so I can't see what is meant to be the fixed text and what is meant to "
         "be changeable. The idea is to put brackets around whatever varies from "
@@ -910,7 +910,7 @@ the hyphen, and this is sorely needed with complicated functional kinds.
 
 
     *X = NOT_APPLICABLE;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TokenWithNestedBrackets),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TokenWithNestedBrackets),
         "the name of the token inside the brackets '(' and ')' and before the "
         "hyphen '-' itself contains another open bracket '('",
         "which is not allowed.");
@@ -923,7 +923,7 @@ the hyphen, and this is sorely needed with complicated functional kinds.
     *X = NOT_APPLICABLE;
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, GET_RW(<phrase-token-declaration>, 2));
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadTypeIndication));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadTypeIndication));
     Problems::issue_problem_segment(
         "In %1, the text '%2' after the hyphen should tell me what kind of value "
         "goes here (like 'a number', or 'a vehicle'), but it's not something I "
@@ -937,7 +937,7 @@ the hyphen, and this is sorely needed with complicated functional kinds.
 
     LOG("On %W\n", W);
     *X = NOT_APPLICABLE;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TokenMisunderstood),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TokenMisunderstood),
         "the brackets '(' and ')' here neither say that something varies but has "
         "a given type, nor specify a called name",
         "so I can't make sense of them. For a 'To...' phrase, brackets like this "
@@ -988,7 +988,7 @@ form the word and token sequences:
             case FALSE: 			Add a word next20.1; break;
         }
         if (phtd->no_words >= MAX_WORDS_PER_PHRASE) {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PhraseTooLong),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PhraseTooLong),
                 "this phrase has too many words",
                 "and needs to be simplified.");
             return;
@@ -1042,7 +1042,7 @@ form the word and token sequences:
             Problems::quote_wording(2, Node::get_text(spec));
             int n = MAX_TOKENS_PER_PHRASE;
             Problems::quote_number(3, &n);
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TooManyTokens));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TooManyTokens));
             Problems::issue_problem_segment(
                 "In %1, I ran out of tokens when I got up to '%2'. "
                 "Phrases are only allowed %3 tokens, that is, they "
@@ -1064,7 +1064,7 @@ form the word and token sequences:
         (phtd->as_inline.invoked_inline_not_as_call == FALSE)) {
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, Node::get_text(spec));
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NoninlineUsesNonvalues));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NoninlineUsesNonvalues));
         Problems::issue_problem_segment(
             "In %1, the text '%2' after the hyphen should tell me what kind of "
             "value goes here (like 'a number', or 'a vehicle'), but this is not "
@@ -1086,7 +1086,7 @@ form the word and token sequences:
         if (Calculus::Variables::number_free(prop) != 1) {
             Problems::quote_source(1, current_sentence);
             Problems::quote_wording(2, Node::get_text(spec));
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PhraseTokenQuantified));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PhraseTokenQuantified));
             Problems::issue_problem_segment(
                 "In %1, the text '%2' after the hyphen should tell me what kind of "
                 "value goes here (like 'a number', or 'a vehicle'), but it has to "
@@ -1126,7 +1126,7 @@ form the word and token sequences:
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UndeclaredKindVariable),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UndeclaredKindVariable),
         "this phrase uses a kind variable which is not declared",
         "which is not allowed.");
     phtd->token_sequence[i].token_kind =
@@ -1220,7 +1220,7 @@ in exactly one place: for example,
     kind *dec = Kinds::get_variable_stipulation(K);
     if (dec) {
         if (declarations[N]) {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_DoublyDeclaredKindVariable),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DoublyDeclaredKindVariable),
                 "this phrase declares the same kind variable more than once",
                 "and ought to declare each variable once each.");
         }
diff --git a/docs/core-module/22-ph.html b/docs/core-module/22-ph.html
index 64adde7fb..0dda349b1 100644
--- a/docs/core-module/22-ph.html
+++ b/docs/core-module/22-ph.html
@@ -367,7 +367,7 @@ of it:
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_Undefined),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_Undefined),
         "there doesn't seem to be any definition here",
         "so I can't see what this rule or phrase would do.");
 
@@ -380,7 +380,7 @@ of it:
     LOG("Inline definition: <%s>\n", inline_defn);
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_InlineTooLong),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_InlineTooLong),
         "the inline definition of this 'to...' phrase is too long",
         "using a quantity of Inform 6 code which exceeds the fairly small limit "
         "allowed. You will need either to write the phrase definition in Inform 7, "
@@ -392,7 +392,7 @@ of it:
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_InlineRule),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_InlineRule),
         "only 'to...' phrases can be given inline Inform 6 definitions",
         "and in particular rules and adjective definitions can't.");
 
@@ -421,7 +421,7 @@ what number is...", for instance.
     *X = DONT_KNOW_MOR;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TailAfterInline),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TailAfterInline),
         "some unexpected text appears after the tail of an inline definition",
         "placed within '(-' and '-)' markers to indicate that it is written in "
         "Inform 6. Here, there seems to be something extra after the '-)'.");
@@ -557,13 +557,13 @@ response to "requests". All other phrases are compiled just once.
             if (ph->to_begin) {
                 n++;
                 if (n > 1) {
-                    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(...),
+                    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(...),
                         "there seem to be multiple 'to begin' phrases",
                         "and in Basic mode, Inform expects to see exactly one of "
                         "these, specifying where execution should begin.");
                 } else {
                     if (Phrases::compiled_inline(ph)) {
-                        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(...),
+                        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(...),
                             "the 'to begin' phrase seems to be defined inline",
                             "which in Basic mode is not allowed.");
                     } else {
@@ -578,7 +578,7 @@ response to "requests". All other phrases are compiled just once.
                 }
             }
         if (n == 0) {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(...),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(...),
                 "there seems not to be a 'to begin' phrase",
                 "and in Basic mode, Inform expects to see exactly one of "
                 "these, specifying where execution should begin.");
diff --git a/docs/core-module/22-po.html b/docs/core-module/22-po.html
index 08aff750e..b567a5620 100644
--- a/docs/core-module/22-po.html
+++ b/docs/core-module/22-po.html
@@ -233,7 +233,7 @@ For example, in:
     LOGIF(PHRASE_CREATIONS, "Adding phrase option <%W>\n", W);
     if (phod->no_options_permitted >= MAX_OPTIONS_PER_PHRASE) {
         if (too_many_POs_error == FALSE)
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TooManyPhraseOptions),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TooManyPhraseOptions),
                 "a phrase is only allowed to have 16 different options",
                 "so either some of these will need to go, or you may want to "
                 "consider breaking up the phrase into simpler ones whose usage "
@@ -326,7 +326,7 @@ this residue is zero.
             Problems::quote_wording(2, W);
             Problems::quote_phrase(3, ph);
             Problems::quote_wording(4, phod_being_parsed->options_declaration);
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PhraseOptionsExclusive));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PhraseOptionsExclusive));
             Problems::issue_problem_segment(
                 "You wrote %1, supplying the options '%2' to the phrase '%3', but "
                 "the options listed for this phrase ('%4') are mutually exclusive.");
@@ -365,13 +365,13 @@ by "and":
         Problems::quote_phrase(3, ph_being_parsed);
         Problems::quote_wording(4, phod_being_parsed->options_declaration);
         if (phod_being_parsed->no_options_permitted > 1) {
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NotAPhraseOption));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NotAPhraseOption));
             Problems::issue_problem_segment(
                 "You wrote %1, but '%2' is not one of the options allowed on "
                 "the end of the phrase '%3'. (The options allowed are: '%4'.)");
             Problems::issue_problem_end();
         } else {
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NotTheOnlyPhraseOption));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NotTheOnlyPhraseOption));
             Problems::issue_problem_segment(
                 "You wrote %1, but the only option allowed on the end of the "
                 "phrase '%3' is '%4', so '%2' is not something I know how to "
diff --git a/docs/core-module/22-prcd.html b/docs/core-module/22-prcd.html
index ff10612fc..96b91c884 100644
--- a/docs/core-module/22-prcd.html
+++ b/docs/core-module/22-prcd.html
@@ -587,7 +587,7 @@ with the default outcome return (see above).
         if (avl) {
             Activities::emit_activity_list(avl);
         } else {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadWhenWhile),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadWhenWhile),
                 "I don't understand the 'when/while' clause",
                 "which should name activities or conditions.");
             Produce::val(Emit::tree(), K_truth_state, LITERAL_IVAL, 0);
diff --git a/docs/core-module/22-pu.html b/docs/core-module/22-pu.html
index 6a75dce5d..36a9fb54f 100644
--- a/docs/core-module/22-pu.html
+++ b/docs/core-module/22-pu.html
@@ -184,7 +184,7 @@ connect this existing one to the phrase.
     if ((ph_found) && (ph_found != ph)) {
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, W);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_DuplicateRuleName));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_DuplicateRuleName));
         Problems::issue_problem_segment(
             "You wrote %1, but this would give a name ('%2') to a "
             "new rule which already belongs to an existing one.");
@@ -243,7 +243,7 @@ just enough from the wording to tell what sort of rule/phrase is to follow.
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NamelessRule),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NamelessRule),
         "there are many rules in Inform",
         "so you need to give a name: 'this is the abolish dancing rule', say, "
         "not just 'this is the rule'.");
@@ -253,7 +253,7 @@ just enough from the wording to tell what sort of rule/phrase is to follow.
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnarticledRule),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnarticledRule),
         "a rule must be given a definite name",
         "which begins with 'the', just to emphasise that it is the only one "
         "with this name: 'this is the promote dancing rule', say, not just "
@@ -264,7 +264,7 @@ just enough from the wording to tell what sort of rule/phrase is to follow.
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PluralisedRule),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PluralisedRule),
         "a rule must be given a definite name ending in 'rule' not 'rules'",
         "since the plural is only used for rulebooks, which can of course "
         "contain many rules at once.");
@@ -274,7 +274,7 @@ just enough from the wording to tell what sort of rule/phrase is to follow.
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BareTo),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BareTo),
         "'to' what? No name is given",
         "which means that this would not define a new phrase.");
 
@@ -283,7 +283,7 @@ just enough from the wording to tell what sort of rule/phrase is to follow.

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_DontCallPhrasesWithCalled),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DontCallPhrasesWithCalled),
         "phrases aren't named using 'called'",
         "and instead use 'this is...'. For example, 'To salute (called saluting)' "
         "isn't allowed, but 'To salute (this is saluting)' is.");
@@ -412,7 +412,7 @@ effects — see below.)
     if (<<named>>) The preamble parses to a named To phrase11.2.1;
     if (<now-phrase-preamble>(W)) {
         if ((coarse_mode) && (no_now_phrases++ == 1)) {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RedefinedNow),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RedefinedNow),
                 "creating new variants on 'now' is not allowed",
                 "because 'now' plays a special role in the language. "
                 "It has a wide-ranging ability to make a condition "
@@ -439,7 +439,7 @@ mode, we can get that value back again if we look it up by name.
 
     if (coarse_mode) {
         if (<s-type-expression>(NW)) {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PhraseNameDuplicated),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PhraseNameDuplicated),
                 "that name for this new phrase is not allowed",
                 "because it already has a meaning.");
         }
@@ -454,7 +454,7 @@ mode, we can get that value back again if we look it up by name.
             if (ph) current_sentence = Phrases::declaration_node(ph);
             Problems::quote_source(1, NounPhrases::new_raw(Nouns::nominative(cphr->name)));
             Problems::quote_wording(2, Nouns::nominative(cphr->name));
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NamedGeneric));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NamedGeneric));
             Problems::issue_problem_segment(
                 "I can't allow %1, because the phrase it gives a name to "
                 "is generic, that is, it has a kind which is too vague. "
@@ -611,7 +611,7 @@ of the stem, so we have to be very careful:
 
 
     Problems::quote_source(1, current_sentence);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadRulePreambleWhen));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadRulePreambleWhen));
     Problems::issue_problem_segment(
         "The punctuation makes me think %1 should be a definition "
         "of a phrase or a rule, but it doesn't begin as it should, "
@@ -637,7 +637,7 @@ of the stem, so we have to be very careful:
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadRulePreamble),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadRulePreamble),
         "the punctuation here ':' makes me think this should be a definition "
         "of a phrase and it doesn't begin as it should",
         "with either 'To' (e.g. 'To flood the riverplain:'), 'Definition:', "
@@ -654,7 +654,7 @@ of the stem, so we have to be very careful:
 
     if ((parsed_rm.article_used == DEF_ART) &&
         (parsed_rm.placement_requested == MIDDLE_PLACEMENT))
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RuleWithDefiniteArticle),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RuleWithDefiniteArticle),
             "a rulebook can contain any number of rules",
             "so (e.g.) 'the before rule: ...' is disallowed; you should "
             "write 'a before rule: ...' instead.");
@@ -949,7 +949,7 @@ parser, recording how it most recently failed.
 

-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_APWithDisjunction));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_APWithDisjunction));
     Problems::issue_problem_segment(
         "You wrote %1, which seems to introduce a rule, but the "
         "circumstances ('%2') seem to be too general for me to "
@@ -968,7 +968,7 @@ parser, recording how it most recently failed.
 

-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_APWithNoParticiple));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_APWithNoParticiple));
     Problems::issue_problem_segment(
         "You wrote %1, which seems to introduce a rule taking effect "
         "only '%2'. But this does not look like an action, since "
@@ -982,7 +982,7 @@ parser, recording how it most recently failed.
 

-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_APWithImmiscible));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_APWithImmiscible));
     Problems::issue_problem_segment(
         "You wrote %1, which seems to introduce a rule taking effect "
         "only '%2'. But this is a combination of actions which cannot "
@@ -999,7 +999,7 @@ parser, recording how it most recently failed.
 

-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_APWithBadWhen));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_APWithBadWhen));
     wording Q = phud->rule_parameter;
     int diagnosis = 0;
     if (<action-when-diagnosis>(Q)) {
@@ -1043,7 +1043,7 @@ parser, recording how it most recently failed.
         Problems::quote_text(3,
             "The part after 'when' (or 'while') was fine, but the earlier words");
     else Problems::quote_text(3, "But that");
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_APUnknown));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_APUnknown));
     Problems::issue_problem_segment(
         "You wrote %1, which seems to introduce a rule taking effect only if the "
         "action is '%2'. %3 did not make sense as a description of an action.");
@@ -1158,7 +1158,7 @@ is used to choose a problem message if the value makes no sense.
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_WhenThePlay),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_WhenThePlay),
         "there's no scene called 'the play'",
         "so I think you need to remove 'the' - Inform has two "
         "special rulebooks, 'When play begins' and 'When play ends', "
@@ -1169,7 +1169,7 @@ is used to choose a problem message if the value makes no sense.
 

-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadParameter));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadParameter));
     Problems::issue_problem_segment(
         "You wrote %1, but the description of the thing(s) to which the rule "
         "applies ('%2') did not make sense. This is %3 based rulebook, so "
@@ -1191,7 +1191,7 @@ but the action isn't one we recognise.
 

-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NonActionInPresenceOf));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NonActionInPresenceOf));
     Problems::issue_problem_segment(
         "You wrote %1, but 'in the presence of...' is a clause which can "
         "only be used to talk about an action: so, for instance, 'waiting "
@@ -1209,7 +1209,7 @@ but the action isn't one we recognise.
 

-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NonActionIn));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NonActionIn));
     Problems::issue_problem_segment(
         "You wrote %1, but 'in...' used in this way should really belong "
         "to an action: for instance, 'Before waiting in the Library'. "
diff --git a/docs/core-module/22-tp.html b/docs/core-module/22-tp.html
index 28892ebfe..837f00997 100644
--- a/docs/core-module/22-tp.html
+++ b/docs/core-module/22-tp.html
@@ -139,7 +139,7 @@ variety of values:
     if (r == CONFLICTED_PH) {
         Problems::quote_source(1, Phrases::declaration_node(ph1));
         Problems::quote_source(2, Phrases::declaration_node(ph2));
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ConflictedReturnKinds));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ConflictedReturnKinds));
         Problems::issue_problem_segment(
             "The two phrase definitions %1 and %2 make the same wording "
             "produce two different kinds of value, which is not allowed.");
@@ -271,7 +271,7 @@ list is a list of. The result would be:
 
 
     Problems::quote_source(1, Phrases::declaration_node(ph));
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_UndeterminedKind));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_UndeterminedKind));
     if (Wordings::empty(W)) {
         Problems::issue_problem_segment(
             "The phrase %1 needs to be used in such a way that I know "
@@ -309,7 +309,7 @@ I6 routine.
             current_sentence = Phrases::declaration_node(ph);
             Problems::quote_source(1, current_sentence);
             Problems::quote_phrase(2, ph);
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PhraseNamedI6Failed));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PhraseNamedI6Failed));
             Problems::issue_problem_segment(
                 "You wrote %1, defining the phrase '%2' with a piece of Inform 6 "
                 "code, but also giving it a name as a function to be used in an "
diff --git a/docs/core-module/22-tp2.html b/docs/core-module/22-tp2.html
index 1b0aa544a..30aa67af2 100644
--- a/docs/core-module/22-tp2.html
+++ b/docs/core-module/22-tp2.html
@@ -165,7 +165,7 @@ arguably shouldn't block compilation. Then again...
         if (Phrases::Usage::get_timing_of_event(&(ph->usage_data)) == NO_FIXED_TIME) {
             if (ph->usage_data.uses_as_event == NULL) {
                 current_sentence = ph->declaration_node;
-                Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnusedTimedEvent),
+                StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnusedTimedEvent),
                     "this sets up a timed event which is never used",
                     "since you never use any of the phrases which could cause it. "
                     "(A timed event is just a name, and it needs other instructions "
diff --git a/docs/core-module/23-abc.html b/docs/core-module/23-abc.html
index a573d2788..1d313cd16 100644
--- a/docs/core-module/23-abc.html
+++ b/docs/core-module/23-abc.html
@@ -105,7 +105,7 @@ function togglePopup(material_id) {
                     if ((spec == NULL) ||
                         (Dash::validate_conditional_clause(spec) == FALSE)) {
                         LOG("Error on: %W = $T", def->condition_to_match, spec);
-                        Problems::Issue::definition_problem(Task::syntax_tree(), _p_(PM_DefinitionBadCondition),
+                        StandardProblems::definition_problem(Task::syntax_tree(), _p_(PM_DefinitionBadCondition),
                             def->node,
                             "that condition makes no sense to me",
                             "although the preamble to the definition was properly "
diff --git a/docs/core-module/23-ad.html b/docs/core-module/23-ad.html
index 0ff5e39e8..9e0a1c0c7 100644
--- a/docs/core-module/23-ad.html
+++ b/docs/core-module/23-ad.html
@@ -224,7 +224,7 @@ is defined by routine or not.
 
     if ((p->next == NULL) ||
         (Node::get_type(p->next) != RULE_NT)) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
             "don't leave me in suspense",
             "write a definition after 'Definition:'!");
         return;
@@ -254,7 +254,7 @@ is defined by routine or not.
     if ((the_format == DEFINED_IN_SOME_WAY_NOT_YET_KNOWN) ||
         ((the_format == DEFINED_PHRASALLY) && (q->down == NULL))) {
         LOG("Definition tree (%d):\n$T\n", the_format, q);
-        Problems::Issue::definition_problem(Task::syntax_tree(), _p_(PM_DefinitionWithoutCondition),
+        StandardProblems::definition_problem(Task::syntax_tree(), _p_(PM_DefinitionWithoutCondition),
             q, "a definition must take the form 'Definition: a ... is ... if/unless "
             "...' or else 'Definition: a ... is ...: ...'",
             "but I can't make this fit either shape.");
@@ -263,7 +263,7 @@ is defined by routine or not.
     if ((Wordings::mismatched_brackets(AW)) ||
         ((Wordings::nonempty(NW)) && (Wordings::mismatched_brackets(NW)))) {
         LOG("Definition tree:\n$T\n", p);
-        Problems::Issue::definition_problem(Task::syntax_tree(), _p_(PM_BracketedAdjective),
+        StandardProblems::definition_problem(Task::syntax_tree(), _p_(PM_BracketedAdjective),
             q, "this definition seems to involve unexpected brackets in the name of "
             "the adjective being defined",
             "so I think I must be misreading it.");
@@ -295,7 +295,7 @@ offer the new adjective around and see if anybody claims it.
 
 int Phrases::Adjectives::vet_name(wording W) {
     if (<article>(W)) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ArticleAsAdjective),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ArticleAsAdjective),
             "a defined adjective cannot consist only of an article such as "
             "'a' or 'the'",
             "since this will lead to parsing ambiguities.");
@@ -305,7 +305,7 @@ offer the new adjective around and see if anybody claims it.
         if (problem_count == 0) {
             Problems::quote_source(1, current_sentence);
             Problems::quote_wording(2, W);
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_AdjectivePunctuated));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_AdjectivePunctuated));
             Problems::issue_problem_segment(
                 "The sentence %1 seems to create an adjective with the name "
                 "'%2', but adjectives have to be contain only unpunctuated "
diff --git a/docs/core-module/24-ch.html b/docs/core-module/24-ch.html
index cf7f01f0b..2a373a2a3 100644
--- a/docs/core-module/24-ch.html
+++ b/docs/core-module/24-ch.html
@@ -117,7 +117,7 @@ storage: the following simple structures are used for this.
     LOGIF(TIME_PERIODS,
         "Chronology::compile_past_action_pattern on: $A\nat: $t\n", &ap, &duration);
     if (PL::Actions::Patterns::makes_callings(&ap)) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PTAPMakesCallings),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PTAPMakesCallings),
             "a description of an action cannot both refer to past history "
             "and also use '(called ...)'",
             "because that would require Inform in general to remember "
@@ -260,7 +260,7 @@ storage: the following simple structures are used for this.
     if (Node::is(spec, TEST_VALUE_NT)) ap = Rvalues::to_action_pattern(spec->down);
     if ((ap) && (duration.tense != IS_TENSE)) {
         if ((duration.units == TIMES_UNIT) && (duration.length >= 2)) {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NoMoreRonNewcombMoment),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NoMoreRonNewcombMoment),
                 "a condition like 'we have X', where X is an action, has either "
                 "happened for one spell or never happened at all",
                 "so it can't make sense to ask if it has happened two or more "
@@ -317,7 +317,7 @@ storage: the following simple structures are used for this.
     }
 
     if (no_past_tenses >= 1024) {  limit imposed by the Z-machine implementation
-        Problems::Issue::limit_problem(Task::syntax_tree(), _p_(Untestable),  well, not conveniently
+        StandardProblems::limit_problem(Task::syntax_tree(), _p_(Untestable),  well, not conveniently
             "conditions written in the past tense", 1024);
         return;
     }
@@ -399,7 +399,7 @@ ever tampered with.
 
         if ((LocalVariables::are_we_using_table_lookup()) && (once_only)) {
             once_only = FALSE;
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PastTableLookup),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PastTableLookup),
                 "it's not safe to look up table entries in a way referring "
                 "to past history",
                 "because it leads to dangerous ambiguities. For instance, "
@@ -625,7 +625,7 @@ ever tampered with.
                         END_COMPILATION_MODE;
                         if ((LocalVariables::are_we_using_table_lookup()) && (once_only)) {
                             once_only = FALSE;
-                            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PastTableEntries),
+                            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PastTableEntries),
                                 "it's not safe to look up table entries in a way referring "
                                 "to past history",
                                 "because it leads to dangerous ambiguities. For instance, "
@@ -746,7 +746,7 @@ a file stream, thus allowing rewinding:
         LOGIF(TIME_PERIODS, "Number %d: proposition $D\n",
             ptc->allocation_id, Specifications::to_proposition(spec));
         if (Calculus::Propositions::contains_callings(Specifications::to_proposition(spec))) {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PastCallings),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PastCallings),
                 "it's not safe to use '(called ...)' in a way referring "
                 "to past history",
                 "because this would make a temporary value to hold the "
diff --git a/docs/core-module/24-lv.html b/docs/core-module/24-lv.html
index ab4f0796e..817dc7ea5 100644
--- a/docs/core-module/24-lv.html
+++ b/docs/core-module/24-lv.html
@@ -300,7 +300,7 @@ context of compilation for later use. That includes locals, so:
 
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, W);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_CalledThe));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_CalledThe));
     Problems::issue_problem_segment(
         "In %1, you seem to be giving a temporary value a pretty "
         "odd name - '%2', which I won't allow because it would lead to too "
@@ -507,7 +507,7 @@ given fresh names in between now and then.
 

-void LocalVariables::copy(ph_stack_frame *phsf_to, ph_stack_frame *phsf_from) {
+void LocalVariables::copy(ph_stack_frame *phsf_to, ph_stack_frame *phsf_from) {
     locals_slate *slate_from = &(phsf_from->local_value_variables);
     locals_slate *slate_to = &(phsf_to->local_value_variables);
 
@@ -689,7 +689,7 @@ any need.
 
 
 int stack_selection_used_recently = FALSE;
-void LocalVariables::monitor_local_parsing(ph_stack_frame *phsf) {
+void LocalVariables::monitor_local_parsing(ph_stack_frame *phsf) {
     if (phsf) {
         local_variable *lvar;
         for (lvar = phsf->local_value_variables.local_variable_allocation; lvar; lvar = lvar->next)
@@ -702,7 +702,7 @@ any need.
     stack_selection_used_recently = TRUE;
 }
 
-int LocalVariables::local_parsed_recently(ph_stack_frame *phsf) {
+int LocalVariables::local_parsed_recently(ph_stack_frame *phsf) {
     if (phsf) {
         local_variable *lvar;
         for (lvar = phsf->local_value_variables.local_variable_allocation; lvar; lvar = lvar->next)
@@ -798,7 +798,7 @@ function, i.e., immediately after the call.
 

-void LocalVariables::compile_retrieval(ph_stack_frame *phsf) {
+void LocalVariables::compile_retrieval(ph_stack_frame *phsf) {
     inter_name *LP = Hierarchy::find(LOCALPARKING_HL);
     inter_t j=0;
     for (local_variable *lvar = phsf->local_value_variables.local_variable_allocation; lvar; lvar = lvar->next) {
@@ -902,7 +902,7 @@ name or a description.
     *X = 0; *XP = NULL;
     if (!(Wordings::eq(PM_CalledWithDash_wording, W))) {
         PM_CalledWithDash_wording = W;
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CalledWithDash),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CalledWithDash),
             "a '(called ...)' name is not allowed to include a hyphen",
             "since this would look misleadingly like a declaration of kind of value it has.");
     }
@@ -921,7 +921,7 @@ name or a description.
             Problems::quote_text(3, "a kind");
         else
             Problems::quote_kind_of(3, already);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_CalledOverloaded));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_CalledOverloaded));
         Problems::issue_problem_segment(
             "In %1, it looks as if '%2' is going to be a temporary name which something "
             "will be called. But I can't allow that, because it already has a meaning "
@@ -1060,7 +1060,7 @@ worth making the change, even though the disruption would be small.)
     if ((lvar->lv_purpose == LET_VALUE_LV) && (lvar->protected)) {
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, lvar->varname);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ProtectedFromLet));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ProtectedFromLet));
         Problems::issue_problem_segment(
             "In %1, it looks as if you want to use 'let' to change the value of "
             "the temporary variable '%2'. Ordinarily that would be fine, but it's "
@@ -1161,7 +1161,7 @@ value.
 void LocalVariables::add_calling_to_condition(local_variable *lvar) {
     if (current_session_number < 0) internal_error("no PM session");
     if (callings_in_condition_sp + 1 == MAX_CALLINGS_IN_MATCH)
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),  or very hard, anyway
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),  or very hard, anyway
         "that makes too complicated a condition to test",
         "with all of those clauses involving 'called' values.");
     else {
diff --git a/docs/core-module/24-sf.html b/docs/core-module/24-sf.html
index a34368d0b..8cd840945 100644
--- a/docs/core-module/24-sf.html
+++ b/docs/core-module/24-sf.html
@@ -183,7 +183,7 @@ if that's active, and otherwise must be set as needed.
 
 ph_stack_frame *current_frame = NULL;
 
-ph_stack_frame *Frames::current_stack_frame(void) {
+ph_stack_frame *Frames::current_stack_frame(void) {
     return current_frame;
 }
 
@@ -271,7 +271,7 @@ reference to the past.
 

§13. Logging.

-void Frames::log(ph_stack_frame *phsf) {
+void Frames::log(ph_stack_frame *phsf) {
     if (phsf == NULL) { LOG("<null stack frame>\n"); return; }
     LOG("Stack frame at %08x: it:%s, dpc:%s\n",
         phsf,
diff --git a/docs/core-module/25-ci.html b/docs/core-module/25-ci.html
index 1bb0768ed..b57a6c64c 100644
--- a/docs/core-module/25-ci.html
+++ b/docs/core-module/25-ci.html
@@ -217,7 +217,7 @@ earlier invocation list (in what may be another setting entirely).
             Phrases::TypeData::describe_manner_of_return(manner_expected,
                 &(phrase_being_compiled->type_data), &K));
         if (K) Problems::quote_kind(4, K);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_WrongEndToPhrase));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_WrongEndToPhrase));
         if (K)
             Problems::issue_problem_segment(
                 "The line %1 seems to be a way that the phrase you're defining can come "
diff --git a/docs/core-module/25-cii.html b/docs/core-module/25-cii.html
index c02e66d65..3331f44c1 100644
--- a/docs/core-module/25-cii.html
+++ b/docs/core-module/25-cii.html
@@ -340,7 +340,7 @@ charlatans" and what they "deserve". I'm a better person now.
     *X = PROBLEM_INSUB;
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, W);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadInlineExpansion));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadInlineExpansion));
     Problems::issue_problem_segment(
         "You wrote %1, but when I looked that phrase up I found that its inline "
         "definition included the bracing {%2}. Text written in braces like this, "
@@ -432,7 +432,7 @@ the presence of annotations can change what we do.
             Problems::quote_source(1, current_sentence);
             if (nlv) Problems::quote_wording(2, nlv->name);
             else Problems::quote_spec(2, supplied);
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NotAnLvalue));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NotAnLvalue));
             Problems::issue_problem_segment(
                 "You wrote %1, but that seems to mean changing '%2', which "
                 "is a constant and can't be altered.");
@@ -548,7 +548,7 @@ its own when kind variables are in play.
 
     Problems::quote_source(1, current_sentence);
     Problems::quote_kind(2, K);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NoNaturalDefault2));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NoNaturalDefault2));
     Problems::issue_problem_segment(
         "To achieve %1, we'd need to be able to store a default value of "
         "the kind '%2', but there's no natural choice for this.");
@@ -643,7 +643,7 @@ proposition.
 

-    Problems::Issue::inline_problem(_p_(PM_InlineNew), ph, sche->owner->parent_schema->converted_from,
+    StandardProblems::inline_problem(_p_(PM_InlineNew), ph, sche->owner->parent_schema->converted_from,
         "I don't know any kind called '%4'.");
 
@@ -671,7 +671,7 @@ character:
     Problems::quote_source(1, current_sentence);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BackspaceWithdrawn));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BackspaceWithdrawn));
     Problems::issue_problem_segment(
         "I attempted to compile %1 using its inline definition, "
         "but this contained the invalid annotation '{backspace}', "
@@ -973,7 +973,7 @@ having this annotation seems the smaller of the two warts.
     if (Rvalues::is_CONSTANT_of_kind(supplied, K_text) == FALSE) {
         Problems::quote_source(1, current_sentence);
         Problems::quote_spec(2, supplied);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_Misboxed));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_Misboxed));
         Problems::issue_problem_segment(
             "I attempted to compile %1, but the text '%2' supplied to be a "
             "boxed quotation wasn't a constant piece of text in double-quotes. "
@@ -1083,14 +1083,14 @@ the problem messages are phrased differently if something goes wrong.
     Problems::quote_source(1, current_sentence);
     Problems::quote_kind_of(2, supplied);
     if (returning_from_rule) {
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RuleNotAllowedOutcome));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RuleNotAllowedOutcome));
         Problems::issue_problem_segment(
             "You wrote %1 as something to be a successful outcome of a rule, which "
             "has the kind %2; but this is not a rule which is allowed to have a value "
             "as its outcome.");
         Problems::issue_problem_end();
     } else {
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RedundantReturnKOV));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RedundantReturnKOV));
         Problems::issue_problem_segment(
             "You wrote %1 as the outcome of a phrase, %2, but in the definition of "
             "something which was not a phrase to decide a value.");
@@ -1106,13 +1106,13 @@ the problem messages are phrased differently if something goes wrong.
     Problems::quote_kind(2, kind_supplied);
     Problems::quote_kind(3, kind_needed);
     if (returning_from_rule) {
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RuleOutcomeWrongKind));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RuleOutcomeWrongKind));
         Problems::issue_problem_segment(
             "You wrote %1 as the outcome of a rule which produces a value, but this "
             "was the wrong kind of value: %2 rather than %3.");
         Problems::issue_problem_end();
     } else {
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ReturnWrongKind));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ReturnWrongKind));
         Problems::issue_problem_segment(
             "You wrote %1 as the outcome of a phrase to decide a value, but this was "
             "the wrong kind of value: %2 rather than %3.");
@@ -1242,7 +1242,7 @@ rule), and also makes a note for indexing purposes.
     } else {
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, Node::get_text(supplied));
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NonconstantEvent));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NonconstantEvent));
         Problems::issue_problem_segment(
             "You wrote %1, but '%2' isn't the name of any timed event that "
             "I know of. (These need to be set up in a special way, like so - "
@@ -1259,7 +1259,7 @@ rule), and also makes a note for indexing purposes.
 
     Problems::quote_source(1, current_sentence);
     Problems::quote_stream(2, sche->command);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadInlineTag));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadInlineTag));
     Problems::issue_problem_segment(
         "I attempted to compile %1 using its inline definition, "
         "but this contained the invalid annotation '%2'.");
@@ -1512,7 +1512,7 @@ default values when created, so they are always typesafe anyway.
         if (rv == FALSE) {
             Problems::quote_source(1, current_sentence);
             Problems::quote_kind(2, K);
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NoNaturalDefault));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NoNaturalDefault));
             Problems::issue_problem_segment(
                 "To achieve %1, we'd need to be able to store a default value of "
                 "the kind '%2', but there's no natural choice for this.");
@@ -1629,7 +1629,7 @@ of the variable {-my:1} to S.
     if ((to == NULL) || (from == NULL)) {
         Problems::quote_stream(4, sche->operand);
         Problems::quote_stream(5, sche->operand2);
-        Problems::Issue::inline_problem(_p_(PM_InlineCopy), ph, sche->owner->parent_schema->converted_from,
+        StandardProblems::inline_problem(_p_(PM_InlineCopy), ph, sche->owner->parent_schema->converted_from,
             "The command to {-copy:...}, which asks to copy '%5' into '%4', has "
             "gone wrong: I couldn't work those out.");
         return;
@@ -1664,7 +1664,7 @@ story title).
     if (Kinds::Behaviour::is_quasinumerical(K1) == FALSE) {
         Problems::quote_source(1, current_sentence);
         Problems::quote_kind(2, K1);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_CantIncrementKind));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_CantIncrementKind));
         Problems::issue_problem_segment(
             "To achieve %1, we'd need to be able to add or subtract 1 from "
             "a value of the kind '%2', but there's no good way to do this.");
@@ -1712,7 +1712,7 @@ variable.)
     if ((to_test == NULL) || (to_match == NULL)) {
         Problems::quote_stream(4, sche->operand);
         Problems::quote_stream(5, sche->operand2);
-        Problems::Issue::inline_problem(_p_(PM_InlineMatchesDescription), ph, sche->owner->parent_schema->converted_from,
+        StandardProblems::inline_problem(_p_(PM_InlineMatchesDescription), ph, sche->owner->parent_schema->converted_from,
             "The command {-matches-description:...}, which asks to test whether "
             "'%5' is a valid description for '%4', has gone wrong: I couldn't "
             "work those out.");
@@ -1737,7 +1737,7 @@ variable matches the given description.
     if ((to_test == NULL) || (to_match == NULL)) {
         Problems::quote_stream(4, sche->operand);
         Problems::quote_stream(5, sche->operand2);
-        Problems::Issue::inline_problem(_p_(PM_InlineNowMatchesDescription),
+        StandardProblems::inline_problem(_p_(PM_InlineNowMatchesDescription),
             ph, sche->owner->parent_schema->converted_from,
             "The command {-now-matches-description:...}, which asks to change "
             "'%4' so that '%5' becomes a valid description of it, has gone "
@@ -1970,7 +1970,7 @@ the "group... together" phrases.
     } else if (sche->inline_subcommand == articled_ISINSC) {
         inter_name *iname = ListTogether::new(TRUE);
         Produce::val_iname(Emit::tree(), K_value, iname);
-    } else Problems::Issue::inline_problem(_p_(PM_InlineListTogether),
+    } else StandardProblems::inline_problem(_p_(PM_InlineListTogether),
         ph, sche->owner->parent_schema->converted_from,
         "The only legal forms here are {-list-together:articled} and "
         "{-list-together:unarticled}.");
@@ -1986,7 +1986,7 @@ mathematical definitions in the Standard Rules.
 
 
     Problems::quote_source(1, current_sentence);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RescaleWithdrawn));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RescaleWithdrawn));
     Problems::issue_problem_segment(
         "I attempted to compile %1 using its inline definition, "
         "but this contained the invalid annotation '{-rescale:...}', "
@@ -2041,7 +2041,7 @@ especially those involving complicated linguistic propositions. For example:
             Calculus::Deferrals::emit_extremal_of_S(tokens->args[0],
                 sche->extremal_property, sche->extremal_property_sign);
         } else
-            Problems::Issue::inline_problem(_p_(PM_InlineExtremal),
+            StandardProblems::inline_problem(_p_(PM_InlineExtremal),
                 ph, sche->owner->parent_schema->converted_from,
                 "In the '{-primitive-definition:extremal...}' command, there "
                 "should be a '<' or '>' sign then the name of a property.");
@@ -2070,7 +2070,7 @@ especially those involving complicated linguistic propositions. For example:
     }
     else {
         Problems::quote_stream(4, sche->operand);
-        Problems::Issue::inline_problem(_p_(PM_InlinePrimitive), ph, sche->owner->parent_schema->converted_from,
+        StandardProblems::inline_problem(_p_(PM_InlinePrimitive), ph, sche->owner->parent_schema->converted_from,
             "I don't know any primitive definition called '%4'.");
     }
     return;
@@ -2085,7 +2085,7 @@ especially those involving complicated linguistic propositions. For example:
     kind *X = NULL, *Y = NULL;
     if (Kinds::get_construct(fn_kind) != CON_phrase) {
         Problems::quote_spec(4, fn);
-        Problems::Issue::inline_problem(_p_(PM_InlineFunctionApplication),
+        StandardProblems::inline_problem(_p_(PM_InlineFunctionApplication),
             ph, sche->owner->parent_schema->converted_from,
             "A function application only makes sense if the first token, "
             "'%4', is a phrase: here it isn't.");
@@ -2125,7 +2125,7 @@ especially those involving complicated linguistic propositions. For example:
         Equations::emit_solution(Node::get_text(tokens->args[0]),
             Rvalues::to_equation(tokens->args[1]));
     } else {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_SolvedNameless),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_SolvedNameless),
             "only specific named equations can be solved",
             "not equations arrived at by further calculations or choices. (Sorry: "
             "but there would be no safe way to determine when an equation could "
@@ -2138,7 +2138,7 @@ especially those involving complicated linguistic propositions. For example:
 
 
     Problems::quote_stream(4, sche->operand);
-    Problems::Issue::inline_problem(_p_(PM_InlineNoSuch), ph, sche->owner->parent_schema->converted_from,
+    StandardProblems::inline_problem(_p_(PM_InlineNoSuch), ph, sche->owner->parent_schema->converted_from,
         "I don't know any local variable called '%4'.");
 
@@ -2267,7 +2267,7 @@ of defined adjectives. So: adjectival_phrase *aph = Adjectives::parse(LW); if (aph) { if (Adjectives::Meanings::write_adjective_test_routine(VH, aph)) return; - Problems::Issue::unlocated_problem(Task::syntax_tree(), _p_(BelievedImpossible), + StandardProblems::unlocated_problem(Task::syntax_tree(), _p_(BelievedImpossible), "You tried to use '(+' and '+)' to expand to the Inform 6 routine " "address of an adjective, but it was an adjective with no meaning."); return; diff --git a/docs/core-module/25-cp.html b/docs/core-module/25-cp.html index a937a055a..2050c3b46 100644 --- a/docs/core-module/25-cp.html +++ b/docs/core-module/25-cp.html @@ -187,7 +187,7 @@ to us, so we end our routine with code which certainly performs a return. if (K) { if (Kinds::RunTime::emit_default_value_as_val(K, EMPTY_WORDING, "value decided by this phrase") != TRUE) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_DefaultDecideFails), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DefaultDecideFails), "it's not possible to decide such a value", "so this can't be allowed."); Produce::val(Emit::tree(), K_number, LITERAL_IVAL, 0); @@ -217,7 +217,7 @@ phrase to be different from the number version, and so on. return disallow_let_assignments; } -void Routines::Compile::code_block_outer(int statement_count, parse_node *pn) { +void Routines::Compile::code_block_outer(int statement_count, parse_node *pn) { Routines::Compile::code_block(statement_count, pn, TRUE); } @@ -370,7 +370,7 @@ henceforth to be true, so we simply compile empty code in that case. Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(cs)); if (Node::is(cs, TEST_VALUE_NT)) { - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadNow1)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadNow1)); Problems::issue_problem_segment( "You wrote %1, but although '%2' is a condition which it is legal " "to test with 'if', 'when', and so forth, it is not something I " @@ -379,14 +379,14 @@ henceforth to be true, so we simply compile empty code in that case. "need to adjust those circumstances."); Problems::issue_problem_end(); } else if (Node::is(cs, LOGICAL_AND_NT)) { - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadNow2)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadNow2)); Problems::issue_problem_segment( "You wrote %1, but 'now' does not work with the condition '%2' " "because it can only make one wish come true at a time: so it " "doesn't like the 'and'. Try rewriting as two 'now's in a row?"); Problems::issue_problem_end(); } else { - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadNow3)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadNow3)); Problems::issue_problem_segment( "You wrote %1, but '%2' isn't the sort of condition which can be " "made to be true, in the way that 'the ball is on the table' can be " @@ -402,7 +402,7 @@ henceforth to be true, so we simply compile empty code in that case. LOG("$T\n", current_sentence); Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(cs)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(...)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(...)); Problems::issue_problem_segment( "You wrote %1, but '%2' isn't a condition, so I can't see how to " "make it true from here on."); @@ -415,7 +415,7 @@ henceforth to be true, so we simply compile empty code in that case.
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, Node::get_text(cs));
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(...));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(...));
     Problems::issue_problem_segment(
         "You wrote %1, but '%2'	isn't an action, so I can't see how to try it.");
     Problems::issue_problem_end();
@@ -433,7 +433,7 @@ henceforth to be true, so we simply compile empty code in that case.
             (ram != RULE_NOT_IN_RULEBOOK_EFF)) {
             Problems::quote_source(1, current_sentence);
             Problems::quote_wording(2, Node::get_text(to_compile));
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_MisplacedRulebookOutcome2));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_MisplacedRulebookOutcome2));
             Problems::issue_problem_segment(
                 "You wrote %1, but this is a rulebook outcome which can only be used "
                 "within rulebooks which recognise it. You've used it in a definition "
@@ -446,7 +446,7 @@ henceforth to be true, so we simply compile empty code in that case.
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, Node::get_text(to_compile));
         Problems::quote_wording(3, rb->primary_name);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_MisplacedRulebookOutcome));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_MisplacedRulebookOutcome));
         Problems::issue_problem_segment(
             "You wrote %1, but this is a rulebook outcome which can only be used "
             "within rulebooks which recognise it. You've used it in a rule which "
@@ -541,7 +541,7 @@ henceforth to be true, so we simply compile empty code in that case.
                             if ((Node::get_kind_of_value(case_spec) == NULL) && (I == NULL)) {
                                 Problems::quote_source(1, current_sentence);
                                 Problems::quote_kind(2, switch_kind);
-                                Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_CaseValueNonConstant));
+                                StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_CaseValueNonConstant));
                                 Problems::issue_problem_segment(
                                     "The case %1 is required to be a constant value, rather than "
                                     "something which has different values at different times: "
@@ -552,7 +552,7 @@ henceforth to be true, so we simply compile empty code in that case.
                                 Problems::quote_source(1, current_sentence);
                                 Problems::quote_kind(2, case_kind);
                                 Problems::quote_kind(3, switch_kind);
-                                Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_CaseValueMismatch));
+                                StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_CaseValueMismatch));
                                 Problems::issue_problem_segment(
                                     "The case %1 has the wrong kind of value for the possibilities "
                                     "being chosen from: %2 instead of %3.");
@@ -587,7 +587,7 @@ henceforth to be true, so we simply compile empty code in that case.
                 current_sentence = A;
                 Problems::quote_source(1, A);
                 Problems::quote_spec(2, Node::get_evaluation(A));
-                Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_CaseValueDuplicated));
+                StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_CaseValueDuplicated));
                 Problems::issue_problem_segment(
                     "The case %1 occurs more than once in this 'if' switch.");
                 Problems::issue_problem_end();
@@ -698,7 +698,7 @@ the ceaseless repetition of the keyword "case". Thus, 
 
 
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CaseValueUnknown),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CaseValueUnknown),
         "I don't recognise this case value",
         "that is, the value written after the '--'.");
 
@@ -869,7 +869,7 @@ the "[if...]".
     int it_was_not_worth_adding = it_is_not_worth_adding;
-    it_is_not_worth_adding = TRUE;
+    Strings::TextSubstitutions::it_is_not_worth_adding();
 
     int SSP_sp = 0;
     int SSP_stack[MAX_COMPLEX_SAY_DEPTH];
@@ -1001,7 +1001,7 @@ the "[if...]".
     if (problem_issued == FALSE) {
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, Node::get_text(inv));
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ComplicatedSayStructure));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ComplicatedSayStructure));
         Problems::issue_problem_segment(
             "In the text at %1, the text substitution '[%2]' ought to occur as the "
             "middle part of its construction, but it appears to be on its own.");
@@ -1018,7 +1018,7 @@ the "[if...]".
     if (problem_issued == FALSE) {
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, Node::get_text(inv));
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ComplicatedSayStructure2));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ComplicatedSayStructure2));
         Problems::issue_problem_segment(
             "In the text at %1, the text substitution '[%2]' ought to occur as the "
             "ending part of its construction, but it appears to be on its own.");
@@ -1033,7 +1033,7 @@ the "[if...]".
 
 
     if (problem_issued == FALSE) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_SayIfNested),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_SayIfNested),
             "a second '[if ...]' text substitution occurs inside an existing one",
             "which makes this text too complicated. While a single text can contain "
             "more than one '[if ...]', this can only happen if the old if is finished "
@@ -1050,7 +1050,7 @@ the "[if...]".
 
 
     if (problem_issued == FALSE) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_SayOverComplex),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_SayOverComplex),
             "this is too complex a text substitution",
             "and needs to be simplified. You might find it helful to define "
             "a new text substitution of your own ('To say fiddly details: "
@@ -1064,7 +1064,7 @@ the "[if...]".
 
 
     if (problem_issued == FALSE) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_SayOtherwiseWithoutIf),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_SayOtherwiseWithoutIf),
             "an '[otherwise]' text substitution occurs where there appears to be no "
             "[if ...]",
             "which doesn't make sense - there is nothing for it to be otherwise to.");
@@ -1079,7 +1079,7 @@ the "[if...]".
     if (problem_issued == FALSE) {
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, Node::get_text(inv));
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ComplicatedSayStructure5));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ComplicatedSayStructure5));
         Problems::issue_problem_segment(
             "In the text at %1, the '[%2]' ought to occur inside an [if ...], but "
             "is cut off because it has been interleaved with a complicated say "
@@ -1095,7 +1095,7 @@ the "[if...]".
 
 
     if (problem_issued == FALSE) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TwoSayOtherwises),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TwoSayOtherwises),
             "there's already an (unconditional) \"[otherwise]\" or \"[else]\" "
             "in this text substitution",
             "so it doesn't make sense to follow that with a further one.");
@@ -1108,7 +1108,7 @@ the "[if...]".
 
 
     if (problem_issued == FALSE) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_SayEndIfWithoutSayIf),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_SayEndIfWithoutSayIf),
             "an '[end if]' text substitution occurs where there appears to be no "
             "[if ...]",
             "which doesn't make sense - there is nothing for it to end.");
@@ -1123,7 +1123,7 @@ the "[if...]".
     if (problem_issued == FALSE) {
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, Node::get_text(inv));
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ComplicatedSayStructure4));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ComplicatedSayStructure4));
         Problems::issue_problem_segment(
             "In the text at %1, the '[%2]' is cut off from its [if ...], because "
             "it has been interleaved with a complicated say construction.");
@@ -1148,7 +1148,7 @@ the "[if...]".
         if (stinv) {
             Problems::quote_source(1, current_sentence);
             Problems::quote_wording(2, Node::get_text(stinv));
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ComplicatedSayStructure3));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ComplicatedSayStructure3));
             Problems::issue_problem_segment(
                 "In the text at %1, the text substitution '[%2]' seems to start a "
                 "complicated say construction, but it doesn't have a matching end.");
diff --git a/docs/core-module/25-pi.html b/docs/core-module/25-pi.html
index eb27b0f96..70b3a63b0 100644
--- a/docs/core-module/25-pi.html
+++ b/docs/core-module/25-pi.html
@@ -166,7 +166,7 @@ the phrase under, and must make the actual registration.
 
 
     if (ph != last_phrase_where_rp_problemed) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_QuotedInPhrase),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_QuotedInPhrase),
             "phrases can't be defined with quoted text as part of the fixed wording",
             "so something like 'To go \"voluntarily\" to jail: ...' is not allowed.");
         last_phrase_where_rp_problemed = ph;
@@ -179,7 +179,7 @@ the phrase under, and must make the actual registration.
 
 
     if (ph != last_phrase_where_rp_problemed) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_AdjacentTokens),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_AdjacentTokens),
             "phrases can't be defined so that they have two bracketed varying elements "
             "immediately next to each other",
             "but instead need at least one fixed word in between. Thus 'To combine "
@@ -196,7 +196,7 @@ the phrase under, and must make the actual registration.
 
 
     if (ph != last_phrase_where_rp_problemed) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_MustBeOneWord),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_MustBeOneWord),
             "a 'To...' phrase must contain at least one fixed word",
             "that is, one word other than the bracketed variables. So a declaration "
             "like 'To (N - number): ...' is not allowed.");
@@ -312,7 +312,7 @@ word, though.)
     if ((Str::eq_wide_string(a_form, L"say")) &&
         (i == Wordings::first_wn(W)) && (phrase_mc != SAY_PHRASE_MC))
         if (ph != last_phrase_where_rp_problemed) {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_SaySlashed),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_SaySlashed),
                 "'say' is not allowed as the first word of a phrase",
                 "even when presented as one of a number of slashed alternatives. "
                 "(This is because 'say' is reserved for creating text substitutions.)");
@@ -424,7 +424,7 @@ register phrases with more than that number of tokens anyway.
         else internal_error("Unexpected production in phrase args");
     }
     if (no_tokens > MAX_TOKENS_PER_PHRASE)
-        Problems::Fatal::issue("MAX_TOKENS_PER_PHRASE exceeded");
+        Problems::fatal("MAX_TOKENS_PER_PHRASE exceeded");
 
  • This code is used in §4.

§4.2. As can be seen, the way we parse the token text depends on the context, diff --git a/docs/core-module/26-fc.html b/docs/core-module/26-fc.html index c90e5f98f..11d724464 100644 --- a/docs/core-module/26-fc.html +++ b/docs/core-module/26-fc.html @@ -200,7 +200,7 @@ Inform's own version number), but it belongs nowhere else either, so: int FundamentalConstants::veto_number(int X) { if (((X > 32767) || (X < -32768)) && (TargetVMs::is_16_bit(Task::vm()))) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LiteralOverflow), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LiteralOverflow), "you use a number which is too large", "at least with the Settings for this project as they currently " "are. (Change to Glulx to be allowed to use much larger numbers.)"); diff --git a/docs/core-module/26-i6i.html b/docs/core-module/26-i6i.html index d002f7e8b..cc789b5a6 100644 --- a/docs/core-module/26-i6i.html +++ b/docs/core-module/26-i6i.html @@ -153,7 +153,7 @@ though seasoned I6 hackers tend to reach for them a little sooner than that.

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_WhenDefiningUnknown),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_WhenDefiningUnknown),
         "I do not understand what definition you're referring to",
         "so I can't make an Inform 6 inclusion there.");
 
@@ -162,7 +162,7 @@ though seasoned I6 hackers tend to reach for them a little sooner than that.

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BeforeTheLibrary),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BeforeTheLibrary),
         "this syntax was withdrawn in January 2008",
         "in favour of a more finely controlled I6 inclusion command. The effect "
         "you want can probably be achieved by writing 'after \"Definitions.i6t\".' "
@@ -275,7 +275,7 @@ code instructions; we remember what's needed ourselves:
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadI6Inclusion),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadI6Inclusion),
         "this is not a form of I6 code inclusion I recognise",
         "because the clause at the end telling me where to put the code "
         "excerpt is not one of the possibilities I know. The clause can "
diff --git a/docs/core-module/26-iti.html b/docs/core-module/26-iti.html
index ba7dfabf4..5e2ebbc9a 100644
--- a/docs/core-module/26-iti.html
+++ b/docs/core-module/26-iti.html
@@ -198,14 +198,14 @@ file.
     if (Str::len(segment_name) > 0) {
         Input_File = NULL;
         WRITE_TO(STDERR, "inform: Unable to open segment <%S>\n", segment_name);
-        Problems::Issue::unlocated_problem(Task::syntax_tree(), _p_(BelievedImpossible),  or anyway not usefully testable
+        StandardProblems::unlocated_problem(Task::syntax_tree(), _p_(BelievedImpossible),  or anyway not usefully testable
             "I couldn't open a requested I6T segment: see the console "
             "output for details.");
     } else if (index_structure) {
         Input_File = Filenames::fopen(index_structure, "r");
         if (Input_File == NULL) {
             LOG("Filename was %f\n", index_structure);
-            Problems::Issue::unlocated_problem(Task::syntax_tree(), _p_(BelievedImpossible),  or anyway not usefully testable
+            StandardProblems::unlocated_problem(Task::syntax_tree(), _p_(BelievedImpossible),  or anyway not usefully testable
                 "I couldn't open the template file for the index.");
         }
     }
@@ -318,7 +318,7 @@ I6 code like so:
 
     LOG("command: <%S> argument: <%S>\n", command, argument);
     Problems::quote_stream(1, command);
-    Problems::Issue::unlocated_problem(Task::syntax_tree(), _p_(PM_TemplateError),
+    StandardProblems::unlocated_problem(Task::syntax_tree(), _p_(PM_TemplateError),
         "In an explicit Inform 6 code insertion, I recognise a few special "
         "notations in the form '{-command}'. This time, though, the unknown notation "
         "{-%1} has been used, and this is an error. (It seems very unlikely indeed "
@@ -392,7 +392,7 @@ using template-hacking there are a handful of cases that can't be avoided, so...
 
 void I6T::error(char *message) {
     Problems::quote_text(1, message);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(...));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(...));
     Problems::issue_problem_segment(
         "I ran into a mistake in a template file command: %1. The I6 "
         "template files (or .i6t files) are a very low-level part of Inform, "
diff --git a/docs/core-module/26-jl.html b/docs/core-module/26-jl.html
index e42036bb6..b8d62818d 100644
--- a/docs/core-module/26-jl.html
+++ b/docs/core-module/26-jl.html
@@ -105,7 +105,7 @@ reserves no memory.
 label_namespace *JumpLabels::new_namespace(text_stream *name, compilation_module *cm) {
     if (Str::len(name) > MAX_NAMESPACE_PREFIX_LENGTH) {
         #ifdef CORE_MODULE
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LabelNamespaceTooLong),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LabelNamespaceTooLong),
             "a label namespace prefix is too long",
             "and should be shortened to a few alphabetic characters.");
         #endif
diff --git a/docs/core-module/26-pl.html b/docs/core-module/26-pl.html
index 8ab8d3890..532059430 100644
--- a/docs/core-module/26-pl.html
+++ b/docs/core-module/26-pl.html
@@ -352,7 +352,7 @@ with the following.
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(Untestable),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(Untestable),
         "the core of the Inform language cannot be removed",
         "because then what should we do? What should we ever do?");
     return;
diff --git a/docs/core-module/26-rt.html b/docs/core-module/26-rt.html
index 29c44f0cb..5889c5f8c 100644
--- a/docs/core-module/26-rt.html
+++ b/docs/core-module/26-rt.html
@@ -75,7 +75,7 @@ already been set up, or not. Here's not:
 

-packaging_state Routines::begin(inter_name *name) {
+packaging_state Routines::begin(inter_name *name) {
     return Routines::begin_framed(name, NULL);
 }
 
@@ -134,7 +134,7 @@ did not.

-void Routines::end(packaging_state save) {
+void Routines::end(packaging_state save) {
     kind *R_kind = LocalVariables::deduced_function_kind(currently_compiling_in_frame);
 
     inter_name *kernel_name = NULL, *public_name = currently_compiling_iname;
@@ -286,7 +286,7 @@ after the call parameters, and is used only as a scratch variable.
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TooManyLocals),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TooManyLocals),
         "there are too many temporarily-named values in this phrase",
         "which may be a sign that it is complicated enough to need breaking up "
         "into smaller phrases making use of each other. "
diff --git a/docs/core-module/26-ts.html b/docs/core-module/26-ts.html
index 1818a7810..29b8d44c8 100644
--- a/docs/core-module/26-ts.html
+++ b/docs/core-module/26-ts.html
@@ -253,7 +253,7 @@ without notice.
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TestBadRequirements),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TestBadRequirements),
         "I didn't recognise the requirements for this test scenario",
         "which should be 'test ... with ... in ...' or '... "
         "holding ...'");
@@ -264,7 +264,7 @@ without notice.
 
 
     *X = FALSE;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TestQuoted),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TestQuoted),
         "test scenarios must have unquoted names",
         "so 'test garden with ...' is allowed but not 'test \"garden\" with...'");
 
@@ -274,7 +274,7 @@ without notice.
     *X = FALSE;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TestMultiWord),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TestMultiWord),
         "test scenarios must have single-word names",
         "so 'test garden with ...' is allowed but not 'test garden gate with...'");
 
@@ -284,7 +284,7 @@ without notice.
     *X = NO_INTT;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnknownInternalTest),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnknownInternalTest),
         "that's an internal test case which I don't know",
         "so I am taking no action.");
 
@@ -293,7 +293,7 @@ without notice.

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TestDoubleWith),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TestDoubleWith),
         "the second 'with' should be 'holding'",
         "as in 'test frogs with \"get frogs\" holding net' rather than "
         "'test frogs with \"get frogs\" with net'.");
@@ -342,7 +342,7 @@ without notice.
         if (Wordings::match(XW, test->name)) {
             Problems::quote_source(1, test->sentence_test_declared_at);
             Problems::quote_source(2, current_sentence);
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TestDuplicate));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TestDuplicate));
             Problems::issue_problem_segment(
                 "Two test scripts have been set up with the same name: "
                 "%1 and %2.");
@@ -370,7 +370,7 @@ without notice.
 
 void PL::Parsing::TestScripts::check_test_command(text_stream *p) {
     if (Str::eq_wide_string(p, L"undo")) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TestContainsUndo),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TestContainsUndo),
             "this test script contains an UNDO command",
             "which the story file has no way to automate the running of. "
             "(An UNDO is such a complete reversion to the previous state "
@@ -379,7 +379,7 @@ without notice.
         return;
     }
     if (Str::len(p) > MAX_LENGTH_OF_COMMAND) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TestCommandTooLong),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TestCommandTooLong),
             "this test script contains a command which is too long",
             "and cannot be fed into Inform for automatic testing. "
             "(The format for a test script is a sequence of commands, "
diff --git a/docs/core-module/26-tti.html b/docs/core-module/26-tti.html
index 87d779c28..efe3f3c28 100644
--- a/docs/core-module/26-tti.html
+++ b/docs/core-module/26-tti.html
@@ -113,7 +113,7 @@ such as "The yourself object" in
 
 
     *X = INVALID_I6TR;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TranslatedUnknownCategory),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TranslatedUnknownCategory),
         "that isn't one of the things which can be translated to I6",
         "and should be '... variable', '... property', '... object', "
         "'... kind', '... rule', or '... action'. For instance, 'The yourself "
@@ -190,7 +190,7 @@ traversing the parse tree to look for translation sentences of the right sort.
     else responses_list = <<rp>>;
     if (valid) Dequote it and see if it's valid5.2.1;
     if (valid == FALSE) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TranslatedToNonIdentifier),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TranslatedToNonIdentifier),
             "Inform 7 constructions can only translate into quoted I6 identifiers",
             "which must be strings of 1 to 31 characters drawn from 1, 2, ..., 9, "
             "a or A, b or B, ..., z or Z, or underscore '_', except that the "
@@ -234,7 +234,7 @@ traversing the parse tree to look for translation sentences of the right sort.
                 code, Node::get_text(p), NULL, TRUE);
             Rules::now_rule_defines_response(R, code, resp);
         } else {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_I6ResponsesAwry),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_I6ResponsesAwry),
                 "additional information about I6 translation of a rule can "
                 "only take the form of a list of responses",
                 "each quoted and followed by a bracketed letter.");
diff --git a/docs/core-module/26-uo.html b/docs/core-module/26-uo.html
index 8be8f7c71..3c7af2b32 100644
--- a/docs/core-module/26-uo.html
+++ b/docs/core-module/26-uo.html
@@ -199,7 +199,7 @@ by hand with a sentence in the source text.
 
 
     *X = FALSE;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UseTranslatesNotI6),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UseTranslatesNotI6),
         "that translates into something which isn't a simple I6 inclusion",
         "placed in '(-' and '-)' markers.");
 
@@ -330,7 +330,7 @@ there is no need to translate this to other languages.) else if (<use-sentence-object>(Node::get_text(p))) Set the option given in this word range11.1; if (traverse == 1) return; LOG("Used: %W\n", Node::get_text(p)); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnknownUseOption), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnknownUseOption), "that isn't a 'Use' option known to me", "and needs to be one of the ones listed in the documentation."); } @@ -384,7 +384,7 @@ there is no need to translate this to other languages.)
     if (uo->minimum_setting_value == -1) {
         if (min_setting != -1)
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UONotNumerical),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UONotNumerical),
                 "that 'Use' option does not have a numerical setting",
                 "but is either used or not used.");
     } else {
@@ -401,7 +401,7 @@ there is no need to translate this to other languages.)
     TEMPORARY_TEXT(new_identifier);
     WRITE_TO(new_identifier, "%+W", Wordings::one_word(w1));
     if (Str::len(new_identifier) > 63) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadICLIdentifier),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadICLIdentifier),
             "that is too long to be an ICL identifier",
             "so can't be the name of any I6 memory setting.");
     }
diff --git a/docs/core-module/27-cm.html b/docs/core-module/27-cm.html
index abd2239e8..67dfc515d 100644
--- a/docs/core-module/27-cm.html
+++ b/docs/core-module/27-cm.html
@@ -194,11 +194,11 @@ a concept of "current sentence".
 
 compilation_module *current_CM = NULL;
 
-compilation_module *Modules::current(void) {
+compilation_module *Modules::current(void) {
     return current_CM;
 }
 
-void Modules::set_current_to(compilation_module *CM) {
+void Modules::set_current_to(compilation_module *CM) {
     current_CM = CM;
 }
 
diff --git a/docs/core-module/27-em.html b/docs/core-module/27-em.html
index 858a86107..023a2ad32 100644
--- a/docs/core-module/27-em.html
+++ b/docs/core-module/27-em.html
@@ -78,7 +78,7 @@ function togglePopup(material_id) {
 
 inter_tree *I7_generation_tree = NULL;
 
-inter_tree *Emit::tree(void) {
+inter_tree *Emit::tree(void) {
     return I7_generation_tree;
 }
 
@@ -497,7 +497,7 @@ insert them into the Inter stream close to the top.
     return save;
 }
 
-packaging_state Emit::named_array_begin(inter_name *N, kind *K) {
+packaging_state Emit::named_array_begin(inter_name *N, kind *K) {
     packaging_state save = Packaging::enter_home_of(N);
     inter_symbol *symb = Produce::define_symbol(N);
     Emit::push_array();
@@ -507,7 +507,7 @@ insert them into the Inter stream close to the top.
     return save;
 }
 
-void Emit::array_iname_entry(inter_name *iname) {
+void Emit::array_iname_entry(inter_name *iname) {
     if (current_A == NULL) internal_error("entry outside of inter array");
     inter_symbol *alias;
     if (iname == NULL) alias = Site::veneer_symbol(Emit::tree(), NOTHING_VSYMB);
@@ -581,7 +581,7 @@ insert them into the Inter stream close to the top.
     return IBM;
 }
 
-void Emit::array_end(packaging_state save) {
+void Emit::array_end(packaging_state save) {
     if (current_A == NULL) internal_error("inter array not opened");
     inter_symbol *con_name = current_A->array_name_symbol;
     inter_bookmark *IBM = Packaging::at(Emit::tree());
@@ -727,7 +727,7 @@ insert them into the Inter stream close to the top.
     Produce::guard(Inter::Link::new(Packaging::at(Emit::tree()), (inter_t) stage, ID1, ID2, ID3, ID4, ref, Produce::baseline(Packaging::at(Emit::tree())), NULL));
 }
 
-
  • The structure dval_written is private to this section.
  • The structure nascent_array is accessed in 5/lp, 5/un, 7/ns, 7/oaf, 7/rs, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/aots, 10/teav, 10/varc, 10/cap, 11/bas, 11/tc, 11/sc, 11/sm, 12/dtd, 14/sp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 17/ts, 18/lc, 19/tb, 19/rsft, 19/tod, 21/rl, 21/rl2, 21/rps, 21/ac, 22/cs, 22/ph, 23/ad, 24/lv, 24/ch, 25/in, 25/pi, 25/cp, 26/uo, 26/tti, 27/cm and here.
+
  • The structure dval_written is private to this section.
  • The structure nascent_array is accessed in 2/up, 5/lp, 5/un, 7/ns, 7/oaf, 7/rs, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/aots, 10/teav, 10/varc, 10/cap, 11/bas, 11/tc, 11/sc, 11/sm, 12/dtd, 14/sp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 17/ts, 18/lc, 19/tb, 19/rsft, 19/tod, 21/rl, 21/rl2, 21/rps, 21/ac, 22/cs, 22/ph, 23/ad, 24/lv, 24/ch, 25/in, 25/pi, 25/cp, 26/uo, 26/tti, 27/cm and here.

§4.

diff --git a/docs/core-module/27-hr.html b/docs/core-module/27-hr.html
index f7b6cd507..00dba67c8 100644
--- a/docs/core-module/27-hr.html
+++ b/docs/core-module/27-hr.html
@@ -1718,7 +1718,7 @@ function togglePopup(material_id) {
 

§4.

-inter_name *Hierarchy::find(int id) {
+inter_name *Hierarchy::find(int id) {
     return HierarchyLocations::find(Emit::tree(), id);
 }
 
diff --git a/docs/core-module/3-nl.html b/docs/core-module/3-nl.html
index 99126edbd..8c5527165 100644
--- a/docs/core-module/3-nl.html
+++ b/docs/core-module/3-nl.html
@@ -177,7 +177,7 @@ this because we need access to it very quickly when parsing text substitutions.)
     else
         Problems::quote_wide_text(1, Vocabulary::get_exemplar(nt->nonterminal_id, FALSE));
     Problems::quote_text(2, message);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(Untestable));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(Untestable));
     if (WordAssemblages::nonempty(base_text)) {
         Problems::quote_wa(5, &base_text);
         Problems::issue_problem_segment(
diff --git a/docs/core-module/3-pd.html b/docs/core-module/3-pd.html
index 9a906efdc..601e3b7eb 100644
--- a/docs/core-module/3-pd.html
+++ b/docs/core-module/3-pd.html
@@ -121,7 +121,7 @@ text anyway, so the following problem messages are not too gratuitous.
 
     LOOP_THROUGH_WORDING(i, S)
         if (Vocabulary::test_flags(i, TEXT_MC+TEXTWITHSUBS_MC)) {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PluralOfQuoted),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PluralOfQuoted),
                 "declares a plural for a phrase containing quoted text",
                 "which is forbidden. Sentences like this are supposed to "
                 "declare plurals without quotation marks: for instance, "
@@ -130,7 +130,7 @@ text anyway, so the following problem messages are not too gratuitous.
         }
     LOOP_THROUGH_WORDING(i, P)
         if (Vocabulary::test_flags(i, TEXT_MC+TEXTWITHSUBS_MC)) {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PluralIsQuoted),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PluralIsQuoted),
                 "declares a plural for a phrase using quoted text",
                 "which is forbidden. Sentences like this are supposed to "
                 "declare plurals without quotation marks: for instance, "
diff --git a/docs/core-module/4-am.html b/docs/core-module/4-am.html
index 16d231451..83168b842 100644
--- a/docs/core-module/4-am.html
+++ b/docs/core-module/4-am.html
@@ -381,7 +381,7 @@ early in the run when sorting cannot yet be done.
     if (problem_count == 0) {
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, Clusters::get_name(aph->adjective_names, FALSE));
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_AdjectiveCircular));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_AdjectiveCircular));
         Problems::issue_problem_segment(
             "In the sentence %1, it looks as if the definition of the adjective "
             "'%2' may be circular.");
@@ -762,7 +762,7 @@ can't be avoided.
 
     if ((early) || (am->problems_thrown++ > 0)) return;
     current_sentence = am->defined_at;
-    Problems::Issue::adjective_problem(Task::syntax_tree(), _p_(PM_AdjDomainUnknown),
+    StandardProblems::adjective_problem(Task::syntax_tree(), _p_(PM_AdjDomainUnknown),
         am->adjective_index_text, am->domain_text,
         "this isn't a thing, a kind of thing or a kind of value",
         "and indeed doesn't have any meaning I can make sense of.");
@@ -775,7 +775,7 @@ can't be avoided.
 
     if ((early) || (am->problems_thrown++ > 0)) return;
     current_sentence = am->defined_at;
-    Problems::Issue::adjective_problem(Task::syntax_tree(), _p_(PM_AdjDomainVague),
+    StandardProblems::adjective_problem(Task::syntax_tree(), _p_(PM_AdjDomainVague),
         am->adjective_index_text, am->domain_text,
         "this isn't allowed as the domain of a definition",
         "since it potentially describes many different kinds, not just one.");
@@ -788,7 +788,7 @@ can't be avoided.
 
     if ((early) || (am->problems_thrown++ > 0)) return;
     current_sentence = am->defined_at;
-    Problems::Issue::adjective_problem(Task::syntax_tree(), _p_(PM_AdjDomainTopic),
+    StandardProblems::adjective_problem(Task::syntax_tree(), _p_(PM_AdjDomainTopic),
         am->adjective_index_text, am->domain_text,
         "this isn't allowed as the domain of a definition",
         "because 'topic' doesn't behave the way other kinds of value do when "
@@ -808,7 +808,7 @@ can't be avoided.
         (Rvalues::to_instance(supplied) == NULL)) {
         if ((early) || (am->problems_thrown++ > 0)) return;
         current_sentence = am->defined_at;
-        Problems::Issue::adjective_problem(Task::syntax_tree(), _p_(PM_AdjDomainSurreal),
+        StandardProblems::adjective_problem(Task::syntax_tree(), _p_(PM_AdjDomainSurreal),
             am->adjective_index_text, am->domain_text,
             "this isn't allowed as the domain of a definition",
             "since adjectives like this can be applied only to specific things, "
@@ -830,7 +830,7 @@ can't be avoided.
     if (Descriptions::is_qualified(supplied)) {
         if (am->problems_thrown++ > 0) return;
         current_sentence = am->defined_at;
-        Problems::Issue::adjective_problem(Task::syntax_tree(), _p_(PM_AdjDomainSlippery),
+        StandardProblems::adjective_problem(Task::syntax_tree(), _p_(PM_AdjDomainSlippery),
             am->adjective_index_text, am->domain_text,
             "this is slippery",
             "because it can change during play. Definitions can only be "
@@ -929,7 +929,7 @@ author's source text.)
             current_sentence = am1->defined_at;
             Problems::quote_wording_as_source(1, am1->adjective_index_text);
             Problems::quote_wording_as_source(2, am2->adjective_index_text);
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_AdjDomainDuplicated));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_AdjDomainDuplicated));
             Problems::issue_problem_segment(
                 "The definitions %1 and %2 both try to cover the same situation: "
                 "the same adjective applied to the exact same range. %P"
diff --git a/docs/core-module/5-ins.html b/docs/core-module/5-ins.html
index d487b34fc..6c976e30f 100644
--- a/docs/core-module/5-ins.html
+++ b/docs/core-module/5-ins.html
@@ -585,7 +585,7 @@ are allowed to refine it. Such revisions are allowed to specialise the kind
         Problems::quote_source(2, I->instance_of_set_at);
         Problems::quote_kind(3, new);
         Problems::quote_kind(4, existing);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_KindsIncompatible));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_KindsIncompatible));
         Problems::issue_problem_segment(
             "You wrote %1, but that seems to contradict %2, as %3 and %4 "
             "are incompatible. (If %3 were a kind of %4 or vice versa "
@@ -596,7 +596,7 @@ are allowed to refine it. Such revisions are allowed to specialise the kind
         Problems::quote_object(2, I);
         Problems::quote_kind(3, new);
         Problems::quote_kind(4, existing);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
         Problems::issue_problem_segment(
             "You wrote %1, which made me think the kind of %2 was %4, "
             "but for other reasons I now think it ought to be %3, and those "
diff --git a/docs/core-module/5-lp.html b/docs/core-module/5-lp.html
index 47cfb2d70..bf1ff3474 100644
--- a/docs/core-module/5-lp.html
+++ b/docs/core-module/5-lp.html
@@ -381,7 +381,7 @@ equivalent to an exact value.
     if ((TargetVMs::is_16_bit(Task::vm())) && (PM_ZMachineOverflow2_issued == FALSE))
         for (lp = list_head; lp; lp = lp->next_for_this_kind)
             if (Kinds::Scalings::quantum(lp->scaling) > 32767) {
-                Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ZMachineOverflow2),
+                StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ZMachineOverflow2),
                     "you've set up literal specifications needing a range of "
                     "values too broad to be stored at run-time",
                     "at least with the Settings for this project as they currently are. "
@@ -742,7 +742,7 @@ which is annoying. So we have a mechanism to suppress duplicates:
     if (Kinds::FloatingPoint::uses_floating_point(lp->kind_specified) == FALSE) {
         if (sign_used_at->element_index != 0) {
             ISSUING_LP_PROBLEM;
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NegationInternal),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NegationInternal),
                 "a negative number can't be used in the middle of a constant",
                 "and the minus sign makes it look as if that's what you are "
                 "trying here.");
@@ -750,7 +750,7 @@ which is annoying. So we have a mechanism to suppress duplicates:
         }
         if (lp->number_signed == FALSE) {
             ISSUING_LP_PROBLEM;
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NegationForbidden),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NegationForbidden),
                 "the minus sign is not allowed here",
                 "since this is a kind of value which only allows positive "
                 "values to be written.");
@@ -768,7 +768,7 @@ which is annoying. So we have a mechanism to suppress duplicates:
 
     if (overflow_32_bit_flag) {
         ISSUING_LP_PROBLEM;
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_EvenOverflow-G),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_EvenOverflow-G),
             "you use a literal specification to make a value which is too large",
             "even for a story file compiled with the Glulx setting. (You can "
             "see the size limits for each way of writing a value on the Kinds "
@@ -777,7 +777,7 @@ which is annoying. So we have a mechanism to suppress duplicates:
     }
     if ((overflow_16_bit_flag) && (TargetVMs::is_16_bit(Task::vm()))) {
         ISSUING_LP_PROBLEM;
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ZMachineOverflow),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ZMachineOverflow),
             "you use a literal specification to make a value which is too large",
             "at least with the Settings for this project as they currently are. "
             "(Change to Glulx to be allowed to use much larger numbers; "
@@ -812,7 +812,7 @@ which is annoying. So we have a mechanism to suppress duplicates:
         case 9: Problems::quote_text(5, "tenth"); break;
         default: Problems::quote_text(5, "eventual"); break;
     }
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ElementOverflow));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ElementOverflow));
     Problems::issue_problem_segment(
         "In the sentence %1, you use the notation '%2' to write a constant value. "
         "But the notation was specified as '%3', which means that the %5 numerical "
@@ -828,7 +828,7 @@ which is annoying. So we have a mechanism to suppress duplicates:
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, W);
     Problems::quote_wording(3, lp->prototype_text);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_LPTooLittleAccuracy));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_LPTooLittleAccuracy));
     Problems::issue_problem_segment(
         "In the sentence %1, you use the notation '%2' to write a constant value. "
         "But to store that, I would need greater accuracy than this kind of "
@@ -2843,7 +2843,7 @@ of alternatives each of which matches the following:
 
     *X = ABANDON_LPN; *XP = NULL;
     if (preform_lookahead_mode == FALSE) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_MultiplyingNonKOVs),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_MultiplyingNonKOVs),
             "only kinds of value can be multiplied here",
             "and only in a sentence like 'A length times a length specifies an area.'");
     }
@@ -2857,7 +2857,7 @@ of alternatives each of which matches the following:
     if (preform_lookahead_mode == FALSE) {
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, W);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadLPNameOption));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadLPNameOption));
         Problems::issue_problem_segment(
             "In the specification %1, I was expecting that '%2' would be an optional "
             "note about one of the notations: it should have been one of 'singular', "
@@ -2915,7 +2915,7 @@ can't set both scaling and an equivalent, for instance.
 
 
     if (preform_lookahead_mode == FALSE) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LPNotKOV),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LPNotKOV),
             "you can only specify ways to write kinds of value",
             "as created with sentences like 'A weight is a kind of value.'");
     }
@@ -2967,7 +2967,7 @@ by a bracketed list of up to three options in any order.
     if (preform_lookahead_mode == FALSE) {
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, W);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadLPPartOption));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadLPPartOption));
         Problems::issue_problem_segment(
             "In the specification %1, I was expecting that '%2' would be an optional "
             "note about one of the parts: it should have been one of 'optional', "
@@ -2987,7 +2987,7 @@ by a bracketed list of up to three options in any order.
         if (Rvalues::is_CONSTANT_of_kind(LP_equivalent_value, K)) {
             scaled_dir = LP_SCALED_UP; scaled = Rvalues::to_encoded_notation(LP_equivalent_value);
         } else {
-            Problems::Issue::sentence_problem_with_note(Task::syntax_tree(), _p_(PM_BadLPEquivalent),
+            StandardProblems::sentence_problem_with_note(Task::syntax_tree(), _p_(PM_BadLPEquivalent),
                 "the equivalent value needs to be a constant of the same kind "
                 "of value as you are specifying",
                 "and this seems not to be.",
@@ -3000,7 +3000,7 @@ by a bracketed list of up to three options in any order.
         if (Rvalues::is_CONSTANT_of_kind(LP_offset_value, K)) {
             offset = Rvalues::to_encoded_notation(LP_offset_value);
         } else {
-            Problems::Issue::sentence_problem_with_note(Task::syntax_tree(), _p_(PM_BadLPOffset),
+            StandardProblems::sentence_problem_with_note(Task::syntax_tree(), _p_(PM_BadLPOffset),
                 "the offset value needs to be a constant of the same kind "
                 "of value as you are specifying",
                 "and this seems not to be.",
@@ -3037,7 +3037,7 @@ does not throw a problem message as being a bar which is out of range
         Problems::quote_source(1, current_sentence);
         Problems::quote_kind(2, K);
         Problems::quote_wording(3, SPW);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_DuplicateUnitSpec));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_DuplicateUnitSpec));
         Problems::issue_problem_segment(
             "In the sentence %1, it looks as if you intend to give a new meaning "
             "to expressions like '%3', but this is already something I "
@@ -3054,7 +3054,7 @@ does not throw a problem message as being a bar which is out of range
 
     Problems::quote_source(1, current_sentence);
     Problems::quote_kind(2, K);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_LPNeedsReal));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_LPNeedsReal));
     Problems::issue_problem_segment(
         "In the sentence %1, it looks as if you intend to give a real "
         "number as a scale factor for values of %2. However, as you've "
@@ -3089,21 +3089,21 @@ after itself.
 
     if (Kinds::Behaviour::is_built_in(K)) {
         if (Kinds::Behaviour::get_index_priority(K) == 0)
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LPBuiltInKOVHidden),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LPBuiltInKOVHidden),
                 "you can only specify ways to write new kinds of value",
                 "as created with sentences like 'A weight is a kind of value.', "
                 "and not the built-in ones like 'number' or 'time'. (This one is "
                 "a kind used behind the scenes by Inform, so it's reserved "
                 "for Inform's own use, and you can't do much else with it.)");
         else
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LPBuiltInKOV),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LPBuiltInKOV),
                 "you can only specify ways to write new kinds of value",
                 "as created with sentences like 'A weight is a kind of value.', "
                 "and not the built-in ones like 'number' or 'time'.");
         return owner;
     }
     if (Kinds::Behaviour::convert_to_unit(Task::syntax_tree(), K) == FALSE) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LPEnumeration),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LPEnumeration),
             "this is a kind of value which already has named values",
             "so it can't have a basically numerical form as well.");
         return owner;
@@ -3120,7 +3120,7 @@ after itself.
     lp = LiteralPatterns::lp_new(K, SPW);
     if (LP_equivalent_value) LP_real_scaling_amount = LP_real_equivalent;
     if (scaled <= 0) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LPNonpositiveScaling),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LPNonpositiveScaling),
             "you can only scale by a positive multiple",
             "so something like 'scaled up by -1' is not allowed.");
         scaled = 1;
@@ -3164,7 +3164,7 @@ alphabetic vs numeric pieces of a word:
     lp->no_lp_tokens = tc;
     lp->no_lp_elements = ec;
     if (lp->no_lp_elements == 0) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LPWithoutElement),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LPWithoutElement),
             "a way to specify a kind of value must involve numbers",
             "so '10kg specifies a weight' is allowed, but not 'tonne "
             "specifies a weight'.");
@@ -3190,7 +3190,7 @@ hold — so we need not fool around with long long ints.
         while (Characters::isdigit(text_of_word[j++])) {
             digit_found = TRUE;
             if (tot > 999999999) {
-                Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LPElementTooLarge),
+                StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LPElementTooLarge),
                     "that specification contains numbers that are too large",
                     "and would construct values which could not sensibly "
                     "be stored at run-time.");
@@ -3205,7 +3205,7 @@ hold — so we need not fool around with long long ints.
         if (digit_found) {
             literal_pattern_element new_element = LiteralPatterns::lpe_new(ec, tot+1, sgn);
             if (ec >= MAX_ELEMENTS_PER_LITERAL) {
-                Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LPTooManyElements),
+                StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LPTooManyElements),
                     "that specification contains too many numerical elements",
                     "and is too complicated for Inform to handle.");
                 return owner;
@@ -3238,7 +3238,7 @@ not really distort matters.
 
 
     if (tc >= MAX_TOKENS_PER_LITERAL) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LPTooComplicated),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LPTooComplicated),
             "that specification is too complicated",
             "and will have to be shortened.");
         return owner;
@@ -3292,20 +3292,20 @@ this is deferred until all elements exist, at which point we —
         }
         if (O & WITHOUT_LEADING_ZEROS_LSO) lpe->without_leading_zeros = TRUE;
         if ((i == lp->no_lp_elements - 1) && (p->next)) {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LPTooManyPartNames),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LPTooManyPartNames),
                 "this gives names for too many parts",
                 "that is, for more parts than there are in the pattern.");
             return owner;
         }
         for (int j = 0; j<i; j++)
             if (Wordings::match(lp->lp_elements[i].element_name, lp->lp_elements[j].element_name))
-                Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LPRepeatedPartNames),
+                StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LPRepeatedPartNames),
                     "this repeats a part name",
                     "that is, it uses the same name for two different parts "
                     "of the pattern.");
     }
     if ((i > 0) && (i != lp->no_lp_elements)) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LPNotAllNamed),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LPNotAllNamed),
             "you must supply names for all the parts",
             "if for any");
         return owner;
@@ -3324,14 +3324,14 @@ optional, and it must not be the first.
     for (i=0; i<lp->no_lp_elements; i++) if (lp->lp_elements[i].element_optional) {
         opt_count++;
         if (i == 0) {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LPFirstOptional),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LPFirstOptional),
                 "the first part is not allowed to be optional",
                 "since it is needed to identify the value.");
             return owner;
         }
     }
     if (opt_count >= 2) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LPMultipleOptional),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LPMultipleOptional),
             "only one part can be called optional",
             "since if any part is omitted then so are all subsequent parts.");
         return owner;
@@ -3582,7 +3582,7 @@ For instance, the dollars-and-cents example compiles:
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LPPartNamesTooLong),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LPPartNamesTooLong),
         "the names for these parts are too long",
         "and will have to be cut down.");
 
diff --git a/docs/core-module/5-nv.html b/docs/core-module/5-nv.html index 3f32fd05e..3b823de98 100644 --- a/docs/core-module/5-nv.html +++ b/docs/core-module/5-nv.html @@ -189,7 +189,7 @@ reference to how it's stored at run-time.
     Problems::quote_wording(1, W);
     Problems::quote_kind(2, K);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_IndefiniteVariable));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_IndefiniteVariable));
     Problems::issue_problem_segment(
         "I am unable to create the variable '%1', because its kind (%2) is too "
         "vague. I need to know exactly what kind of value goes into each "
@@ -288,13 +288,13 @@ variable should hold it:
     nonlocal_variable *nlv = NonlocalVariables::parse(W);
     if ((nlv == NULL) || (nlv->scope)) {
         LOG("Tried %W\n", W);
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NonQuantityTranslated),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NonQuantityTranslated),
             "this is not the name of a variable",
             "or at any rate not one global in scope.");
         return;
     }
     if (nlv->nlv_name_translated) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_QuantityTranslatedAlready),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_QuantityTranslatedAlready),
             "this variable has already been translated",
             "so there must be some duplication somewhere.");
         return;
@@ -415,7 +415,7 @@ run-time locations to any variable without them:
 
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, nlv->name);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
     Problems::issue_problem_segment(
         "The sentence %1 seems to need the value '%2', but that currently "
         "has no definition.");
@@ -462,7 +462,7 @@ I6 schema for how to change a variable:
     #ifdef IF_MODULE
     if ((score_VAR) && (nlv == score_VAR)) {
         if ((scoring_option_set == FALSE) || (scoring_option_set == NOT_APPLICABLE)) {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantChangeScore),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantChangeScore),
                 "this is a story with no scoring",
                 "so it makes no sense to change the 'score' value. You can add "
                 "scoring to the story by including the sentence 'Use scoring.', "
@@ -592,7 +592,7 @@ that faraway I6 code said it was.
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, nlv->name);
     Problems::quote_stream(3, nlv->lvalue_nve.textual_form);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_InaccessibleVariable));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_InaccessibleVariable));
     Problems::issue_problem_segment(
         "The sentence %1 tells me that '%2' has a specific initial value, "
         "but this is a variable which has been translated into an I6 'Global' "
@@ -747,7 +747,7 @@ means that a value can be set by an assertion in the source text.
 
 int NonlocalVariables::must_be_constant(nonlocal_variable *nlv) {
     if (nlv->constant_at_run_time) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantChangeConstants),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantChangeConstants),
             "this is a name for a value which never changes during the story",
             "so it can't be altered with 'now'.");
         return TRUE;
@@ -772,7 +772,7 @@ and leaving everything else alone.
                 Problems::quote_source(1, current_sentence);
                 Problems::quote_wording(2, nlv->name);
                 Problems::quote_kind(3, nlv->nlv_kind);
-                Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_MeaningRecursive));
+                StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_MeaningRecursive));
                 Problems::issue_problem_segment(
                     "The sentence %1 tells me that '%2', which should be %3 "
                     "that varies, is to have an initial value which can't "
@@ -873,7 +873,7 @@ which makes its kind safe. Hence the error messages.
             wording W = Kinds::Behaviour::get_name(nlv->nlv_kind, FALSE);
             Problems::quote_wording(1, nlv->name);
             Problems::quote_wording(2, W);
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_EmptyDataType));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_EmptyDataType));
             Problems::issue_problem_segment(
                 "I am unable to put any value into the variable '%1', because "
                 "%2 is a kind of value with no actual values.");
@@ -893,7 +893,7 @@ which makes its kind safe. Hence the error messages.
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, nlv->name);
         Problems::quote_kind(3, nlv->nlv_kind);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_InitialiseQ2));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_InitialiseQ2));
         Problems::issue_problem_segment(
             "The sentence %1 tells me that '%2', which should be %3 "
             "that varies, is to have an initial value equal to itself - "
@@ -906,7 +906,7 @@ which makes its kind safe. Hence the error messages.
         Problems::quote_kind(3, nlv->nlv_kind);
         Problems::quote_wording(4, the_other->name);
         Problems::quote_kind(5, the_other->nlv_kind);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_InitialiseQ1));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_InitialiseQ1));
         Problems::issue_problem_segment(
             "The sentence %1 tells me that '%2', which should be %3 "
             "that varies, is to have an initial value equal to '%4', "
diff --git a/docs/core-module/5-tod.html b/docs/core-module/5-tod.html
index 42c76299e..221f3166e 100644
--- a/docs/core-module/5-tod.html
+++ b/docs/core-module/5-tod.html
@@ -253,7 +253,7 @@ a specific time of day, or when a named event occurs.
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_AtTimeThat),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_AtTimeThat),
         "this seems to use 'that' where it should use 'when'",
         "assuming it's trying to apply a rule to an event. (The convention is "
         "that any rule beginning 'At' is a timed one. The time can either be a "
@@ -265,7 +265,7 @@ a specific time of day, or when a named event occurs.
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_AtWithoutTime),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_AtWithoutTime),
         "'at' what time? No description of a time is given",
         "which means that this rule can never have effect. (The convention is "
         "that any rule beginning 'At' is a timed one. The time can either be a "
diff --git a/docs/core-module/5-uem.html b/docs/core-module/5-uem.html
index 21dfe9104..889b67611 100644
--- a/docs/core-module/5-uem.html
+++ b/docs/core-module/5-uem.html
@@ -139,7 +139,7 @@ following. (The six highest bits are defined in the void UseExcerptMeanings::linguistics_problem_handler(int err_no, wording W, void *ref, int k) {
     switch (err_no) {
         case TooLongName_LINERROR:
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TooLongName),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TooLongName),
                 "that seems to involve far too long a name",
                 "since in general names are limited to a maximum of 32 words.");
             break;
diff --git a/docs/core-module/5-un.html b/docs/core-module/5-un.html
index 9843ae664..0da5131e4 100644
--- a/docs/core-module/5-un.html
+++ b/docs/core-module/5-un.html
@@ -151,7 +151,7 @@ instance, the Standard Rules want the player-character object to be called
             DISCARD_TEXT(i6r);
         }
     } else {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadObjectTranslation),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadObjectTranslation),
             "there is no such object or kind of object",
             "so its name will never be translated into an I6 Object or Class identifier "
             "in any event.");
@@ -186,14 +186,14 @@ and is a somewhat provisional feature for now.
     int g = Annotations::read_int(pn->next->next, gender_reference_ANNOT);
     if (nl == NULL) internal_error("No such NL");
     if (nl == English_language) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantTranslateIntoEnglish),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantTranslateIntoEnglish),
             "you can't translate into English",
             "only out of it.");
         return;
     }
 
     if ((<translates-into-nl-sentence-subject>(Node::get_text(pn->next))) == FALSE) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantTranslateValue),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantTranslateValue),
             "this isn't something which can be translated",
             "that is, it isn't a kind.");
         return;
diff --git a/docs/core-module/5-ut.html b/docs/core-module/5-ut.html
index 215f9a311..aa21c765a 100644
--- a/docs/core-module/5-ut.html
+++ b/docs/core-module/5-ut.html
@@ -80,7 +80,7 @@ a new name and its meaning to be.
 
     <translates-into-unicode-sentence-subject>(Node::get_text(pn->next));
     if ((<<r>> != -1) && (<<r>> != cc)) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnicodeAlready),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnicodeAlready),
             "this Unicode character name has already been translated",
             "so there must be some duplication somewhere.");
         return;
@@ -127,7 +127,7 @@ the built-in extensions anyway; Inform authors never type them.
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnicodeNonLiteral),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnicodeNonLiteral),
         "a Unicode character name must be translated into a literal decimal "
         "number written out in digits",
         "which this seems not to be.");
@@ -171,7 +171,7 @@ the player types either of these:
 
 int UnicodeTranslations::char_in_range(int cc) {
     if ((cc < 0) || (cc >= 0x10000)) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnicodeOutOfRange),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnicodeOutOfRange),
             "Inform can only handle Unicode characters in the 16-bit range",
             "from 0 to 65535.");
         return FALSE;
diff --git a/docs/core-module/6-er.html b/docs/core-module/6-er.html
index 6e1a89786..42a36b232 100644
--- a/docs/core-module/6-er.html
+++ b/docs/core-module/6-er.html
@@ -142,7 +142,7 @@ to behave as if \(B(y, x)\) had also been asserted whenever \(B(x, y)\) has, if
 
 
     if (BinaryPredicates::can_be_made_true_at_runtime(bp) == FALSE) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_Unassertable2),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_Unassertable2),
             "the relationship you describe is not exact enough",
             "so that I do not know how to make this assertion come true. "
             "For instance, saying 'The Study is adjacent to the Hallway.' "
@@ -156,7 +156,7 @@ to behave as if \(B(y, x)\) had also been asserted whenever \(B(x, y)\) has, if
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantRelateNothing),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantRelateNothing),
         "the relationship you describe seems to be with nothing",
         "which does not really make sense. 'Nothing' looks like a noun, "
         "but really Inform uses it to mean the absence of one, so it's "
diff --git a/docs/core-module/6-nv.html b/docs/core-module/6-nv.html
index c5129b1fa..df5abb6b0 100644
--- a/docs/core-module/6-nv.html
+++ b/docs/core-module/6-nv.html
@@ -237,7 +237,7 @@ now absolutely any non-empty word range is accepted as the property name.
 
 
     *X = NONE_VERBM;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_VerbRelationUnknown),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_VerbRelationUnknown),
         "new verbs can only be defined in terms of existing relations",
         "all of which have names ending 'relation': thus '...implies the "
         "possession relation' is an example of a valid definition, this "
@@ -249,7 +249,7 @@ now absolutely any non-empty word range is accepted as the property name.
 
 
     *X = NONE_VERBM;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_VerbRelationVague),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_VerbRelationVague),
         "that's too vague",
         "calling a relation simply 'relation'.");
 
@@ -259,7 +259,7 @@ now absolutely any non-empty word range is accepted as the property name.
     *X = NONE_VERBM;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_VerbUnknownMeaning),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_VerbUnknownMeaning),
         "I don't see what the meaning of this verb ought to be",
         "because it doesn't take any of the three forms I know: a relation "
         "name ('...means the wearing relation'), a property name ('...means "
@@ -277,7 +277,7 @@ now absolutely any non-empty word range is accepted as the property name.
         *XP = vm;
     } else {
         *X = NONE_VERBM;
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
             "that's another verb which has no meaning at present",
             "so this doesn't help me.");
     }
@@ -397,7 +397,7 @@ now absolutely any non-empty word range is accepted as the property name.
         }
         if ((Wordings::length(P) > MAX_WORDS_IN_PREPOSITION) ||
             (Wordings::length(SP) > MAX_WORDS_IN_PREPOSITION)) {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PrepositionLong),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PrepositionLong),
                 "prepositions can be very long indeed in today's Inform",
                 "but not as long as this.");
             return;
@@ -457,7 +457,7 @@ now absolutely any non-empty word range is accepted as the property name.
                 inform_extension *loc = Extensions::corresponding_to(pos);
                 if (Extensions::is_standard(loc)) return;
                 #endif
-                Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NoSuchBuiltInMeaning),
+                StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NoSuchBuiltInMeaning),
                     "that's not one of the built-in meanings I know",
                     "and should be one of the ones used in the Preamble to the "
                     "Standard Rules.");
@@ -635,7 +635,7 @@ infinitive for that — the two are the same in most regular English verbs
         } else {
             if (number == 2) {
                 if (WordAssemblages::nonempty(present_plural)) {
-                    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PresentPluralTwice),
+                    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PresentPluralTwice),
                         "the present plural has been given twice",
                         "since two of the principal parts of this verb begin "
                         "with 'they'.");
@@ -658,7 +658,7 @@ infinitive for that — the two are the same in most regular English verbs
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_VerbMalformed),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_VerbMalformed),
         "this verb's definition is malformed",
         "and should have its principal parts supplied like so: 'The verb "
         "to sport (he sports, they sport, he sported, it is sported, "
@@ -678,7 +678,7 @@ perfectly valid if a verb were being defined.
 
 
     if (Wordings::nonempty(PW)) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PrepositionConjugated),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PrepositionConjugated),
             "the principal parts of 'to be' are known already",
             "so should not be spelled out again as part of the instructions "
             "for this new preposition.");
@@ -691,12 +691,12 @@ perfectly valid if a verb were being defined.
 
 
     if (where)
-        Problems::Issue::two_sentences_problem(_p_(PM_DuplicateVerbs1),
+        StandardProblems::two_sentences_problem(_p_(PM_DuplicateVerbs1),
             where,
             "this gives us two definitions of what appears to be the same verb",
             "or at least has the same infinitive form.");
     else
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
             "this verb definition appears to clash with a built-in verb",
             "a table of which can be seen on the Phrasebook index.");
 
diff --git a/docs/core-module/6-rlt.html b/docs/core-module/6-rlt.html index 138325205..01ac41e1f 100644 --- a/docs/core-module/6-rlt.html +++ b/docs/core-module/6-rlt.html @@ -233,7 +233,7 @@ text of the subject mustn't be an existing relation name.
     *X = FALSE;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RelationExists),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RelationExists),
         "that relation already exists",
         "and cannot have its definition amended now.");
 
@@ -294,7 +294,7 @@ splitting into cases. if (bp == NULL) internal_error("BP in relation not initially parsed"); if (Wordings::length(RW) > MAX_WORDS_IN_ASSEMBLAGE-4) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RelationNameTooLong), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RelationNameTooLong), "this is too long a name for a single relation to have", "and would become unwieldy."); RW = Wordings::truncate(RW, MAX_WORDS_IN_ASSEMBLAGE-4); @@ -531,7 +531,7 @@ these are clipped away, and also look at the multiplicities. if (right_bitmap & FRF_RBIT) frf = TRUE; if (frf && (left_unique != FALSE) && (right_unique != FALSE)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_FRFUnavailable), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_FRFUnavailable), "fast route-finding is only possible with various-to-various " "relations", "though this doesn't matter because with other relations the " @@ -553,7 +553,7 @@ change. So we reject any such misleading syntax.
     if (right_bitmap & WHEN_RBIT) {
         if ((left_unique != NOT_APPLICABLE) || (right_unique != NOT_APPLICABLE)) {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_OneOrVariousWithWhen),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_OneOrVariousWithWhen),
                 "this relation is a mixture of different syntaxes",
                 "and must be simplified. If it is going to specify 'one' or "
                 "'various' then it cannot also say 'when' the relation holds.");
@@ -599,7 +599,7 @@ that \(R(x, y)\) is true if and only if \(R(y, x)\) is true.
         symmetric = TRUE; left_unique = FALSE; right_unique = FALSE; equivalence = TRUE;
     }
     if ((specified_one == TRUE) && (left_unique == FALSE)) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BothOneAndMany),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BothOneAndMany),
             "the left-hand term in this relation seems to be both 'one' thing "
             "and also many things",
             "given the mention of 'each other'. Try removing the 'one'.");
@@ -636,19 +636,19 @@ at this moment, and have no currency beyond that context.
 
     if (Wordings::empty(CONW)) {
         if ((left_unique == FALSE) && (Wordings::nonempty(LCALLW))) {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantCallLeft),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantCallLeft),
                 "the left-hand term of this relation is not unique",
                 "so you cannot assign a name to it using 'called'.");
             return;
         }
         if ((right_unique == FALSE) && (Wordings::nonempty(RCALLW))) {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantCallRight),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantCallRight),
                 "the right-hand term of this relation is not unique",
                 "so you cannot assign a name to it using 'called'.");
             return;
         }
         if ((Wordings::nonempty(LCALLW)) && (Wordings::nonempty(RCALLW))) {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantCallBoth),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantCallBoth),
                 "the terms of the relation can't be named on both sides at once",
                 "and because of that it's best to use a single even-handed name: "
                 "for instance, 'Marriage relates one person to another (called "
@@ -657,7 +657,7 @@ at this moment, and have no currency beyond that context.
             return;
         }
         if ((symmetric == FALSE) && (left_unique) && (right_unique) && (Wordings::nonempty(RCALLW))) {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_OneToOneMiscalled),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_OneToOneMiscalled),
                 "with a one-to-one relation which is not symmetrical "
                 "only the left-hand item can be given a name using 'called'",
                 "so this needs rephrasing to name the left in terms of the right "
@@ -751,7 +751,7 @@ omitted from the index.
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RelNotStoredInProperty),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RelNotStoredInProperty),
         "a '(called ...)' name can't be used for this relation",
         "because of the kinds involved in it. (Names for terms in a relation "
         "only work if it's possible to store the relation using properties, "
@@ -1006,7 +1006,7 @@ to have a name:
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, W);
     Problems::quote_text(3, side);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RelatedKindsUnknown));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RelatedKindsUnknown));
     Problems::issue_problem_segment(
         "In the relation definition %1, I am unable to understand the %3-hand "
         "side -- I was expecting that %2 would be either the name of a kind, "
@@ -1024,7 +1024,7 @@ to have a name:
     if (Kinds::Behaviour::is_an_enumeration(K)) return TRUE;
     if (K == NULL) return TRUE;  to recover from earlier problems
     if ((Kinds::Compare::le(K, K_object)) || (Kinds::Behaviour::definite(K) == FALSE))
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RangeOverlyBroad),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RangeOverlyBroad),
             "relations aren't allowed to range over all 'objects' or all 'values'",
             "as these are too broad. A relation has to be between two kinds of "
             "object, or kinds of value. So 'Taming relates various people to "
@@ -2572,7 +2572,7 @@ checking in.
                 }
                 if (leftc == 1) inf1 = inf;
                 if (leftc == 2) {
-                    Problems::Issue::infs_contradiction_problem(_p_(BelievedImpossible),
+                    StandardProblems::infs_contradiction_problem(_p_(BelievedImpossible),
                         World::Inferences::where_inferred(inf1), World::Inferences::where_inferred(inf),
                         infs, "can only relate to one other thing in this way",
                         "since the relation in question is one-to-one.");
@@ -2582,7 +2582,7 @@ checking in.
     }
     LOOP_OVER(infs, inference_subject) {
         if (right_counts[infs->allocation_id] >= 2) {
-            Problems::Issue::infs_contradiction_problem(_p_(PM_Relation1to1Right),
+            StandardProblems::infs_contradiction_problem(_p_(PM_Relation1to1Right),
                 World::Inferences::where_inferred(right_first[infs->allocation_id]),
                 World::Inferences::where_inferred(right_second[infs->allocation_id]),
                 infs, "can only relate to one other thing in this way",
@@ -2639,7 +2639,7 @@ checking in.
     if (bp->form_of_relation == Relation_VtoO) {
         LOOP_OVER(infs, inference_subject) {
             if (left_counts[infs->allocation_id] >= 2) {
-                Problems::Issue::infs_contradiction_problem(_p_(PM_RelationVtoOContradiction),
+                StandardProblems::infs_contradiction_problem(_p_(PM_RelationVtoOContradiction),
                     World::Inferences::where_inferred(left_first[infs->allocation_id]),
                     World::Inferences::where_inferred(left_second[infs->allocation_id]),
                     infs, "can only relate to one other thing in this way",
@@ -2649,7 +2649,7 @@ checking in.
     } else {
         LOOP_OVER(infs, inference_subject) {
             if (right_counts[infs->allocation_id] >= 2) {
-                Problems::Issue::infs_contradiction_problem(_p_(PM_RelationOtoVContradiction),
+                StandardProblems::infs_contradiction_problem(_p_(PM_RelationOtoVContradiction),
                     World::Inferences::where_inferred(right_first[infs->allocation_id]),
                     World::Inferences::where_inferred(right_second[infs->allocation_id]),
                     infs, "can only be related to by one other thing in this way",
@@ -3007,7 +3007,7 @@ whether or not $R(t_0<
     parse_node *spec = NULL;
     if (<s-condition>(W)) spec = <<rp>>;
     if ((spec == NULL) || (Dash::validate_conditional_clause(spec) == FALSE)) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadRelationCondition),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadRelationCondition),
             "the condition defining this relation makes no sense to me",
             "although the definition was properly formed - it is only "
             "the part after 'when' which I can't follow.");
diff --git a/docs/core-module/6-tur.html b/docs/core-module/6-tur.html
index 8e6daa3b7..a02e2731f 100644
--- a/docs/core-module/6-tur.html
+++ b/docs/core-module/6-tur.html
@@ -109,7 +109,7 @@ function togglePopup(material_id) {
     if (bp == R_meaning) {
         if (Kinds::Compare::eq(kinds_of_terms[0], K_verb) == FALSE) {
             Problems::quote_kind(4, kinds_of_terms[0]);
-            Problems::Issue::tcp_problem(_p_(...), tck,
+            StandardProblems::tcp_problem(_p_(...), tck,
                 "that asks whether something means something, and in Inform 'to mean' "
                 "means that a particular relation is the meaning of a given verb. "
                 "Here, though, we have %4 rather than the name of a verb.");
@@ -117,7 +117,7 @@ function togglePopup(material_id) {
         }
         if (Kinds::get_construct(kinds_of_terms[1]) != CON_relation) {
             Problems::quote_kind(4, kinds_of_terms[1]);
-            Problems::Issue::tcp_problem(_p_(...), tck,
+            StandardProblems::tcp_problem(_p_(...), tck,
                 "that asks whether something means something, and in Inform 'to mean' "
                 "means that a particular relation is the meaning of a given verb. "
                 "Here, though, we have %4 rather than the name of a relation.");
@@ -126,7 +126,7 @@ function togglePopup(material_id) {
     } else {
         if (Kinds::get_construct(kinds_of_terms[0]) != CON_relation) {
             Problems::quote_kind(4, kinds_of_terms[0]);
-            Problems::Issue::tcp_problem(_p_(BelievedImpossible), tck,
+            StandardProblems::tcp_problem(_p_(BelievedImpossible), tck,
                 "that asks whether something relates something, and in Inform 'to relate' "
                 "means that a particular relation applies between two things. Here, though, "
                 "we have %4 rather than the name of a relation.");
@@ -134,7 +134,7 @@ function togglePopup(material_id) {
         }
         if (Kinds::get_construct(kinds_of_terms[1]) != CON_combination) {
             Problems::quote_kind(4, kinds_of_terms[1]);
-            Problems::Issue::tcp_problem(_p_(BelievedImpossible), tck,
+            StandardProblems::tcp_problem(_p_(BelievedImpossible), tck,
                 "that asks whether something relates something, and in Inform 'to relate' "
                 "means that a particular relation applies between two things. Here, though, "
                 "we have %4 rather than the combination of the two things.");
@@ -147,7 +147,7 @@ function togglePopup(material_id) {
         if (Kinds::Compare::compatible(cleft, rleft) == NEVER_MATCH) {
             Problems::quote_kind(5, kinds_of_terms[0]);
             Problems::quote_kind(4, cleft);
-            Problems::Issue::tcp_problem(_p_(BelievedImpossible), tck,
+            StandardProblems::tcp_problem(_p_(BelievedImpossible), tck,
                 "that applies a relation to values of the wrong kinds: we have %5, but "
                 "the left-hand value here is %4.");
             return NEVER_MATCH;
@@ -155,7 +155,7 @@ function togglePopup(material_id) {
         if (Kinds::Compare::compatible(cright, rright) == NEVER_MATCH) {
             Problems::quote_kind(5, kinds_of_terms[0]);
             Problems::quote_kind(4, cright);
-            Problems::Issue::tcp_problem(_p_(BelievedImpossible), tck,
+            StandardProblems::tcp_problem(_p_(BelievedImpossible), tck,
                 "that applies a relation to values of the wrong kinds: we have %5, but "
                 "the right-hand value here is %4.");
             return NEVER_MATCH;
diff --git a/docs/core-module/7-hdn.html b/docs/core-module/7-hdn.html
index cfbb8e223..347db4c30 100644
--- a/docs/core-module/7-hdn.html
+++ b/docs/core-module/7-hdn.html
@@ -638,7 +638,7 @@ Version", contains the Inform build number in its usual form: "4Q34", for instan
     text_stream xf_struct; text_stream *xf = &xf_struct;
     filename *F = Task::xml_headings_file();
     if (STREAM_OPEN_TO_FILE(xf, F, UTF8_ENC) == FALSE)
-        Problems::Fatal::filename_related("Can't open headings file", F);
+        Problems::fatal_on_file("Can't open headings file", F);
     Sentences::Headings::write_headings_as_xml_inner(xf);
     STREAM_CLOSE(xf);
 }
diff --git a/docs/core-module/7-ns.html b/docs/core-module/7-ns.html
index 1bd85d0cb..31fab4f41 100644
--- a/docs/core-module/7-ns.html
+++ b/docs/core-module/7-ns.html
@@ -205,7 +205,7 @@ in quick succession, the second run-through does nothing.)
         if (soa == PL::Bibliographic::Release::release_along_with_SMF) err = FALSE;
         #endif
         if (err)
-            Problems::Issue::unlocated_problem(Task::syntax_tree(), _p_(BelievedImpossible),  not usefully testable, anyway
+            StandardProblems::unlocated_problem(Task::syntax_tree(), _p_(BelievedImpossible),  not usefully testable, anyway
                 "The options file placed in this installation of Inform's folder "
                 "is incorrect, making use of a sentence form which isn't allowed "
                 "in that situation. The options file is only allowed to contain "
@@ -312,7 +312,7 @@ to look for a good contextual problem message.
 
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, W);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_UnknownDA));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_UnknownDA));
     Problems::issue_problem_segment(
         "In the sentence %1, you asked to include '%2' in the "
         "debugging log, but there is no such debugging log topic.");
@@ -453,7 +453,7 @@ action declarations continue with usually extensive further text:
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TwoLikelihoods),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TwoLikelihoods),
         "this sentence seems to have a likelihood qualification on both "
         "sides of the verb",
         "which is not allowed. 'The black door certainly is usually open' "
@@ -653,7 +653,7 @@ Problem message than the one they will otherwise receive later on.
 
     if (Annotations::read_int(current_sentence, verb_problem_issued_ANNOT) == FALSE) {
         Annotations::write_int(current_sentence, verb_problem_issued_ANNOT, TRUE);
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NonPresentTense),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NonPresentTense),
             "assertions about the initial state of play must be given in the "
             "present tense",
             "so 'The cat is in the basket' is fine but not 'The cat has been in "
@@ -671,7 +671,7 @@ Problem message than the one they will otherwise receive later on.
 
     if (Annotations::read_int(current_sentence, verb_problem_issued_ANNOT) == FALSE) {
         Annotations::write_int(current_sentence, verb_problem_issued_ANNOT, TRUE);
-        Problems::Issue::negative_sentence_problem(Task::syntax_tree(), _p_(PM_NegatedVerb1));
+        StandardProblems::negative_sentence_problem(Task::syntax_tree(), _p_(PM_NegatedVerb1));
     }
 
  • This code is used in §19.
diff --git a/docs/core-module/7-oaf.html b/docs/core-module/7-oaf.html index e375c7bf2..616d193ee 100644 --- a/docs/core-module/7-oaf.html +++ b/docs/core-module/7-oaf.html @@ -178,7 +178,7 @@ roof, since it might need to recurse thousands of function calls deep. if (!((<notable-map-kinds>(Node::get_text(pn->next))) && (<<r>> == 0))) return; if (no_directions_noticed >= MAX_DIRECTIONS) { - Problems::Issue::limit_problem(Task::syntax_tree(), _p_(PM_TooManyDirections), + StandardProblems::limit_problem(Task::syntax_tree(), _p_(PM_TooManyDirections), "different directions", MAX_DIRECTIONS); return; } @@ -324,7 +324,7 @@ property names before they can do any damage.)

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PropertyCalledArticle),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PropertyCalledArticle),
         "a property name cannot consist only of an article",
         "which this one seems to. It would lead to awful ambiguities. "
         "More likely, the end of the sentence has been lost somehow?");
@@ -334,7 +334,7 @@ property names before they can do any damage.)
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PropertyCalledPresence),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PropertyCalledPresence),
         "a property name cannot consist only of the word 'presence'",
         "because this would lead to ambiguities with the rule clause "
         "'...in the presence of...' (For instance, when writing something "
@@ -347,7 +347,7 @@ property names before they can do any damage.)
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PropertyNameForbidden),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PropertyNameForbidden),
         "a property name cannot contain quoted text or a comma",
         "which this one seems to. I think I must be misunderstanding: "
         "possibly you've added a subordinate clause which I can't "
diff --git a/docs/core-module/7-rs.html b/docs/core-module/7-rs.html
index e7e24a583..1179f145d 100644
--- a/docs/core-module/7-rs.html
+++ b/docs/core-module/7-rs.html
@@ -156,7 +156,7 @@ indentation difficult to manage with screen-readers.
 

-void Sentences::RuleSubtrees::parse_routine_structure(parse_node *routine_node) {
+void Sentences::RuleSubtrees::parse_routine_structure(parse_node *routine_node) {
     int initial_problem_count = problem_count;
 
     parse_node *uses_colon_syntax = NULL;
@@ -253,7 +253,7 @@ indentation difficult to manage with screen-readers.
         current_sentence = routine_node;
         Problems::quote_source(1, current_sentence);
         Problems::quote_source(2, mispunctuates_begin_end_syntax);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadOldSyntax));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadOldSyntax));
         Problems::issue_problem_segment(
             "The rule or phrase definition %1 seems to use indentation and "
             "colons to group phrases together into 'if', 'repeat' or 'while' "
@@ -268,7 +268,7 @@ indentation difficult to manage with screen-readers.
         Problems::quote_source(1, current_sentence);
         Problems::quote_source(2, uses_colon_syntax);
         Problems::quote_source(3, uses_begin_end_syntax);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BothBlockSyntaxes));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BothBlockSyntaxes));
         Problems::issue_problem_segment(
             "The rule or phrase definition %1 seems to use both ways of grouping "
             "phrases together into 'if', 'repeat' and 'while' blocks at once. "
@@ -290,7 +290,7 @@ indentation difficult to manage with screen-readers.
         current_sentence = routine_node;
         Problems::quote_source(1, current_sentence);
         Problems::quote_source(2, requires_colon_syntax);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NotInOldSyntax));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NotInOldSyntax));
         Problems::issue_problem_segment(
             "The construction %2, in the rule or phrase definition %1, "
             "is only allowed if the rule is written in the 'new' format, "
@@ -529,7 +529,7 @@ report more or less helpfully.
 
     current_sentence = routine_node;
     Problems::quote_source_eliding_begin(1, current_sentence);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NonflushRule));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NonflushRule));
     Problems::issue_problem_segment(
         "The phrase or rule definition %1 is written using tab indentations "
         "to show how its phrases are to be grouped together. But in that "
@@ -739,7 +739,7 @@ indentation implicitly requires it.
         current_sentence = routine_node;
         Problems::quote_source_eliding_begin(1, current_sentence);
         Problems::quote_source_eliding_begin(2, first_misaligned_phrase);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_MisalignedIndentation));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_MisalignedIndentation));
         Problems::issue_problem_segment(
             "The phrase or rule definition %1 is written using the 'colon "
             "and indentation' syntax for its 'if's, 'repeat's and 'while's, "
@@ -750,7 +750,7 @@ indentation implicitly requires it.
             "definition seems to be %2, in case that helps. %PThis sometimes "
             "happens even when the code looks about right, to the eye, if rows "
             "of spaces have been used to indent phrases instead of tabs.");
-        Problems::Issue::diagnose_further();
+        Problems::Using::diagnose_further();
         Problems::issue_problem_end();
     }
 
@@ -777,7 +777,7 @@ indentation implicitly requires it. current_sentence = routine_node; Problems::quote_source_eliding_begin(1, current_sentence); Problems::quote_source_eliding_begin(2, first_overindented_phrase); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TooMuchIndentation)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TooMuchIndentation)); Problems::issue_problem_segment( "The phrase or rule definition %1 is written using tab indentations " "to show how its phrases are to be grouped together. But the level " @@ -795,7 +795,7 @@ indentation implicitly requires it. current_sentence = routine_node; Problems::quote_source_eliding_begin(1, current_sentence); Problems::quote_source_eliding_begin(2, run_on_at); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RunOnsInTabbedRoutine)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RunOnsInTabbedRoutine)); Problems::issue_problem_segment( "The phrase or rule definition %1 is written using the 'colon " "and indentation' syntax for its 'if's, 'repeat's and 'while's, " @@ -821,7 +821,7 @@ think of a sensible use. Problems::quote_source_eliding_begin(1, current_sentence); Problems::quote_source_eliding_begin(2, prev); Problems::quote_source_eliding_begin(3, p); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_EmptyIndentedBlock)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_EmptyIndentedBlock)); Problems::issue_problem_segment( "The phrase or rule definition %1 is written using the 'colon " "and indentation' syntax for its 'if's, 'repeat's and 'while's, " @@ -843,7 +843,7 @@ think of a sensible use. current_sentence = routine_node; Problems::quote_source_eliding_begin(1, current_sentence); Problems::quote_source_eliding_begin(2, p); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NonCaseInIf)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NonCaseInIf)); Problems::issue_problem_segment( "In the phrase or rule definition %1, the phrase %2 came as a " "surprise since it was not a case in an 'if X is...' but was " @@ -860,7 +860,7 @@ think of a sensible use. current_sentence = p; if (csp->subordinate_to == if_CSP) { LOG("$T\n", routine_node); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_MisalignedOtherwise), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_MisalignedOtherwise), "this doesn't match a corresponding 'if'", "as it must. An 'otherwise' must be vertically underneath the " "'if' to which it corresponds, at the same indentation, and " @@ -868,7 +868,7 @@ think of a sensible use. "'if' must do the same."); } if (csp->subordinate_to == switch_CSP) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_MisalignedCase), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_MisalignedCase), "this seems to be misplaced since it is not a case within an " "'if X is...'", "as it must be. Each case must be placed one tab stop in from " @@ -885,12 +885,12 @@ think of a sensible use. if ((indent_misalign == FALSE) && (suppress_further_problems == FALSE)) { current_sentence = p; if ((csp == default_case_CSP) || (csp == case_CSP)) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_DefaultCaseNotLast), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DefaultCaseNotLast), "'otherwise' must be the last clause if an 'if ... is:'", "and in particular it has to come after all the '-- V:' " "case values supplied."); else - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_MisarrangedOtherwise), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_MisarrangedOtherwise), "this seems to be misplaced since it is out of sequence within its 'if'", "with an 'otherwise if...' coming after the more general 'otherwise' " "rather than before. (Note that an 'otherwise' or 'otherwise if' must " @@ -931,7 +931,7 @@ whichever syntax is used. We finally make a meaningful tree out of it. } if (overflow_point) { current_sentence = overflow_point; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BlockNestingTooDeep), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BlockNestingTooDeep), "compound phrases have gone too deep", "perhaps because many have begun but not been properly ended?"); } @@ -1083,7 +1083,7 @@ of old-format source text, and for refuseniks.

-    Problems::Issue::sentence_problem_with_note(Task::syntax_tree(), _p_(PM_EndWithoutBegin),
+    StandardProblems::sentence_problem_with_note(Task::syntax_tree(), _p_(PM_EndWithoutBegin),
         "this is an 'end' with no matching 'begin'",
         "which should not happen: every phrase like 'if ... begin;' "
         "should eventually be followed by its bookend 'end if'. "
@@ -1100,7 +1100,7 @@ of old-format source text, and for refuseniks.
     Problems::quote_source(1, current_sentence);
     Problems::quote_wide_text(2, prior->keyword);
     Problems::quote_source(3, prev_p);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_WrongEnd));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_WrongEnd));
     Problems::issue_problem_segment(
         "You wrote %1, but the end I was expecting next was 'end %2', "
         "finishing the block you began with %3.");
@@ -1111,7 +1111,7 @@ of old-format source text, and for refuseniks.
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BeginWithoutEnd),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BeginWithoutEnd),
         "the definition of the phrase ended with no matching 'end' for "
         "this 'begin'",
         "bearing in mind that every begin must have a matching end, and "
@@ -1124,11 +1124,11 @@ of old-format source text, and for refuseniks.
 
 
     if (csp == otherwise_CSP)
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_OtherwiseWithoutIf),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_OtherwiseWithoutIf),
             "this is an 'else' or 'otherwise' with no matching 'if' (or 'unless')",
             "which must be wrong.");
     else if (csp == otherwise_if_CSP)
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_OtherwiseIfMisplaced),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_OtherwiseIfMisplaced),
             "the 'otherwise if' clause here seems not to be occurring inside "
             "a large 'if'",
             "and seems to be freestanding instead. (Though 'otherwise ...' can "
@@ -1136,7 +1136,7 @@ of old-format source text, and for refuseniks.
             "course of action, 'otherwise if...' is a different matter, and is "
             "used to divide up larger-scale instructions.)");
     else
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
             "this clause can't occur outside of a control phrase",
             "which suggests that the structure of this routine is wrong.");
 
@@ -1148,13 +1148,13 @@ of old-format source text, and for refuseniks. if ((csp == otherwise_CSP) || (csp == otherwise_if_CSP)) { Problems::quote_source(1, current_sentence); Problems::quote_wide_text(2, context->keyword); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_OtherwiseInNonIf)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_OtherwiseInNonIf)); Problems::issue_problem_segment( "The %1 here did not make sense inside a " "'%2' structure: it's provided for 'if' (or 'unless')."); Problems::issue_problem_end(); } else - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), "this clause is wrong for the phrase containing it", "which suggests that the structure of this routine is wrong.");
@@ -1173,19 +1173,19 @@ of old-format source text, and for refuseniks. oi = TRUE; } if (doubled) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_DoubleOtherwise), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DoubleOtherwise), "that makes two unconditional 'otherwise' or 'else' clauses " "for this 'if'", "which is forbidden since 'otherwise' is meant to be a single " "(optional) catch-all clause at the end."); else if (oi) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_OtherwiseIfAfterOtherwise), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_OtherwiseIfAfterOtherwise), "this seems to be misplaced since it is out of sequence within its 'if'", "with an 'otherwise if...' coming after the more general 'otherwise' " "rather than before. (If there's an 'otherwise' clause, it has to be " "the last clause of the 'if'.)"); else - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), "'otherwise' must be the last clause", "but it seems not to be.");
@@ -1198,7 +1198,7 @@ and the structure of that was checked at indentation time, but just in case.

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
         "'otherwise' must be the last clause",
         "which must be wrong.");
 
@@ -1471,8 +1471,8 @@ annotations to them.

-    it_is_not_worth_adding = TRUE;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TSWithComma),
+    Strings::TextSubstitutions::it_is_not_worth_adding();
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TSWithComma),
         "a substitution contains a comma ','",
         "which is against the rules, because 'say' is a special phrase in "
         "which the comma divides items in a list of things to say, and so it "
@@ -1482,7 +1482,7 @@ annotations to them.
         "option - say 'the best route from A to B, using even locked doors' - "
         "you'll need to put this in a 'let' variable first and then say that, "
         "or else define a better text substitution to do the job for you.)");
-    it_is_not_worth_adding = FALSE;
+    Strings::TextSubstitutions::it_is_worth_adding();
     return;
 
@@ -1490,10 +1490,10 @@ annotations to them.

-    it_is_not_worth_adding = TRUE;
+    Strings::TextSubstitutions::it_is_not_worth_adding();
     if ((p[k+1] == 'u') && (p[k+2] == 'n') && (p[k+3] == 'i') && (p[k+4] == 'c') &&
         (p[k+5] == 'o') && (p[k+6] == 'd') && (p[k+7] == 'e') && (p[k+8] == ' ')) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NestedUSubstitution),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NestedUSubstitution),
             "the text here contains one substitution '[...]' inside another",
             "which is not allowed. Actually, it looks as if you might have got "
             "into this by typing an exotic character as part of the name of a "
@@ -1501,12 +1501,12 @@ annotations to them.
             "for the appropriate Unicode character code number N. Either way - "
             "this isn't allowed.");
     } else {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NestedSubstitution),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NestedSubstitution),
             "the text here contains one substitution '[...]' inside another",
             "which is not allowed. (If you just wanted a literal open and closed "
             "square bracket, use '[bracket]' and '[close bracket]'.)");
     }
-    it_is_not_worth_adding = FALSE;
+    Strings::TextSubstitutions::it_is_worth_adding();
     return;
 
@@ -1514,13 +1514,13 @@ annotations to them.

-    it_is_not_worth_adding = TRUE;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnclosedSubstitution),
+    Strings::TextSubstitutions::it_is_not_worth_adding();
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnclosedSubstitution),
         "the text here uses an open square bracket '[', which opens a substitution "
         "in the text, but doesn't close it again",
         "so that the result is malformed. (If you just wanted a literal open "
         "square bracket, use '[bracket]'.)");
-    it_is_not_worth_adding = FALSE;
+    Strings::TextSubstitutions::it_is_worth_adding();
     return;
 
@@ -1528,13 +1528,13 @@ annotations to them.

-    it_is_not_worth_adding = TRUE;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnopenedSubstitution),
+    Strings::TextSubstitutions::it_is_not_worth_adding();
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnopenedSubstitution),
         "the text here uses a close square bracket ']', which closes a substitution "
         "in the text, but never actually opened it",
         "with a matching '['. (If you just wanted a literal close square bracket, "
         "use '[close bracket]'.)");
-    it_is_not_worth_adding = FALSE;
+    Strings::TextSubstitutions::it_is_worth_adding();
     return;
 
@@ -1576,11 +1576,11 @@ to parse the list.

-    it_is_not_worth_adding = TRUE;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TSWithPunctuation),
+    Strings::TextSubstitutions::it_is_not_worth_adding();
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TSWithPunctuation),
         "a substitution contains a '.', ':' or ';'",
         "which suggests that a close square bracket ']' may have gone astray.");
-    it_is_not_worth_adding = FALSE;
+    Strings::TextSubstitutions::it_is_worth_adding();
 

§8.1.1.5.1. And: @@ -1590,11 +1590,11 @@ to parse the list.

-    it_is_not_worth_adding = TRUE;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_EmptySubstitution),
+    Strings::TextSubstitutions::it_is_not_worth_adding();
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_EmptySubstitution),
         "the text here contains an empty substitution '[]'",
         "which is not allowed. To say nothing - well, say nothing.");
-    it_is_not_worth_adding = FALSE;
+    Strings::TextSubstitutions::it_is_worth_adding();
 
  • This code is used in §8.1.1.5 (three times).

§9. That just leaves one utility routine, for manufacturing end nodes which diff --git a/docs/core-module/9-ass.html b/docs/core-module/9-ass.html index 782825497..02f64a0ab 100644 --- a/docs/core-module/9-ass.html +++ b/docs/core-module/9-ass.html @@ -250,7 +250,7 @@ first it's a RELATIONSHIP_NT< (Kinds::Behaviour::has_named_constant_values(instance_kind) == FALSE)) { LOG("$T", look_for); LOG("$T", what_to_make); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_AssemblyOnFixedKind), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_AssemblyOnFixedKind), "this generalisation can't be made", "because I only use generalisations to talk about values which can be " "created as needed, like things or scenes - not about those always " @@ -266,7 +266,7 @@ first it's a RELATIONSHIP_NT< if ((what_to_make) && (Node::get_type(what_to_make->down) == EVERY_NT)) { LOG("$T", look_for); LOG("$T", what_to_make); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_AssemblyOnBothSides), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_AssemblyOnBothSides), "this generalisation can't be made", "because it uses 'every' or some similar generalisation on both sides, " "which is too rich for my taste."); @@ -306,7 +306,7 @@ first it's a RELATIONSHIP_NT< LOG("Generalisation:\n"); LOG("$T", look_for); LOG("$T", what_to_make); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_AssemblyRegress), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_AssemblyRegress), "this generalisation would be too dangerous", "because it would lead to infinite regress in the assembly process. Sometimes " "this happens if you have set up matters with text like 'A container is in every " @@ -494,7 +494,7 @@ machinery is in infinite regress, e.g., because each \(K\) must contain an Problems::quote_subject(2, infs_k); int max = MAX_ASSEMBLY_SIZE; Problems::quote_number(3, &max); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_AssemblyLoop)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_AssemblyLoop)); Problems::issue_problem_segment( "Making a new %2 seems to result in an assembly which can never end, " "or which at any rate led to some %3 further constructions " diff --git a/docs/core-module/9-imp.html b/docs/core-module/9-imp.html index a006adf9c..ef6876aae 100644 --- a/docs/core-module/9-imp.html +++ b/docs/core-module/9-imp.html @@ -118,7 +118,7 @@ is to store them and sit on them.

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ImplicationCertain),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ImplicationCertain),
         "that's an implication which is too certain for me",
         "since a sentence like this talks about a generality of things in terms of "
         "one either/or property implying another, and I can only handle those as "
@@ -171,7 +171,7 @@ is to store them and sit on them.
 
 
     if (Calculus::Propositions::Assert::testable_at_compile_time(premiss) == FALSE) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadImplicationDomain),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadImplicationDomain),
             "that's an implication where the condition to qualify is not "
             "one that I can determine in advance of the start of play",
             "since it involves more than simple either/or properties "
@@ -187,7 +187,7 @@ is to store them and sit on them.
 
     property *prn = Adjectives::Meanings::has_EORP_meaning(Node::get_aph(py), NULL);
     if (prn == NULL) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ImplicationValueProperty),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ImplicationValueProperty),
             "that's an implication where the outcome is an adjective other than "
             "a simple either/or property",
             "which is the only form of implication I can handle.");
diff --git a/docs/core-module/9-ma.html b/docs/core-module/9-ma.html
index 8fbabb009..4e4b715f9 100644
--- a/docs/core-module/9-ma.html
+++ b/docs/core-module/9-ma.html
@@ -211,7 +211,7 @@ of px and     if ((prevailing_mood == INITIALLY_CE) &&
         ((Node::get_type(px) != PROPER_NOUN_NT) ||
             (Node::get_type(py) != PROPER_NOUN_NT))) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_MisplacedInitially),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_MisplacedInitially),
             "you can only say 'initially' when creating variables using 'is'",
             "so 'The squirrel population is initially 0' is fine, but not "
             "'The acorn is initially carried by Mr Hedges.' - probably you "
@@ -222,7 +222,7 @@ of px and         (Rvalues::is_CONSTANT_construction(Node::get_evaluation(px), CON_property) == FALSE) &&
         (Lvalues::is_actual_NONLOCAL_VARIABLE(Node::get_evaluation(px)) == FALSE) &&
         (Node::get_type(px) == PROPER_NOUN_NT)) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_VagueAboutSpecific),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_VagueAboutSpecific),
             "you can only equivocate with 'usually', 'rarely', "
             "'always' and the like when talking about kinds of thing",
             "because when a specific thing is involved you should say "
@@ -236,7 +236,7 @@ of px and         ((Node::get_type(py) == COMMON_NOUN_NT)
         && (Node::get_evaluation(py)) && (Annotations::read_int(py, multiplicity_ANNOT) > 1)
         && (Node::get_type(px) != RELATIONSHIP_NT))) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_MultiplyVague),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_MultiplyVague),
             "multiple objects can only be put into relationships",
             "by saying something like 'In the Drawing Room are two women.', "
             "and all other assertions with multiple objects are disallowed: "
@@ -420,7 +420,7 @@ at which point it becomes a P
 

-    Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_WithIsWith),
+    Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_WithIsWith),
         "you can't say that one general description is another ",
         "for instance by writing 'A container with carrying capacity 10 is a "
         "container with description \"Handy.\"'.");
@@ -449,7 +449,7 @@ like properties.
 

-    Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_XofYisZofW),
+    Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_XofYisZofW),
         "this seems to say two different properties are not simply equal "
         "but somehow the same thing",
         "like saying that 'the printed name of the millpond is the "
@@ -462,7 +462,7 @@ like properties.
 

-    Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_BadXofY),
+    Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_BadXofY),
         "this is the wrong way around if you want to specify a property",
         "like saying that '10 is the score of the platinum pyramid', "
         "which is poor style. (Though sweet are the uses of adversity.)");
@@ -525,7 +525,7 @@ specifying its edibility.
     Problems::quote_subject(1, inst);
     Problems::quote_source(2, current_sentence);
     Problems::quote_source(3, InferenceSubjects::where_created(inst));
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_InstanceNowKind));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_InstanceNowKind));
     Problems::issue_problem_segment(
         "You wrote '%2', but that seems to say that some "
         "room or thing already created ('%1', created by '%3') is now to "
@@ -552,7 +552,7 @@ specifying its edibility.
             Problems::quote_source(1, current_sentence);
             Problems::quote_property(2, prn);
             Problems::quote_wording_as_source(3, prn->name);
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_KindAsProperty));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_KindAsProperty));
             Problems::issue_problem_segment(
                 "You wrote '%1', but that seems to say that a property "
                 "(%3) has to be a kind as well. It is sometimes okay for a "
@@ -576,7 +576,7 @@ specifying its edibility.
             Problems::quote_source(1, current_sentence);
             Problems::quote_kind_of(2, val);
             Problems::quote_wording_as_source(3, Node::get_text(px));
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_KindAsActualValue));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_KindAsActualValue));
             Problems::issue_problem_segment(
                 "You wrote '%1', but that seems to say that a value already "
                 "in existence (%3) has to be a kind as well. (It's %2.)");
@@ -590,7 +590,7 @@ specifying its edibility.
 

-    Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_KindOfKindDisallowed),
+    Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_KindOfKindDisallowed),
         "you aren't allowed to make new kinds of kinds",
         "only kinds of things which already exist. So 'A fox is a kind of animal' "
         "is fine, but 'A tricky kind is a kind of kind' isn't allowed.");
@@ -601,7 +601,7 @@ specifying its edibility.
 

-    Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_KindOfEveryDisallowed),
+    Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_KindOfEveryDisallowed),
         "you aren't allowed to make a kind of everything",
         "or of everything matching a description. 'A badger is a kind of animal' "
         "is fine, but 'A gene is a kind of every animal' isn't allowed. (Probably "
@@ -613,7 +613,7 @@ specifying its edibility.
 

-    Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_KindUncertainDisallowed),
+    Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_KindUncertainDisallowed),
         "you aren't allowed to make a kind in a way expressing certainty or doubt",
         "so 'A badger is a kind of animal' is fine, but 'A fungus is usually a "
         "kind of every animal' isn't allowed, and nor is 'A fern is never a kind "
@@ -667,7 +667,7 @@ further sub-cases later.
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, Node::get_text(py));
         Problems::quote_kind_of(3, Node::get_evaluation(py));
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyObj2));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyObj2));
         Problems::issue_problem_segment(
             "In %1 you give a value of a property as '%2', but it "
             "seems to be a general description of a value (%3) rather than "
@@ -687,7 +687,7 @@ further sub-cases later.
         }
     }
     #endif
-    Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_PeculiarProperty),
+    Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_PeculiarProperty),
         "that is a very peculiar property value",
         "and ought to be something more definite and explicit.");
 
@@ -696,7 +696,7 @@ further sub-cases later.

-    Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_KindOfIs),
+    Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_KindOfIs),
         "that seems to say that a new kind is the same as something else",
         "like saying 'A kind of container is a canister': which ought to be put the "
         "other way round, 'A canister is a kind of container'.");
@@ -713,7 +713,7 @@ further sub-cases later.
     if (Adjectives::Meanings::has_ENUMERATIVE_meaning(Node::get_aph(py))) {
         property *prn = Properties::Valued::obtain(Node::get_text(px->down->next));
         if (Node::get_type(px->down) == WITH_NT) {
-            Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_EOOwnerMutable),
+            Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_EOOwnerMutable),
                 "either/or properties have to be given to clearly identifiable "
                 "owners",
                 "rather than to a collection of owners which might vary during "
@@ -725,7 +725,7 @@ further sub-cases later.
                 Node::get_subject(px->down), py);
         }
     } else {
-        Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_NonAdjectivalProperty),
+        Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_NonAdjectivalProperty),
             "that property can't be used adjectivally as a value",
             "since it is an adjective applying to a thing but is "
             "not a name from a range of possibilities.");
@@ -766,7 +766,7 @@ further sub-cases later.
 

-    Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_BadEvery),
+    Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_BadEvery),
         "'every' (or 'always') can't be used in that way",
         "and should be reserved for sentences like 'A coin is in every room'.");
 
@@ -781,7 +781,7 @@ not "every room".

-    Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_BadEvery2),
+    Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_BadEvery2),
         "'every' can't be used in that way",
         "and should be reserved for sentences like 'A coin is in every room'.");
 
@@ -833,7 +833,7 @@ pretty improbable:
     if (Node::get_subject(py))
-        Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_ActionEquated),
+        Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_ActionEquated),
             "an action can't be the same as a thing",
             "so my guess is that this is an attempt to categorise an action which went "
             "wrong because there was already something of that name in existence. For "
@@ -842,7 +842,7 @@ pretty improbable:
             "actions at once to a named kind of action, like 'Taking and dropping are "
             "manipulation.' - only one can be named at a time.)");
     else
-        Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_ActionEquated2),
+        Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_ActionEquated2),
             "that means something else already",
             "so it will only confuse things if we use it for a kind of action.");
 
@@ -861,7 +861,7 @@ a spatial location.
     if (Assertions::Refiner::turn_player_to_yourself(px)) { Assertions::Maker::make_assertion_recursive(px, py); return; }
     if (Assertions::Refiner::turn_player_to_yourself(py)) { Assertions::Maker::make_assertion_recursive(px, py); return; }
-    Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_IntangibleRelated),
+    Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_IntangibleRelated),
         "this seems to give a worldly relationship to something intangible",
         "like saying that 'in the box is a text'. Perhaps it came "
         "to this because you gave something physical a name which was "
@@ -881,7 +881,7 @@ a spatial location.
 

-    Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_XofYRelated),
+    Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_XofYRelated),
         "this seems to say that a property of something is not simply equal "
         "to what happens at the moment to satisfy some relationship, but "
         "conceptually the same as that relationship",
@@ -929,7 +929,7 @@ possible to coerce the left side to a noun, we will.
 

-    Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_DescriptionIsOther),
+    Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_DescriptionIsOther),
         "this seems to say that a general description is something else",
         "like saying that 'a door is 20'.");
 
@@ -945,7 +945,7 @@ possible to coerce the left side to a noun, we will.

-    Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_ActionAdjective),
+    Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_ActionAdjective),
         "that is already the name of a property",
         "so it will only confuse things if we use it for a kind of action.");
 
@@ -1003,7 +1003,7 @@ but not in this context. if (<activity-name-formal>(Node::get_text(px))) Activities::add_variable(av, py->down); else - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_BadActivityRef), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_BadActivityRef), "an activity has to be formally referred to in a way making clear that " "it is indeed a rulebook when we give it named values", "to reduce the risk of ambiguity. So 'The printing the banner text " @@ -1029,7 +1029,7 @@ but not in this context. if (<rulebook-name-formal>(Node::get_text(px))) Rulebooks::add_variable(rb, py->down); else - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_BadRulebookRef), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_BadRulebookRef), "a rulebook has to be formally referred to in a way making clear that " "it is indeed a rulebook when we give it named values", "to reduce the risk of ambiguity. So 'The every turn rulebook has a " @@ -1045,7 +1045,7 @@ but not in this context.

-    Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_TooVagueForVariables),
+    Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_TooVagueForVariables),
         "this is too vague a description of the owner of the property",
         "so that I don't know where to put this. Something like 'A person "
         "has a number called age' is fine, but 'A kind has a number called "
@@ -1056,7 +1056,7 @@ but not in this context.
 

-    Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_HasNoVariables),
+    Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_HasNoVariables),
         "only an object, kind, rulebook, action or activity can be allowed to have "
         "properties or variables",
         "so for instance 'A door has a colour' is fine but not 'A number has a length'.");
@@ -1085,7 +1085,7 @@ but in fact isn't one;
     if (traverse == 1) return;
     Assertions::Refiner::turn_player_to_yourself(px->down);
     if (<negated-clause>(Node::get_text(py))) {
-        Problems::Issue::negative_sentence_problem(Task::syntax_tree(), _p_(PM_NonValue)); return;
+        StandardProblems::negative_sentence_problem(Task::syntax_tree(), _p_(PM_NonValue)); return;
     }
 
     parse_node *owner = Node::get_evaluation(px->down);
@@ -1144,7 +1144,7 @@ properties) and for kinds (which do, but differently).
         return;
     } else if (Node::get_type(px->down) != COMMON_NOUN_NT) {
         LOG("$T\n", current_sentence);
-        Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_Unspecifiable),
+        Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_Unspecifiable),
             "this tries to set specification text for a particular value",
             "rather than a kind of value. 'Specification' is a special property used "
             "only to annotate the Index, and it makes no sense to set this property for "
@@ -1160,7 +1160,7 @@ properties) and for kinds (which do, but differently).
     if ((<s-literal>(W)) && (Rvalues::is_CONSTANT_of_kind(<<rp>>, K_text))) {
         Word::dequote(Wordings::first_wn(W));
     } else {
-        Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_SpecNotText),
+        Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_SpecNotText),
             "this tries to set a specification to something other than literal quoted text",
             "which will not work. 'Specification' is a special property used only to "
             "annotate the Index, and specifically the Kinds index, so it makes no sense to "
@@ -1173,7 +1173,7 @@ properties) and for kinds (which do, but differently).
 

-    Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_OverspecifiedSpec),
+    Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_OverspecifiedSpec),
         "this tries to set a property for something more complicated than a single thing "
         "named without qualifications",
         "and that isn't allowed. For instance, 'The description of the Great Portal is "
@@ -1188,7 +1188,7 @@ properties) and for kinds (which do, but differently).
 

-    Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_BadInferenceSubject),
+    Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_BadInferenceSubject),
         "this tries to set a property for a value which can't have properties",
         "and that isn't allowed. For instance, 'The description of the Great Portal is "
         "\"It's open.\"' would be fine, if Great Portal were a room, but 'The description "
@@ -1200,7 +1200,7 @@ properties) and for kinds (which do, but differently).
 

-    Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_GeneralitySpec),
+    Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_GeneralitySpec),
         "this tries to set a property for a complicated generality of items all at once",
         "which can lead to ambiguities. For instance, 'The description of an open door "
         "is \"It's open.\"' is not allowed: if we followed Inform's normal conventions "
@@ -1229,7 +1229,7 @@ properties) and for kinds (which do, but differently).
     if ((PL::Actions::Patterns::is_valid(apy)) &&
         (PL::Actions::Patterns::is_named(apy) == FALSE)) {
         LOG("Actions: $A and $A\n", apx, apy);
-        Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_ActionsEquated),
+        Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_ActionsEquated),
             "two actions are rather oddly equated here",
             "which would only make sense if the second were a named pattern of actions "
             "like (say) 'unseemly behaviour'.");
@@ -1265,7 +1265,7 @@ in this case.
         #endif
         return;
     }
-    Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_RelationsEquated),
+    Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_RelationsEquated),
         "this says that two different relations are the same",
         "like saying that 'in the box is on the table'. (Sometimes this "
         "happens if I misinterpret names of places like 'In Prison' or "
@@ -1298,13 +1298,13 @@ opera about a dog, "Collared Is Bowser".)
 
 
     if (Node::get_subject(py))
-        Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_AdjectiveIsObject),
+        Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_AdjectiveIsObject),
             "that seems to say that an adjective is a noun",
             "like saying 'Open are the doubled doors': which I'm picky about, preferring "
             "it written the other way about ('The doubled doors are open'). Less poetic, "
             "but clearer style.");
     else
-        Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_AdjectiveIsValue),
+        Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_AdjectiveIsValue),
             "that suggests that an adjective has some sort of value",
             "like saying 'Open is a number' or 'Scenery is 5': but of course an adjective "
             "represents something which is either true or false.");
@@ -1330,13 +1330,13 @@ opera about a dog, "Collared Is Bowser".)
     if ((Node::get_subject(px)) && (InferenceSubjects::domain(Node::get_subject(px)))) {
         Problems::quote_source(1, current_sentence);
         Problems::quote_source(2, py);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_KindIsAction));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_KindIsAction));
         Problems::issue_problem_segment(
             "You wrote %1: unfortunately %2 is already the name of an action, "
             "and it would only confuse things if we used it for a value as well.");
         Problems::issue_problem_end();
     } else {
-        Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_ObjectIsAction),
+        Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_ObjectIsAction),
             "that is putting the definition back to front",
             "since I need these categorisations of actions to take the form 'Kissing a "
             "woman is love', not 'Love is kissing a woman'. (This is really because it "
@@ -1352,7 +1352,7 @@ opera about a dog, "Collared Is Bowser".)
 

-    Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_EveryEquated),
+    Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_EveryEquated),
         "I can't do that", "Dave.");
 
  • This code is used in §3.3.
@@ -1385,7 +1385,7 @@ this ought to be allowed... } if (Kinds::Compare::le(Specifications::to_kind(Node::get_evaluation(px)), K_object)) - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_KindRelated), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_KindRelated), "something described only by its kind should not be given a " "specific place or role in the world", "to avoid ambiguity. For instance, suppose 'car' is a kind. Then " @@ -1396,7 +1396,7 @@ this ought to be allowed... "though more specific ones like 'a car called Genevieve is in the " "garage' are fine, as is the reverse, 'In the garage is a car.'"); else - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_KOVRelated), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_KOVRelated), "this seems to give a worldly relationship to something intangible", "possibly due to an accidental clash of names between a kind of " "value and something in the real world. " @@ -1558,7 +1558,7 @@ two whole domains. (We have the "kind of..." syntax instead.) Problems::quote_subject(2, left_object); Problems::quote_subject(3, right_kind); if (left_object == right_kind) { - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_SameKindEquated)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_SameKindEquated)); Problems::issue_problem_segment( "The sentence %1 seems to be telling me that two descriptions, " "both forms of %2, are the same. That's a little puzzling - " @@ -1566,7 +1566,7 @@ two whole domains. (We have the "kind of..." syntax instead.) NAME_DESCRIPTION_CLASH_NOTE); Problems::issue_problem_end(); } else { - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_DescriptionsEquated)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_DescriptionsEquated)); Problems::issue_problem_segment( "The sentence %1 seems to be telling me that two descriptions, " "one a form of %2 and the other of %3, are the same. That's a " @@ -1592,7 +1592,7 @@ two whole domains. (We have the "kind of..." syntax instead.) Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(px)); Problems::quote_wording(3, Node::get_text(py)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_VariablesEquated)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_VariablesEquated)); Problems::issue_problem_segment( "The sentence %1 seems to tell me that '%2', which describes " "a kind of variable, is the same as '%3', another description " @@ -1610,7 +1610,7 @@ two whole domains. (We have the "kind of..." syntax instead.)
     if (Specifications::is_new_variable_like(Node::get_evaluation(py))) {
-        Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_VarKOVClash),
+        Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_VarKOVClash),
             "the name supplied for this new variable is a piece of text "
             "which is not available because it has a rival meaning already",
             "as a result of definitions made elsewhere. (Sometimes these "
@@ -1690,7 +1690,7 @@ allow one case, where the declaration is redundant and harmless.)
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, Node::get_text(px));
     Problems::quote_kind_of(3, a_spec);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ChangedKind));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ChangedKind));
     Problems::issue_problem_segment(
         "Before reading %1, I already knew that '%2' is %3, "
         "and it is too late to change now.");
@@ -1731,7 +1731,7 @@ contradicted.
             Problems::quote_kind(4, kind_as_declared);
         else
             Problems::quote_kind(4, Specifications::to_kind(Node::get_evaluation(px)));
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_GlobalRedeclared));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_GlobalRedeclared));
         Problems::issue_problem_segment(
             "The sentence %1 seems to tell me that '%2', which has already been "
             "declared as %4, is instead %3 - but that would be a contradiction.");
@@ -1755,7 +1755,7 @@ file: this may possibly be useful to I6 hackers.
 
     if ((var_set == FALSE) && (Kinds::Compare::eq(a_kind, K_number))) {
         Problems::quote_source(1, current_sentence);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_Sarcasm1));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_Sarcasm1));
         Problems::issue_problem_segment(
             "%1: Grateful as I generally am for your guidance, "
             "I think perhaps I could manage without this sentence.");
@@ -1777,7 +1777,7 @@ file: this may possibly be useful to I6 hackers.
     if (Kinds::Compare::eq(a_kind, K_number)) {
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, Node::get_text(px));
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_Sarcasm2));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_Sarcasm2));
         Problems::issue_problem_segment("%1: That, sir, is a damnable lie. '%2' is a number.");
         Problems::issue_problem_end();
         return;
@@ -1785,7 +1785,7 @@ file: this may possibly be useful to I6 hackers.
     if (Kinds::Compare::eq(a_kind, K_text)) {
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, Node::get_text(px));
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_Sarcasm3));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_Sarcasm3));
         Problems::issue_problem_segment("%1: And I am the King of Siam. '%2' is some text.");
         Problems::issue_problem_end();
         return;
@@ -1797,7 +1797,7 @@ file: this may possibly be useful to I6 hackers.
 
 
     Problems::quote_source(1, current_sentence);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_DescAsLiteral));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_DescAsLiteral));
     Problems::issue_problem_segment("%1: this seems to be using a description "
         "as if it were a constant value, which isn't allowed. (Descriptions "
         "can only be used as values to a limited extent.)");
@@ -1820,7 +1820,7 @@ the "creation proposition" of Y, and we now assert this to be true about X.
     if (prop) {
         if ((Calculus::Variables::number_free(prop) == 0) && (left_object)) {
             LOG("Proposition is: $D\n", prop);
-            Problems::Issue::subject_problem_at_sentence(_p_(PM_SubjectNotFree),
+            StandardProblems::subject_problem_at_sentence(_p_(PM_SubjectNotFree),
                 left_object,
                 "seems to be set equal to something in a complicated relationship "
                 "with something else again",
@@ -1849,7 +1849,7 @@ the "creation proposition" of Y, and we now assert this to be true about X.
     Silently pass sentences like "The colours are red and blue."3.3.40.1;
     if (Kinds::Compare::le(Specifications::to_kind(Node::get_evaluation(py)), K_object))
         Assertions::Maker::issue_value_equation_problem(py, px);
-    else Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_CommonIsProper),
+    else Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_CommonIsProper),
         "this seems to say that a general description is something else",
         "like saying that 'a door is 20'.");
 
@@ -1919,7 +1919,7 @@ these sentences falls into case 41. if (Rvalues::is_object(Node::get_evaluation(py))) Otherwise it's just wrong to equate objects3.3.41.2 else if (Rvalues::is_CONSTANT_construction(Node::get_evaluation(py), CON_property)) - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_ObjectIsProperty), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_ObjectIsProperty), "that seems to say that some object is a property", "like saying 'The brick building is the description': if you want to specify " "the description of the current object, try putting the sentence the other way " @@ -1927,7 +1927,7 @@ these sentences falls into case 41. else if (Node::get_subject(px)) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(px)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ObjectIsValue)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ObjectIsValue)); Problems::issue_problem_segment( "I am reading the sentence %1 as saying that a thing called " "'%2' is a value, but this makes no sense to me - it would be " @@ -1942,7 +1942,7 @@ these sentences falls into case 41.
     if (Assertions::Traverse::get_current_subject() == NULL) {
-        Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_NoMapOrigin),
+        Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_NoMapOrigin),
             "no location is under discussion to be the origin of this map connection",
             "so this is like starting with 'North is the Aviary': I can't tell where from.");
         return;
@@ -1953,7 +1953,7 @@ these sentences falls into case 41.
     }
     if (traverse == 2) {
         if (target == NULL) {
-            Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_MapNonObject),
+            Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_MapNonObject),
                 "this seems to make a map connection to something which is "
                 "not an object",
                 "like saying '20 is north'. This is an odd thing "
@@ -1973,12 +1973,12 @@ these sentences falls into case 41.
     Problems::quote_wording(3, Node::get_text(py));
 
     if (Node::get_subject(px) == Node::get_subject(py))
-        Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_ProperIsItself),
+        Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_ProperIsItself),
             "this seems to say that something is itself",
             "like saying 'the coin is the coin'. This is an odd thing "
             "to say, and makes me think that I've misunderstood you.");
     else if (<control-structure-phrase>(Node::get_text(px))) {
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_IfInAssertion));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_IfInAssertion));
         Problems::issue_problem_segment(
             "I am reading the sentence %1 as a declaration of the initial "
             "state of the world, so I'm expecting that it will be definite. "
@@ -2001,7 +2001,7 @@ these sentences falls into case 41.
 
     Problems::quote_kind_of(4, Node::get_evaluation(px));
     Problems::quote_kind_of(5, Node::get_evaluation(py));
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ObjectAndValueEquated));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ObjectAndValueEquated));
     Problems::issue_problem_segment(
         "The sentence %1 seems to say that '%2', which I think is %4, and "
         "'%3', which I think is %5, are the same. %P"
@@ -2019,7 +2019,7 @@ these sentences falls into case 41.
 
 
     Choose random antagonists for variety3.3.41.2.2.1;
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ChalkCheese));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ChalkCheese));
     Problems::issue_problem_segment(
         "The sentence %1 appears to say two things are the same - I am reading '%2' "
         "and '%3' as two different things, and therefore it makes no sense to say "
@@ -2028,7 +2028,7 @@ these sentences falls into case 41.
         "properties: for instance '%6 is a lighted room' says that something "
         "called %6 exists and that it is a 'room', which is a kind I know about, "
         "combined with a property called 'lighted' which I also know about.");
-    Problems::Issue::diagnose_further();
+    Problems::Using::diagnose_further();
     Problems::issue_problem_end();
 
@@ -2119,13 +2119,13 @@ yet during traverse 1. if (Rvalues::is_CONSTANT_construction(Node::get_evaluation(px), CON_property)) { inference_subject *talking_about = Assertions::Traverse::get_current_subject(); if (talking_about == NULL) - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_NothingDiscussed), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_NothingDiscussed), "nothing is under discussion which might have this property", "so this is like starting with 'The description is \"Orange.\"': " "I can't tell what of."); else if (traverse == 2) { if (<negated-clause>(Node::get_text(py))) - Problems::Issue::negative_sentence_problem(Task::syntax_tree(), _p_(PM_NonValue2)); + StandardProblems::negative_sentence_problem(Task::syntax_tree(), _p_(PM_NonValue2)); else Assertions::PropertyKnowledge::assert_property_value_from_property_subtree_infs( Rvalues::to_property(Node::get_evaluation(px)), talking_about, py); } @@ -2224,14 +2224,14 @@ need to switch interpretations to avoid the problem message. if (Kinds::Compare::eq(Specifications::to_kind(Node::get_evaluation(px)), Specifications::to_kind(Node::get_evaluation(py)))) { - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_SimilarValuesEquated)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_SimilarValuesEquated)); Problems::issue_problem_segment( "Before reading %1, I already knew that '%2' is %4 and " "'%3' likewise: so they are specific values, and saying " "that they are equal will not make it so."); Problems::issue_problem_end(); } else { - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_DissimilarValuesEquated)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_DissimilarValuesEquated)); Problems::issue_problem_segment( "Before reading %1, I already knew that '%2' is %4 and " "'%3' is %5: so they are specific values, and saying " @@ -2262,7 +2262,7 @@ referring to a thing which then can't be equated with a colour.

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_EquatesSomethingToValue),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_EquatesSomethingToValue),
         "that seems to say that an object is the same as a value",
         "which must be wrong. This can happen if the word 'something' is "
         "used loosely - I read it as 'some thing', so I think it has to "
@@ -2292,7 +2292,7 @@ can also be used adjectivally.
         return;
     }
 
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
         "that seems to relate an adjective to something",
         "which must be wrong. (This can sometimes happen if the same word can "
         "be used both as an adjective and a noun, and I misunderstand.)");
@@ -2332,7 +2332,7 @@ can also be used adjectivally.
         Problems::quote_wording(1, Node::get_text(px));
         Problems::quote_source(2, current_sentence);
         Problems::quote_source(3, InferenceSubjects::where_created(Node::get_subject(px)));
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_CantUncreate));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_CantUncreate));
         Problems::issue_problem_segment(
             "In order to act on %2, I seem to need to give "
             "a new meaning to '%1', something which was created by the earlier "
@@ -2351,7 +2351,7 @@ can also be used adjectivally.
         Problems::quote_wording(2, Node::get_text(py));
         if (Wordings::nonempty(Node::get_text(px))) Problems::quote_wording(3, Node::get_text(px));
         else Problems::quote_text(3, "(something not given an explicit name)");
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_IdentityUnclear));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_IdentityUnclear));
         Problems::issue_problem_segment(
             "The sentence %1 seems to tell me that '%2' and '%3' have to be "
             "the same, but it looks odd to me. '%2' is something generic - "
@@ -2362,7 +2362,7 @@ can also be used adjectivally.
         return;
     }
 
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
         "that seems to say that an object is the same as a value",
         "which must be wrong.");
 }
diff --git a/docs/core-module/9-pd.html b/docs/core-module/9-pd.html
index 86a20b5d9..7d88540d3 100644
--- a/docs/core-module/9-pd.html
+++ b/docs/core-module/9-pd.html
@@ -155,7 +155,7 @@ named value properties. We'll take the first of those first.
 
 
     *X = -1;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PropertyOfKind1),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PropertyOfKind1),
         "this seems to give a property to all kinds, rather than to objects or "
         "values",
         "which are the only things capable of having properties. For instance, "
@@ -168,7 +168,7 @@ named value properties. We'll take the first of those first.
 
 
     *X = -1;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PropertyOfPronoun),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PropertyOfPronoun),
         "it's often a little ambiguous to declare properties for 'it'",
         "so it seems best to spell this out by saying exactly what the "
         "property's owner or owners would be.");
@@ -282,7 +282,7 @@ which might take forms such as:
 
 
     if ((Wordings::nonempty(CNW)) && (count < 3)) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ThisIsEitherOr),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ThisIsEitherOr),
             "a name can only be supplied using '... (this is...)' when a new property "
             "is being made with three or more named alternatives",
             "whereas here a simpler either/or property is being made with just one or "
@@ -299,7 +299,7 @@ which might take forms such as:
 
 
     if (Node::get_type(the_owner) == WITH_NT) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_QualifiedCanBe),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_QualifiedCanBe),
             "only a room, a thing or a kind can have such adjectives applied to it",
             "and qualifications cannot be used. It makes no sense to say 'An open door "
             "can be rickety or sturdy' because the door still has to have the property "
@@ -329,7 +329,7 @@ differently as a result.
 
 
     if ((either_flag) && (count != 2)) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_EitherOnThree),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_EitherOnThree),
             "that looks like an attempt to use 'either' other than to lay out exactly "
             "two possibilities",
             "which is not allowed. (Technically it ought to be legal to have a property "
@@ -365,7 +365,7 @@ differently as a result.
 
     Problems::quote_source(1, current_sentence);
     Problems::quote_kind(2, K);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ValueCantHaveProperties));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ValueCantHaveProperties));
     Problems::issue_problem_segment(
         "The sentence %1 looked to me as if it might be trying to create an either/or "
         "property which would be held by all of the values of a rather large kind "
@@ -385,7 +385,7 @@ differently as a result.
 
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, Node::get_text(the_owner));
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_VariableCantHaveProperties));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_VariableCantHaveProperties));
     Problems::issue_problem_segment(
         "The sentence %1 looked to me as if it might be trying to create an either/or "
         "property which would be held by a variable ('%2'). But because '%2' can have "
@@ -404,7 +404,7 @@ differently as a result.
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_OwnerTimeDependent),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_OwnerTimeDependent),
         "ownership of a property is something that has to be always true or "
         "always false",
         "so that 'a room can be secret' is fine - a room is always a room - "
@@ -419,7 +419,7 @@ differently as a result.
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NonObjectCanBe),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NonObjectCanBe),
         "only a room, a thing or a kind can have such adjectives applied to it",
         "so that 'a dead end can be secret' is fine but 'taking can be secret' would "
         "not be, since 'taking' is an action and not a room, thing or kind.");
@@ -453,7 +453,7 @@ differently as a result.
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, EW);
         Problems::quote_text(3, error_text);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_MiscellaneousEOProblem));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_MiscellaneousEOProblem));
         Problems::issue_problem_segment(
             "In %1, you proposed the new either/or property '%2': but %3.");
         Problems::issue_problem_end();
@@ -619,7 +619,7 @@ there would be horrible ambiguities in parsing.
             Problems::quote_source(1, current_sentence);
             Problems::quote_wording(2, PW);
             Problems::quote_spec(3, spec);
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyAlreadyKnown));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyAlreadyKnown));
             Problems::issue_problem_segment(
                 "In %1, one of the values you supply as a possibility is '%2', but this "
                 "already has a meaning (as %3).");
@@ -641,7 +641,7 @@ there would be horrible ambiguities in parsing.
     if ((already) && (Properties::is_either_or(already))) {
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, PW);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_EOClashesWithCondition));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_EOClashesWithCondition));
         Problems::issue_problem_segment(
             "In %1, one of the values you supply as a possibility is '%2', but this "
             "already has a meaning as an either-or property. The same adjective "
@@ -699,7 +699,7 @@ automatically creates it.
 
     if ((<k-kind>(Node::get_text(p))) &&
         ((<<rp>> == K_number) || (<<rp>> == K_text))) {
-        Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_BareProperty),
+        Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_BareProperty),
             "this would create a property called 'number' or 'text'",
             "and although bare names of kinds are usually allowed as properties, "
             "these aren't. Instead, try '... has a number called position.' or "
@@ -723,12 +723,12 @@ automatically creates it.
     if ((Kinds::Compare::eq(K, K_action_name)) ||
         (Kinds::get_construct(K) == CON_activity) ||
         (Kinds::get_construct(K) == CON_rulebook))
-    Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_ValueCantHaveVProperties2),
+    Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_ValueCantHaveVProperties2),
         "this is a kind of value which is not allowed to have properties of its own",
         "because this would cause confusion with variables, which are more useful in "
         "most cases. (See the Kinds index for which kinds can have properties.)");
     else
-    Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_ValueCantHaveVProperties),
+    Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_ValueCantHaveVProperties),
         "this is a kind of value which is not allowed to have properties of its own",
         "because this would be impossible to store in any sensible way. For instance, "
         "'A scene has a number called difficulty.' is fine because there are not many "
@@ -802,7 +802,7 @@ several property names, e.g., in
     if (Specifications::is_new_variable_like(spec)) {
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, Node::get_text(kind_ref));
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RedundantThatVaries));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RedundantThatVaries));
         Problems::issue_problem_segment(
             "You wrote %1, which I am reading as a request to make a new named property - "
             "a value associated with an object and which has a name. But you write this "
@@ -814,7 +814,7 @@ several property names, e.g., in
     } else if (Specifications::is_description(spec)) {
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, Node::get_text(kind_ref));
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyTooSpecific));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyTooSpecific));
         Problems::issue_problem_segment(
             "You wrote %1, which I am reading as a request to make a new named property - "
             "a value associated with an object and which has a name. The request seems to "
@@ -826,7 +826,7 @@ several property names, e.g., in
     } else {
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, Node::get_text(kind_ref));
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyKindUnknown));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyKindUnknown));
         Problems::issue_problem_segment(
             "You wrote %1, but '%2' is not the name of a kind of value which I know (such "
             "as 'number' or 'text').");
@@ -843,7 +843,7 @@ several property names, e.g., in
         if (prn == P_variable_initial_value) return;
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, Node::get_text(kind_ref));
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyKindVague));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyKindVague));
         Problems::issue_problem_segment(
             "You wrote %1, but saying that a property is a 'value' does not give me a clear "
             "enough idea what it will hold. You need to say what kind of value: for instance, "
@@ -862,7 +862,7 @@ several property names, e.g., in
     Problems::quote_wording(2, Node::get_text(kind_ref));
     Problems::quote_property(3, prn);
     Problems::quote_kind(4, current_kind);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyKindClashes));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyKindClashes));
     Problems::issue_problem_segment(
         "You wrote %1, but '%2' contradicts what I previously thought about the property "
         "%3, which was that it was %4.");
diff --git a/docs/core-module/9-pk.html b/docs/core-module/9-pk.html
index 36d1ee3ef..b8193f222 100644
--- a/docs/core-module/9-pk.html
+++ b/docs/core-module/9-pk.html
@@ -145,14 +145,14 @@ equal. So the proposition has to pass typechecking.
     Problems::quote_kind(5, constant_kind);
     if ((Kinds::Compare::lt(kind_as_declared, K_object)) &&
         (Rvalues::is_nothing_object_constant(val))) {
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_QuantityKindNothing));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_QuantityKindNothing));
         Problems::issue_problem_segment(
             "The sentence %1 tells me that '%2', which should be %4 that varies, is to "
             "have the initial value 'nothing'. This is allowed as an 'object which varies', "
             "but the rules are stricter for %4.");
         Problems::issue_problem_end();
     } else {
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_GlobalKindWrong));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_GlobalKindWrong));
         Problems::issue_problem_segment(
             "The sentence %1 tells me that '%2', which is %4 that varies, "
             "should start out with the value '%3', but this is %5 and not %4.");
@@ -163,7 +163,7 @@ equal. So the proposition has to pass typechecking.
                 "I often assume that it's meant to be a new object. So it may "
                 "be that you intended '%3' to be something quite different, "
                 "but I just didn't get it.");
-        Problems::Issue::diagnose_further();
+        Problems::Using::diagnose_further();
         Problems::issue_problem_end();
     }
     return;
@@ -238,7 +238,7 @@ are typechecked at run-time rather than compile-time in that domain.)
             (Calculus::Propositions::contains_adjective(Specifications::to_proposition(owner_spec)))) {
             Problems::quote_source(1, current_sentence);
             Problems::quote_spec(2, owner_spec);
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RelationAPL));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RelationAPL));
             Problems::issue_problem_segment(
                 "The sentence %1 looked to me as if it might be trying to assign certain "
                 "properties to something described in a way (%2) which involved a clause "
@@ -255,7 +255,7 @@ are typechecked at run-time rather than compile-time in that domain.)
 
 
     Problems::quote_source(1, current_sentence);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PropForBadKOV));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PropForBadKOV));
     Problems::issue_problem_segment(
         "The sentence %1 looked to me as if it might be trying to assign certain properties "
         "to something which is not allowed to have them.");
@@ -298,7 +298,7 @@ the proposition machinery.
 
     Problems::quote_source(1, current_sentence);
     Problems::quote_property(3, prn);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_HasBareAdjective));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_HasBareAdjective));
     Problems::issue_problem_segment(
         "In %1 you write about the %3 property as if it were some kind of value "
         "or possession, but %3 is an either/or property - something is either "
@@ -315,7 +315,7 @@ the proposition machinery.
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, Node::get_text(py));
     Problems::quote_property(3, prn);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
     Problems::issue_problem_segment(
         "In %1 you give a value of the %3 property as '%2', but %3 is an either/or "
         "property - something is either %3 or not, so there is no value involved.");
@@ -335,7 +335,7 @@ the proposition machinery.
                 Problems::quote_source(1, current_sentence);
                 Problems::quote_wording(2, Node::get_text(py));
                 Problems::quote_property(3, prn);
-                Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyValueUnknown));
+                StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyValueUnknown));
                 Problems::issue_problem_segment(
                     "You wrote %1, but that seems to set a property %3 to the "
                     "value '%2', which I don't recognise as meaning anything.");
@@ -344,7 +344,7 @@ the proposition machinery.
             }
             break;  (this is fine — there's a well-expressed value)
         case COMMON_NOUN_NT:
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PropertyInstance),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PropertyInstance),
                 "this property value makes no sense to me",
                 "since it looks as if it contains a relative clause. Sometimes this "
                 "happens if a clause follows directly on, and I have misunderstood to "
@@ -354,13 +354,13 @@ the proposition machinery.
                 "applying to the door.");
             return NULL;
         case X_OF_Y_NT:
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
                 "something grammatically odd has happened here",
                 "possibly to do with the unexpected 'of' in what seems to be a list of "
                 "property values?");
             return NULL;
         case WITH_NT:
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_MisplacedFrom),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_MisplacedFrom),
                 "something grammatically odd has happened here",
                 "possibly to do with the unexpected 'with' in what seems "
                 "to be a list of property values? Maybe there is some punctuation missing.");
@@ -369,7 +369,7 @@ the proposition machinery.
             Problems::quote_source(1, current_sentence);
             Problems::quote_wording(2, Node::get_text(py));
             Problems::quote_property(3, prn);
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PeculiarPropertyValue));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PeculiarPropertyValue));
             Problems::issue_problem_segment(
                 "You wrote %1, but that seems to set a property %3 to the "
                 "value '%2', which really doesn't make sense.");
@@ -386,7 +386,7 @@ the proposition machinery.
     Problems::quote_wording(2, Node::get_text(py));
     Problems::quote_kind(3, property_kind);
     Problems::quote_property(4, prn);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyNonConstant));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyNonConstant));
     Problems::issue_problem_segment(
         "In %1 you give a value of the %4 property as '%2', "
         "and while this does make sense as %3, it is a value which "
diff --git a/docs/core-module/9-rk.html b/docs/core-module/9-rk.html
index 34c1b4636..8cc3a82dc 100644
--- a/docs/core-module/9-rk.html
+++ b/docs/core-module/9-rk.html
@@ -127,7 +127,7 @@ objects or values, but there are two exceptional cases to take care of.
 
 
     if (Node::get_subject(value) == NULL) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_HereFailedOnNothing),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_HereFailedOnNothing),
             "that is an assertion which puts nothing 'here'",
             "which looks as if it might be trying to give me negative rather "
             "than positive information. There's no need to tell me something "
@@ -152,12 +152,12 @@ objects or values, but there are two exceptional cases to take care of.
     if (iy == NULL) {
         if (Rvalues::is_nothing_object_constant(
             Node::get_evaluation(relationship_subtree->down)))
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_MapFromNowhere),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_MapFromNowhere),
                 "the source of a map connection can't be nowhere",
                 "so sentences like 'The pink door is south of nowhere.' are not "
                 "allowed.");
         else
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_MapFromNonroom2),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_MapFromNonroom2),
                 "the source of a map connection has to be a room or door",
                 "so sentences like 'The pink door is south of 0.' are not "
                 "allowed.");
@@ -171,7 +171,7 @@ objects or values, but there are two exceptional cases to take care of.
         PL::Map::connect(iy, Node::get_subject(value), id);
     else {
         LOG("Val is $P\n", value);
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_MapToNonobject),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_MapToNonobject),
             "the destination of a map connection has to be either a room, "
             "a door or 'nowhere'",
             "but here the destination doesn't even seem to be an object.");
@@ -188,13 +188,13 @@ objects or values, but there are two exceptional cases to take care of.
         (relationship_subtree->down->next->next != NULL))
         internal_error("malformed DIRECTION");
     if (Node::get_type(relationship_subtree->down) != PROPER_NOUN_NT) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
             "this is not straightforward in saying which room (or door) leads away from",
             "and should just name the source.");
         break;
     }
     if (Node::get_type(relationship_subtree->down->next) != PROPER_NOUN_NT) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
             "this is not straightforward in saying which direction the room (or door) lies in",
             "and should just name the direction.");
         break;
@@ -254,7 +254,7 @@ that subtrees \(T_X\) and \(T_Y\), where \(T_X\) is a single value or object and
 
     if (((Node::get_type(px) != PROPER_NOUN_NT) && (Node::get_type(px) != COMMON_NOUN_NT)) ||
         ((Node::get_type(py) != PROPER_NOUN_NT) && (Node::get_type(py) != COMMON_NOUN_NT))) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadRelation),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadRelation),
             "this description of a relationship makes no sense to me",
             "and should be something like 'X is in Y' (or 'on' or 'part of Y'); "
             "or else 'X is here' or 'X is east of Y'.");
@@ -272,7 +272,7 @@ that subtrees \(T_X\) and \(T_Y\), where \(T_X\) is a single value or object and
     if ((BinaryPredicates::relates_values_not_objects(bp)) &&
         (((Node::get_subject(px)) && (InferenceSubjects::domain(Node::get_subject(px)))) ||
         ((Node::get_subject(py)) && (InferenceSubjects::domain(Node::get_subject(py)))))) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_KindRelatedToValue),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_KindRelatedToValue),
             "relations between objects and values have to be made one "
             "object at a time",
             "not using kinds of object to make multiple relationships in "
@@ -287,7 +287,7 @@ that subtrees \(T_X\) and \(T_Y\), where \(T_X\) is a single value or object and
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_EveryWrongSide),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_EveryWrongSide),
         "'every' can only be used on the other side of the verb",
         "because of limitations in Inform (but also to avoid certain possible "
         "ambiguities). In general, 'every' should be applied to the subject of an "
diff --git a/docs/core-module/9-rpt.html b/docs/core-module/9-rpt.html
index ce140824f..18c32f94d 100644
--- a/docs/core-module/9-rpt.html
+++ b/docs/core-module/9-rpt.html
@@ -343,7 +343,7 @@ from the tree.
     }
     Assertions::Refiner::refine(p->down, FORBID_CREATION);
     if (Annotations::read_int(p->down, multiplicity_ANNOT) > 1) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_MultipleCalled),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_MultipleCalled),
             "I can only make a single 'called' thing at a time",
             "or rather, the 'called' is only allowed to apply to one thing "
             "at a time. For instance, 'A thing called a vodka and tonic is "
@@ -352,7 +352,7 @@ from the tree.
     }
     forbid_nowhere = TRUE;
     if (creation_rule == FORBID_CREATION)
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
             "'called' can't be used in this context",
             "and is best reserved for full sentences.");
     else Assertions::Refiner::refine(p->down->next, MANDATE_CREATION);
@@ -437,14 +437,14 @@ inference subject representing the domain to which any new kind would belong.
 
     if ((InferenceSubjects::is_an_object(kind_of_what)) ||
         (InferenceSubjects::is_a_kind_of_object(kind_of_what))) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_KindOfInstance),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_KindOfInstance),
             "kinds can only be made from other kinds",
             "so 'a kind of container' is allowed but 'a kind of Mona Lisa' (where "
             "Mona Lisa is a specific thing you've already made), wouldn't be "
             "allowed. There is only one Mona Lisa.");
         kind_of_what = Kinds::Knowledge::as_subject(K_object);
     } else {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_KindOfActualValue),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_KindOfActualValue),
             "I don't recognise that as a kind",
             "such as 'room' or 'door': it would need to be straightforwardly the name "
             "of a kind, and not be qualified with adjectives like 'open'.");
@@ -456,7 +456,7 @@ inference subject representing the domain to which any new kind would belong.
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_KindOfExotica),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_KindOfExotica),
         "you are only allowed to create kinds of objects (things, rooms, and "
         "so on) and kinds of 'value'",
         "so for example 'colour is a kind of value' is allowed but 'prime is "
@@ -571,14 +571,14 @@ thing. (If we had more and better pronouns, they would go here.)
         if ((<nominative-pronoun>(Node::get_text(p))) &&
             (<<r>> == 2) &&
             (Assertions::Traverse::get_current_subject_plurality())) {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_EnigmaticThey),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_EnigmaticThey),
                 "I'm unable to handle 'they' here",
                 "since it looks as if it needs to refer to more than one "
                 "object here, and that's something I can't manage.");
             return;
         }
         if (Assertions::Traverse::get_current_object() == NULL) {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_EnigmaticPronoun),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_EnigmaticPronoun),
                 "I'm not sure what to make of the pronoun here",
                 "since it is unclear what previously mentioned thing "
                 "is being referred to. In general, it's best only to use "
@@ -643,7 +643,7 @@ property name meaning, not as the name of a kind of value.)
 
 
     *X = FALSE;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_VagueVariable),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_VagueVariable),
         "'variable' is too vague a description",
         "because it doesn't say what kind of value should go into the variable. "
         "'number variable' or 'a number that varies' - whatever kind of value you "
@@ -697,7 +697,7 @@ a noun instead of a condition testing the current action.
 
     if (Quantifiers::can_be_used_in_assertions(Descriptions::get_quantifier(spec)) == FALSE) {
         LOG("$T\nSo $D\n", current_sentence, Specifications::to_proposition(spec));
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ComplexDeterminer),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ComplexDeterminer),
             "complicated determiners are not allowed in assertions",
             "so for instance 'More than three people are in the Dining Room' "
             "or 'None of the containers is open' will be rejected. Only "
@@ -714,7 +714,7 @@ a noun instead of a condition testing the current action.
             Node::set_type(p, EVERY_NT);
             return;
         }
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ComplexEvery),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ComplexEvery),
             "in an assertion 'every' or 'all' can only be used with a kind",
             "so for instance 'A coin is in every container' is all right, "
             "because 'container' is a kind, but not 'A coin is in every "
diff --git a/docs/core-module/9-tbath.html b/docs/core-module/9-tbath.html
index 5a434218b..90afb521c 100644
--- a/docs/core-module/9-tbath.html
+++ b/docs/core-module/9-tbath.html
@@ -119,7 +119,7 @@ relationship as well as the noun).
     if ((Wordings::length(Node::get_text(px)) > 1)
         && (Vocabulary::test_flags(
             Wordings::first_wn(Node::get_text(px)), TEXT_MC+TEXTWITHSUBS_MC))) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TextNotClosing),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TextNotClosing),
             "it looks as if perhaps you did not intend that to read as a "
             "single sentence",
             "and possibly the text in quotes was supposed to stand as "
@@ -171,7 +171,7 @@ called in traverse 2, when there are no uses of "to have" left in the tree.
 
 
     if (Node::get_type(py) == X_OF_Y_NT) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_SuperfluousOf),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_SuperfluousOf),
             "the 'of' here appears superfluous",
             "assuming the sentence aims to give a property value of something. "
             "(For instance, if we want to declare the carrying capacity of "
@@ -181,7 +181,7 @@ called in traverse 2, when there are no uses of "to have" left in the tree.
         return;
     }
     if (Node::get_type(py) == WITH_NT) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_SuperfluousWith),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_SuperfluousWith),
             "the 'has ... with' here appears to be a mixture of two ways to "
             "give something properties",
             "that is, 'The box is a container with capacity 10.' and 'The box "
@@ -199,7 +199,7 @@ as a PROPERTYCALLED_NT
 
 
     if (Wordings::match(Node::get_text(py->down->next), Node::get_text(py->down))) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_SuperfluousCalled),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_SuperfluousCalled),
             "'called' should be used only when the name is different from the kind",
             "so this sentence should be simplified. For example, 'A door has a "
             "colour called colour' should be written more simply as 'A door has "
@@ -363,7 +363,7 @@ conclusion we would have reached.
             (Kinds::Compare::eq(K_object, InferenceSubjects::as_kind(Node::get_subject(py)))))
             Assertions::Creator::convert_instance_to_nounphrase(py, NULL);
         else
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ThereIsVague),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ThereIsVague),
                 "'there is...' can only be used to create objects",
                 "and not instances of other kinds.'");
     }
diff --git a/docs/core-module/9-tc.html b/docs/core-module/9-tc.html
index 01419cbb7..bc451594b 100644
--- a/docs/core-module/9-tc.html
+++ b/docs/core-module/9-tc.html
@@ -445,7 +445,7 @@ both of which are excised and replaced with 
     if ((prevailing_mood == IMPOSSIBLE_CE) || (prevailing_mood == UNLIKELY_CE)) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NegativeCreation),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NegativeCreation),
             "sentences are only allowed to say that things do exist",
             "not that they don't.");
     }
@@ -556,7 +556,7 @@ disappears from the tree entirely when the creator has finished work.
 
 
     LOG("$T\n", what_to_make_node);
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CalledWithoutKind),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CalledWithoutKind),
         "I can only make 'a something called whatever' when the something is a kind I know",
         "possibly qualified with adjectives. For instance, 'an open door called the Marble "
         "Door' is fine because 'door' is the name of a kind and 'open' is an adjective "
@@ -655,7 +655,7 @@ it handles crashes correctly.
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NameIsArticle),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NameIsArticle),
         "this seems to give something a name which consists only of an article",
         "that is, 'a', 'an', 'the' or 'some'. This is not allowed since the "
         "potential for confusion is too high. (If you need, say, a room which "
@@ -667,7 +667,7 @@ it handles crashes correctly.
 

-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NameWithBrackets),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NameWithBrackets),
             "this seems to give something a name which contains brackets '(' or ')'",
             "which is not allowed since the potential for confusion with other uses "
             "for brackets in Inform source text is too high. (If you need, say, a "
@@ -682,11 +682,11 @@ it handles crashes correctly.
 
     WRITE_TO(STDERR, "*** Exit(1) requested for testing purposes ***\n");
     STREAM_FLUSH(STDERR);
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_Crash1),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_Crash1),
         "this uses the first secret hieroglyph of dreadful power",
         "which forces me to crash. (It's for testing the way I crash, in fact. "
         "If this is a genuine inconvenience to you, get in touch with my authors.)");
-    Problems::Fatal::exit(1);
+    ProblemSigils::exit(1);
 
  • This code is used in §6.

§6.4. Issue PM_Crash10 problem6.4 = @@ -695,11 +695,11 @@ it handles crashes correctly.

     WRITE_TO(STDERR, "*** Exit(10) requested for testing purposes ***\n");
     STREAM_FLUSH(STDERR);
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_Crash10),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_Crash10),
         "this uses the second secret hieroglyph of dreadful power",
         "which forces me to crash. (It's for testing the way I crash, in fact. "
         "If this is a genuine inconvenience to you, get in touch with my authors.)");
-    Problems::Fatal::exit(10);
+    ProblemSigils::exit(10);
 
  • This code is used in §6.

§6.5. Issue PM_Crash11 problem6.5 = @@ -708,11 +708,11 @@ it handles crashes correctly.

     WRITE_TO(STDERR, "*** Exit(11) requested for testing purposes ***\n");
     STREAM_FLUSH(STDERR);
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_Crash11),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_Crash11),
         "this uses the third secret hieroglyph of dreadful power",
         "which forces me to crash. (It's for testing the way I crash, in fact. "
         "If this is a genuine inconvenience to you, get in touch with my authors.)");
-    Problems::Fatal::exit(11);
+    ProblemSigils::exit(11);
 
  • This code is used in §6.

§6.6. Issue PM_StartsWithComma problem6.6 = @@ -720,7 +720,7 @@ it handles crashes correctly.

     LOG("$T\n", current_sentence);
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_StartsWithComma),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_StartsWithComma),
         "this seems to refer to something whose name begins with a comma",
         "which is forbidden. Perhaps you used a comma in punctuating a sentence? "
         "Inform generally doesn't like this because it reserves commas for "
@@ -731,7 +731,7 @@ it handles crashes correctly.
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_EndsWithComma),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_EndsWithComma),
         "this seems to refer to something whose name ends with a comma",
         "which is forbidden. Perhaps you used a comma in punctuating a sentence? "
         "Inform generally doesn't like this because it reserves commas for "
@@ -744,7 +744,7 @@ it handles crashes correctly.
 
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, W);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ObjectIncWhen));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ObjectIncWhen));
     Problems::issue_problem_segment(
         "The sentence %1 seems to be talking about a previously unknown room or "
         "thing called %2. Ordinarily, I would create this, but because the name "
@@ -766,7 +766,7 @@ it handles crashes correctly.
 

-    Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_NameWithText),
+    Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_NameWithText),
         "this seems to give something a name which contains "
         "double-quoted text",
         "which is not allowed. If you do need quotes in a name, one option "
@@ -782,7 +782,7 @@ it handles crashes correctly.
 

-    Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_NameReserved),
+    Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_NameReserved),
         "this seems to give something a name which is reserved for Inform's "
         "own internal use",
         "so is not allowed. There are only a few of these - 'storage', "
@@ -988,7 +988,7 @@ them by asserting propositions to be true; we act directly.
 

-    Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_NoTopicsThatVary),
+    Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_NoTopicsThatVary),
         "'topics that vary' are not allowed",
         "that is, a variable is not allowed to have 'topic' as its kind of value. "
         "(This would cause too much ambiguity with text variables, whose values "
@@ -1003,7 +1003,7 @@ them by asserting propositions to be true; we act directly.
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, W);
         Problems::quote_kind(3, create_as);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_MixedConstantsEquation));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_MixedConstantsEquation));
         Problems::issue_problem_segment(
             "The sentence %1 reads to me as if '%2' refers to something "
             "I should create as brand new - %3. But that can't be right, "
@@ -1014,7 +1014,7 @@ them by asserting propositions to be true; we act directly.
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, W);
         Problems::quote_kind(3, create_as);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_MixedConstants));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_MixedConstants));
         Problems::issue_problem_segment(
             "The sentence %1 reads to me as if '%2' refers to something "
             "I should create as brand new - %3. But that can't be right, "
@@ -1033,7 +1033,7 @@ them by asserting propositions to be true; we act directly.
     Problems::quote_wording(2, W);
     Problems::quote_kind(3, create_as);
     Problems::quote_table(4, Tables::Defining::defined_by_table(create_as));
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TableOfExistingKind2));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TableOfExistingKind2));
         Problems::issue_problem_segment(
             "The sentence %1 reads to me as if '%2' refers to something "
             "I should create as brand new - %3. That looks reasonable, since "
@@ -1056,7 +1056,7 @@ if nothing has already been said:
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, W);
         Problems::quote_kind(3, create_as);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NoNewInstances));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NoNewInstances));
         Problems::issue_problem_segment(
             "The sentence %1 reads to me as if '%2' refers to something "
             "I should create as brand new - %3. But that can't be right, "
@@ -1149,7 +1149,7 @@ object.
 
     Problems::quote_source(1, current_sentence);
     Problems::quote_kind(2, instance_kind);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_CantCreateImplicitly));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_CantCreateImplicitly));
     Problems::issue_problem_segment(
         "The sentence %1 seems to be asking me to create a new value (%2) "
         "in order to be part of a relationship, but this isn't a kind of "
@@ -1165,7 +1165,7 @@ object.
 
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, CW);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_CalledArticle));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_CalledArticle));
     Problems::issue_problem_segment(
         "The sentence %1 seems to be asking me to create something whose "
         "name, '%2', is just an article - this isn't allowed.");
@@ -1188,7 +1188,7 @@ message says about performance, too.)
     instance_count = Annotations::read_int(p, multiplicity_ANNOT);
     if (instance_count < 1) instance_count = 1;
     if (instance_count > MAX_DUPLICATES_AT_ONCE) {
-        Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_TooManyDuplicates),
+        Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_TooManyDuplicates),
             "at most 100 duplicates can be made at any one time",
             "so '157 chairs are in the UN General Assembly' will not be allowed. The "
             "system for handling duplicates during play becomes too slow and awkward "
@@ -1390,7 +1390,7 @@ For example, property names can't be unsuitable, but they can be unfortunate.
 
 int Assertions::Creator::vet_name_for_noun(wording W) {
     if (<unfortunate-name>(W)) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NameBestAvoided),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NameBestAvoided),
             "this is a name which is best avoided",
             "because it would lead to confusion inside Inform. In general, try "
             "to avoid punctuation, quotation marks, or the words 'with' or "
diff --git a/docs/core-module/9-tfa.html b/docs/core-module/9-tfa.html
index 6d6491fef..50e37caa0 100644
--- a/docs/core-module/9-tfa.html
+++ b/docs/core-module/9-tfa.html
@@ -357,7 +357,7 @@ for the telemetry file.
         telemetry_recording = TRUE;
         Telemetry::write_to_telemetry_file(Lexer::word_text(Wordings::last_wn(Node::get_text(PN))));
         telemetry_recording = FALSE;
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TelemetryAccepted),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TelemetryAccepted),
             "that's a message for the Author, not me",
             "so I'll note it down in the Telemetry file (if you're keeping one.)");
          telemetry_recording = tr;
@@ -449,7 +449,7 @@ to bite.
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RuleWithoutColon),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RuleWithoutColon),
         "I can't find a verb that I know how to deal with, so can't do anything "
         "with this sentence. It looks as if it might be a rule definition",
         "but if so then it is lacking the necessary colon (or comma). "
@@ -462,7 +462,7 @@ to bite.
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_IfOutsidePhrase),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_IfOutsidePhrase),
         "I can't find a verb that I know how to deal with. This looks like an 'if' "
         "phrase which has slipped its moorings",
         "so I am ignoring it. ('If' phrases, like all other such "
@@ -477,7 +477,7 @@ to bite.
 
 
     Problems::quote_source(1, current_sentence);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NoSuchVerbComma));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NoSuchVerbComma));
     Problems::issue_problem_segment(
         "In the sentence %1, I can't find a verb that I know how to deal with. "
         "(I notice there's a comma here, which is sometimes used to abbreviate "
@@ -496,7 +496,7 @@ to bite.
 
     LOG("$T\n", current_sentence);
     Problems::quote_source(1, current_sentence);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NoSuchVerb));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NoSuchVerb));
     Problems::issue_problem_segment(
         "In the sentence %1, I can't find a verb that I know how to deal with.");
     Problems::issue_problem_end();
@@ -518,7 +518,7 @@ but the ability does exist, and we defend it a little here:
                 Wordings::one_word(Wordings::last_wn(Node::get_text(p->down->next)) + 1));
             Problems::quote_wording(3, Node::get_text(p->down->next));
             Problems::quote_wording(4, Node::get_text(p->down->next->next));
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
             if (Wordings::nonempty(Node::get_text(p->down->next->next)))
                 Problems::issue_problem_segment(
                     "I must be misreading the sentence %1. The verb "
@@ -588,7 +588,7 @@ is the rubric, the second the credit line.
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TextWithoutSubject),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TextWithoutSubject),
         "I'm not sure what you're referring to",
         "that is, I can't decide to what room or thing you intend that text to belong. "
         "Perhaps you could rephrase this more explicitly? ('The description of the Inner "
diff --git a/docs/if-module/2-bd.html b/docs/if-module/2-bd.html
index c855c6bfd..58f58c552 100644
--- a/docs/if-module/2-bd.html
+++ b/docs/if-module/2-bd.html
@@ -237,7 +237,7 @@ which must match:
 
 
     *X = -1;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadEpisode),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadEpisode),
         "this is not the right way to specify how the story "
         "fits into a larger narrative",
         "and should take the form 'The story is episode 2 of "
diff --git a/docs/if-module/2-ri.html b/docs/if-module/2-ri.html
index 4c38ebcae..e49582fac 100644
--- a/docs/if-module/2-ri.html
+++ b/docs/if-module/2-ri.html
@@ -158,7 +158,7 @@ following structure contains no file handles.)
 
     *X = BOOKLET_PAYLOAD;  to recover harmlessly
     Problems::quote_wording_as_source(1, W);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NoSuchPublicRelease));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NoSuchPublicRelease));
     Problems::issue_problem_segment(
         "I don't know how to release along with %1: the only features of "
         "a release which can be marked as public or private are the 'source "
@@ -286,7 +286,7 @@ optionally be marked "public" (they appear on any website about it) or
         case EXISTING_STORY_FILE_PAYLOAD:
         case NAMED_EXISTING_STORY_FILE_PAYLOAD:
             if (TargetVMs::is_16_bit(Task::vm()) == FALSE) {
-                Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),  not usefully testable
+                StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),  not usefully testable
                     "existing story files can only be used with the Z-machine",
                     "not with the Glulx setting.");
                 return;
@@ -381,7 +381,7 @@ optionally be marked "public" (they appear on any website about it) or
 
 
     Problems::quote_source(1, p);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ReleaseAlong));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ReleaseAlong));
     Problems::issue_problem_segment(
         "I don't know how to release along with %1: the only forms I can "
         "accept are - 'Release along with cover art', '...a website', "
@@ -458,7 +458,7 @@ application sandboxing in Mac OS X in 2012 may force us to revisit this.
 
     if (Pathnames::create_in_file_system(
         Projects::materials_path(Task::project())) == FALSE) {
-        Problems::Issue::release_problem_path(_p_(Untestable),
+        StandardProblems::release_problem_path(_p_(Untestable),
             "In order to release the story file along with other "
             "resources, I tried to create a folder alongside this "
             "Inform project, but was unable to do so. The folder "
@@ -473,7 +473,7 @@ application sandboxing in Mac OS X in 2012 may force us to revisit this.
 
 
     if (Pathnames::create_in_file_system(Task::release_path()) == FALSE) {
-        Problems::Issue::release_problem_path(_p_(Untestable),
+        StandardProblems::release_problem_path(_p_(Untestable),
             "In order to release the story file along with other "
             "resources, I tried to create a folder alongside this "
             "Inform project, but was unable to do so. The folder "
@@ -484,7 +484,7 @@ application sandboxing in Mac OS X in 2012 may force us to revisit this.
     auxiliary_file *af;
     LOOP_OVER(af, auxiliary_file)
         if (Pathnames::create_in_file_system(af->folder_to_release_to) == FALSE) {
-            Problems::Issue::release_problem_path(_p_(Untestable),
+            StandardProblems::release_problem_path(_p_(Untestable),
                 "In order to release the story file along with other "
                 "resources, I tried to create a folder alongside this "
                 "Inform project, but was unable to do so. The folder "
@@ -499,7 +499,7 @@ application sandboxing in Mac OS X in 2012 may force us to revisit this.
 
 
     if (Pathnames::create_in_file_system(Task::released_interpreter_path()) == FALSE) {
-        Problems::Issue::release_problem_path(_p_(Untestable),
+        StandardProblems::release_problem_path(_p_(Untestable),
             "In order to release the story file along with an "
             "interpreter, I tried to create a folder alongside this "
             "Inform project, but was unable to do so. The folder "
@@ -541,7 +541,7 @@ art and see that its dimensions conform to Treaty of Babel requirements.
     int rv = ImageFiles::get_JPEG_dimensions(COVER_FILE, &width, &height);
     fclose(COVER_FILE);
     if (rv == FALSE) {
-        Problems::Issue::release_problem(_p_(Untestable),
+        StandardProblems::release_problem(_p_(Untestable),
             "The cover image seems not to be a JPEG despite the name",
             cover_filename);
         return;
@@ -556,7 +556,7 @@ art and see that its dimensions conform to Treaty of Babel requirements.
     int rv = ImageFiles::get_PNG_dimensions(COVER_FILE, &width, &height);
     fclose(COVER_FILE);
     if (rv == FALSE) {
-        Problems::Issue::release_problem(_p_(Untestable),
+        StandardProblems::release_problem(_p_(Untestable),
             "The cover image seems not to be a PNG despite the name",
             cover_filename);
         return;
@@ -567,7 +567,7 @@ art and see that its dimensions conform to Treaty of Babel requirements.
 

-    Problems::Issue::release_problem_at_sentence(_p_(Untestable),
+    StandardProblems::release_problem_at_sentence(_p_(Untestable),
         "The release instructions said that there is a cover image "
         "to attach to the story file, but I was unable to find it, "
         "having looked for both 'Cover.png' and 'Cover.jpg' in the "
@@ -580,14 +580,14 @@ art and see that its dimensions conform to Treaty of Babel requirements.
 
 
     if ((width < 120) || (width > 1200) || (height < 120) || (height > 1200)) {
-        Problems::Issue::release_problem(_p_(Untestable),
+        StandardProblems::release_problem(_p_(Untestable),
             "The height and width of the cover image, in pixels, must be "
             "between 120 and 1024 inclusive",
             cover_filename);
         return;
     }
     if ((width > 2*height) || (height > 2*width)) {
-        Problems::Issue::release_problem(_p_(Untestable),
+        StandardProblems::release_problem(_p_(Untestable),
             "We recommend a square cover image, but at any rate it is "
             "required to be no more rectangular than twice as wide as it "
             "is high (or vice versa)",
@@ -604,7 +604,7 @@ art and see that its dimensions conform to Treaty of Babel requirements.
         Issue a problem if this isn't a Release run10.3.1;
     FILE *STORYF = Filenames::fopen(Task::existing_storyfile_file(), "rb");
     if (STORYF == NULL) {
-        Problems::Issue::unlocated_problem_on_file(Task::syntax_tree(),
+        StandardProblems::unlocated_problem_on_file(Task::syntax_tree(),
             _p_(BelievedImpossible),  i.e., not testable by intest
             "The instruction 'Release along with an existing story file' "
             "means that I need to bind up a story file called '%1', in "
@@ -625,7 +625,7 @@ art and see that its dimensions conform to Treaty of Babel requirements.
 

-    Problems::Issue::unlocated_problem(Task::syntax_tree(), _p_(PM_UnreleasedRelease),
+    StandardProblems::unlocated_problem(Task::syntax_tree(), _p_(PM_UnreleasedRelease),
         "This is supposed to be a source text which only contains "
         "release instructions to bind up an existing story file "
         "(for instance, one produced using Inform 6). That's because "
@@ -658,7 +658,7 @@ art and see that its dimensions conform to Treaty of Babel requirements.
     text_stream xf_struct; text_stream *xf = &xf_struct;
     filename *F = Task::ifiction_record_file();
     if (STREAM_OPEN_TO_FILE(xf, F, UTF8_ENC) == FALSE)
-        Problems::Fatal::filename_related("Can't open metadata file", F);
+        Problems::fatal_on_file("Can't open metadata file", F);
     BEGIN_COMPILATION_MODE;
     COMPILATION_MODE_ENTER(COMPILE_TEXT_TO_XML_CMODE);
     PL::Bibliographic::Release::write_ifiction_record(xf, header, cover_picture_number, cover_art_format, height, width);
@@ -673,7 +673,7 @@ art and see that its dimensions conform to Treaty of Babel requirements.
     filename *F = Task::blurb_file();
     text_stream xf_struct; text_stream *xf = &xf_struct;
     if (STREAM_OPEN_TO_FILE(xf, F, UTF8_ENC) == FALSE)
-        Problems::Fatal::filename_related("Can't open blurb file", F);
+        Problems::fatal_on_file("Can't open blurb file", F);
     PL::Bibliographic::Release::write_release_blurb(xf, cover_picture_number, cover_art_format);
     STREAM_CLOSE(xf);
 
@@ -685,7 +685,7 @@ art and see that its dimensions conform to Treaty of Babel requirements. filename *F = Task::manifest_file(); text_stream xf_struct; text_stream *xf = &xf_struct; if (STREAM_OPEN_TO_FILE(xf, F, UTF8_ENC) == FALSE) - Problems::Fatal::filename_related("Can't open manifest file", F); + Problems::fatal_on_file("Can't open manifest file", F); PL::Figures::write_picture_manifest(xf, release_cover, cover_art_format); STREAM_CLOSE(xf);
diff --git a/docs/if-module/3-bck.html b/docs/if-module/3-bck.html index 669980c03..90c8a9456 100644 --- a/docs/if-module/3-bck.html +++ b/docs/if-module/3-bck.html @@ -291,12 +291,12 @@ can be said to be "everywhere", which nothing else can). (<notable-backdrops-noun-phrases>(Node::get_text(py)))) { inference_subject *left_subject = Node::get_subject(px); if (left_subject == NULL) - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_ValueEverywhere), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_ValueEverywhere), "'everywhere' can only be used to place individual backdrops", "so although 'The mist is a backdrop. The mist is everywhere.' " "would be fine, 'Corruption is everywhere.' would not."); else if (InferenceSubjects::domain(left_subject)) - Problems::Issue::subject_problem_at_sentence(_p_(PM_KindOfBackdropEverywhere), + StandardProblems::subject_problem_at_sentence(_p_(PM_KindOfBackdropEverywhere), left_subject, "seems to be said to be 'everywhere' in some way", "which doesn't make sense. An individual backdrop can be 'everywhere', " @@ -316,7 +316,7 @@ been asserted true:
 void PL::Backdrops::infer_presence_everywhere(instance *I) {
     if ((I == NULL) || (Instances::of_kind(I, K_backdrop) == FALSE)) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_EverywhereNonBackdrop),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_EverywhereNonBackdrop),
             "only a backdrop can be everywhere",
             "and no other kind of object will do. For instance, 'The sky is "
             "a backdrop which is everywhere.' is allowed, but 'The travelator "
diff --git a/docs/if-module/3-em.html b/docs/if-module/3-em.html
index d42e181a7..ff4131185 100644
--- a/docs/if-module/3-em.html
+++ b/docs/if-module/3-em.html
@@ -469,7 +469,7 @@ itself.
 
     *X = NO_IMW;
     if (index_map_with_pass == 1) {
-        Problems::Issue::map_problem(_p_(PM_MapDirectionClue),
+        StandardProblems::map_problem(_p_(PM_MapDirectionClue),
             index_map_with_p, "You can only say 'Index map with D mapped as E.' "
             "when D and E are directions.");
     }
@@ -481,7 +481,7 @@ itself.
 
     *X = NO_IMW;
     if (index_map_with_pass == 1) {
-        Problems::Issue::map_problem(_p_(PM_MapPlacement),
+        StandardProblems::map_problem(_p_(PM_MapPlacement),
             index_map_with_p, "The map placement hint should either have the form 'Index map with X "
             "mapped east of Y' or 'Index map with X mapped above/below Y'.");
     }
@@ -493,7 +493,7 @@ itself.
 
     *X = NO_IMW;
     if (index_map_with_pass == 1) {
-        Problems::Issue::map_problem(_p_(PM_MapSettingTooLong),
+        StandardProblems::map_problem(_p_(PM_MapSettingTooLong),
             index_map_with_p, "The value supplied has to be a single item, a number, a word "
             "or some text in double-quotes: this looks too long to be right.");
     }
@@ -513,7 +513,7 @@ itself.
 
     *X = NO_IMW;
     if (index_map_with_pass == 2) {
-        Problems::Issue::map_problem(_p_(PM_MapHintUnknown),
+        StandardProblems::map_problem(_p_(PM_MapHintUnknown),
             index_map_with_p, "The general form for this is 'Index map with ...' and then a "
             "list of clues, such as 'the Ballroom mapped east of the Terrace', "
             "or 'room-size of the Ballroom set to 100'.");
@@ -587,7 +587,7 @@ as the following:
 
     *X = NO_IMW;
     if (index_map_with_pass == 1) {
-        Problems::Issue::map_problem(_p_(PM_MapSettingUnknown),
+        StandardProblems::map_problem(_p_(PM_MapSettingUnknown),
             index_map_with_p, "The parameter has to be one of the fixed named set given in "
             "the documentation, like 'room-name'. All parameters are one "
             "word, but many are hyphenated. (Also, note that 'colour' has the "
@@ -701,7 +701,7 @@ the following:
 
 
     if (Instances::of_kind(<<instance:dir>>, K_direction) == FALSE) {
-        if (pass == 1) Problems::Issue::map_problem(_p_(PM_MapPlacementDirection),
+        if (pass == 1) StandardProblems::map_problem(_p_(PM_MapPlacementDirection),
             p, "The direction given as a hint for map placement wasn't "
             "one that I know of.");
         return;
@@ -712,17 +712,17 @@ the following:
     int exit = PF_I(map, <<instance:dir>>)->direction_index;
 
     if ((I == NULL) || (PL::Spatial::object_is_a_room(I) == FALSE)) {
-        if (pass == 1) Problems::Issue::map_problem(_p_(PM_MapFromNonRoom),
+        if (pass == 1) StandardProblems::map_problem(_p_(PM_MapFromNonRoom),
             p, "The first-named thing must be a room (beware ambiguities!).");
         return;
     }
     if ((I2 == NULL) || (PL::Spatial::object_is_a_room(I2) == FALSE)) {
-        if (pass == 1) Problems::Issue::map_problem(_p_(PM_MapToNonRoom),
+        if (pass == 1) StandardProblems::map_problem(_p_(PM_MapToNonRoom),
             p, "The second-named thing must be a room (beware ambiguities!).");
         return;
     }
     if (PL::SpatialMap::direction_is_lateral(exit) == FALSE) {
-        if (pass == 1) Problems::Issue::map_problem(_p_(PM_MapNonLateral),
+        if (pass == 1) StandardProblems::map_problem(_p_(PM_MapNonLateral),
             p, "The direction given as a hint for map placement must be "
             "a lateral direction (not up, down, above, below, inside "
             "or outside).");
@@ -764,7 +764,7 @@ the following:
                     Make a rubric offset setting22.3.2; break;
             }
         } else {
-            Problems::Issue::map_problem(_p_(PM_MapBadRubric),
+            StandardProblems::map_problem(_p_(PM_MapBadRubric),
                 p, "Unfortunately the details of that rubric seem to be "
                 "in error (a lame message, but an accurate one).");
             break;
@@ -779,7 +779,7 @@ the following:
     Word::dequote(<<rcol>>);
     wchar_t *thec = HTML::translate_colour_name(Lexer::word_text(<<rcol>>));
     if (thec == NULL) {
-        Problems::Issue::map_problem(_p_(PM_MapUnknownColour), p, "There's no such map colour.");
+        StandardProblems::map_problem(_p_(PM_MapUnknownColour), p, "There's no such map colour.");
         return;
     }
     rh->colour = thec;
@@ -790,7 +790,7 @@ the following:
 
 
     if (<<roff>> == ERRONEOUS_OFFSET_VALUE) {
-        Problems::Issue::map_problem(_p_(PM_MapUnknownOffset), p, "There's no such offset.");
+        StandardProblems::map_problem(_p_(PM_MapUnknownOffset), p, "There's no such offset.");
         return;
     }
     rh->at_offset = <<roff>>;
@@ -799,7 +799,7 @@ the following:
         instance *I = Instances::parse_object(Wordings::from(Node::get_text(p), i));
         i = Wordings::last_wn(RESTW) + 1;
         if (I == NULL) {
-            Problems::Issue::map_problem(_p_(PM_MapUnknownOffsetBase),
+            StandardProblems::map_problem(_p_(PM_MapUnknownOffsetBase),
                 p, "There's no such room to be offset from.");
             return;
         }
@@ -844,7 +844,7 @@ the following:
                     && (eml->map_level - Room_position(benchmark_room).z == ln))
                     scope = &(eml->map_parameters);
             if (scope == NULL) {
-                Problems::Issue::map_problem(_p_(PM_MapLevelMisnamed),
+                StandardProblems::map_problem(_p_(PM_MapLevelMisnamed),
                     p, "Layers of the map must be called 'level N', where "
                     "N is a number, and level 0 is the one which contains "
                     "the first room.");
@@ -884,7 +884,7 @@ the following:
 
 
     if (index_map_with_pass == 1) {
-        Problems::Issue::map_problem(_p_(PM_MapSettingOfUnknown),
+        StandardProblems::map_problem(_p_(PM_MapSettingOfUnknown),
             index_map_with_p, "The parameter has to be 'of' either 'the first room' "
             "or a specific named room (beware ambiguities!) or "
             "a level such as 'level 0' (the first room is by "
@@ -945,7 +945,7 @@ the following:
             break;
         default: internal_error("Unexpected map parameter data type");
     }
-    if (pass == 1) Problems::Issue::map_problem_wanted_but(_p_(PM_MapSettingTypeFailed),
+    if (pass == 1) StandardProblems::map_problem_wanted_but(_p_(PM_MapSettingTypeFailed),
         p, i_wanted_a, wn);
 
@@ -1054,7 +1054,7 @@ For instance, 28&-125 filename *F = Task::epsmap_file(); text_stream EPS_struct; text_stream *EPS = &EPS_struct; if (STREAM_OPEN_TO_FILE(EPS, F, ISO_ENC) == FALSE) - Problems::Fatal::filename_related("Can't open EPS map file", F); + Problems::fatal_on_file("Can't open EPS map file", F); PL::EPSMap::EPS_compile_map(EPS); STREAM_CLOSE(EPS);
diff --git a/docs/if-module/3-mcr.html b/docs/if-module/3-mcr.html index e7b6e23c8..488ba8bea 100644 --- a/docs/if-module/3-mcr.html +++ b/docs/if-module/3-mcr.html @@ -261,7 +261,7 @@ names for I6 objects have not yet been settled. binary_predicate *bp = Sentences::Rearrangement::relation_noticed(mmp_call_counter++); if (bp == NULL) { LOG("Improper text: %W\n", W); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ImproperlyMadeDirection), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ImproperlyMadeDirection), "directions must be created by only the simplest possible sentences", "in the form 'North-north-west is a direction' only. Using adjectives, " "'called', 'which', and so on is not allowed. (In practice this is not " diff --git a/docs/if-module/3-rgn.html b/docs/if-module/3-rgn.html index c5eb685f4..558b247fc 100644 --- a/docs/if-module/3-rgn.html +++ b/docs/if-module/3-rgn.html @@ -166,7 +166,7 @@ there is no need to translate this to other languages.) int PL::Regions::regions_set_subkind_notify(kind *sub, kind *super) { if ((sub == K_region) && (super != K_object)) { if (problem_count == 0) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RegionAdrift), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RegionAdrift), "'region' is not allowed to be a kind of anything (other than " "'object')", "because it's too fundamental to the way Inform maps out the " @@ -249,7 +249,7 @@ messages which would have been less helpful if core Inform had produced them. if ((left_object) && (current_sentence != Instances::get_creating_sentence(left_object)) && (Instances::of_kind(left_object, K_region) == FALSE)) { - Problems::Issue::subject_problem_at_sentence(_p_(PM_ExistingRegion), + StandardProblems::subject_problem_at_sentence(_p_(PM_ExistingRegion), left_subject, "(which I notice in another sentence) seems now to " "be declared as a new region", @@ -261,7 +261,7 @@ messages which would have been less helpful if core Inform had produced them. } if ((Node::get_type(px) == RELATIONSHIP_NT) && (Node::get_subject(py) == Kinds::Knowledge::as_subject(K_region))) { - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_RegionRelated), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_RegionRelated), "a region cannot be given a specific location", "since it contains what may be many rooms, which may not be " "contiguous and could be scattered about all over. (Sometimes " @@ -321,7 +321,7 @@ to participate in nonspatial relations.) if (I1_is_region) A region is being put inside a region17.2 else A room is being put inside a region17.3; } else { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RegionRelation), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RegionRelation), "regions can only contain rooms", "and have no other relationships."); } @@ -330,7 +330,7 @@ to participate in nonspatial relations.) if ((relation == R_incorporation) || (relation == R_containment) || (relation == R_regional_containment)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RegionRelation2), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RegionRelation2), "regions can only be contained in other regions", "and not for example in rooms."); } @@ -345,7 +345,7 @@ to participate in nonspatial relations.)
     if ((PF_I(regions, I1)->in_region) &&
         (PF_I(regions, I1)->in_region != I0)) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RegionInTwoRegions),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RegionInTwoRegions),
             "each region can only be declared to be inside a single "
             "other region",
             "since although regions can be placed inside each other, "
diff --git a/docs/if-module/3-scn.html b/docs/if-module/3-scn.html
index 6f322034e..6335ce9d8 100644
--- a/docs/if-module/3-scn.html
+++ b/docs/if-module/3-scn.html
@@ -306,7 +306,7 @@ to translate this to other languages.)
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ScenesWithTooManyEnds),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ScenesWithTooManyEnds),
         "this scene now has too many different ways to end",
         "and will need to be simplified. (We can have up to 15 ends to a scene "
         "if the project format is for the Z-machine, and 31 for Glulx: see the "
@@ -494,7 +494,7 @@ have to be worded as one.
 
 
     *X = FALSE;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ScenesOnly),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ScenesOnly),
         "'begins when' and 'ends when' can only be applied to scenes",
         "which have already been defined with a sentence like 'The final "
         "confrontation is a scene.'");
@@ -531,7 +531,7 @@ in a different context, for instance, and could still be valid in that case.
 
 
     *X = -1;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ScenesDisallowCalled),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ScenesDisallowCalled),
         "'(called ...)' is not allowed within conditions for a scene to begin or end",
         "since calling gives only a temporary name to something, for the purpose "
         "of further instructions which immediately follow in. Here there is no room "
@@ -544,7 +544,7 @@ in a different context, for instance, and could still be valid in that case.
 
 
     *X = -1;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ScenesNotPlay),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ScenesNotPlay),
         "'play' is not really a scene",
         "so although you can write '... when play begins' you cannot write '... "
         "when play ends'. But there's no need to do so, anyway. When play ends, "
@@ -556,7 +556,7 @@ in a different context, for instance, and could still be valid in that case.
 
 
     *X = -1;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ScenesUnknownEnd),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ScenesUnknownEnd),
         "that's not one of the known ends for that scene",
         "which must be declared with something like 'Confrontation ends happily "
         "when...' or 'Confrontation ends tragically when...'.");
@@ -640,7 +640,7 @@ ends" the other end.
     if (phase == 2) {
         Parse which form of anchor we have24.5;
         if ((this_scene == SC_entire_game) && (external_condition == NULL)) {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_EntireGameHardwired),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_EntireGameHardwired),
                 "the special 'Entire Game' scene cannot have its start or end modified",
                 "because it is a built-in scene designed to be going on whenever there "
                 "is play going on in the story.");
@@ -666,7 +666,7 @@ ends" the other end.
 
 
     if (this_scene->anchor_condition[end])
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ScenesOversetEnd),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ScenesOversetEnd),
             "you have already told me a condition for when that happens",
             "and although a scene can be linked to the beginning or ending "
             "of any number of other scenes, it can only have a single "
@@ -894,7 +894,7 @@ below.
     }
     if (Node::is(S, UNKNOWN_NT)) {
         LOG("Condition: $P\n", S);
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ScenesBadCondition),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ScenesBadCondition),
             "'begins when' and 'ends when' must be followed by a condition",
             "which this does not seem to be, or else 'when play begins', "
             "'when play ends', 'when S begins', or 'when S ends', where "
@@ -1404,7 +1404,7 @@ actually running:
     }
     if (stuck) {
         Produce::val(Emit::tree(), K_truth_state, LITERAL_IVAL, 1);
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ScenesBadDuring),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ScenesBadDuring),
             "'during' must be followed by the name of a scene or of a "
             "description which applies to a single scene",
             "such as 'during Station Arrival' or 'during a recurring scene'.");
diff --git a/docs/if-module/3-sm.html b/docs/if-module/3-sm.html
index dca643405..df5da9b29 100644
--- a/docs/if-module/3-sm.html
+++ b/docs/if-module/3-sm.html
@@ -292,7 +292,7 @@ multiple PARENTAGE_INF
         Problems::quote_subject(3, subj);
         Problems::quote_object(4, World::Inferences::get_reference_as_object(A));
         Problems::quote_object(5, World::Inferences::get_reference_as_object(B));
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_SpatialContradiction));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_SpatialContradiction));
         Problems::issue_problem_segment(
             "You wrote %1, but also %2: that seems to be saying that the same "
             "object (%3) must be in two different places (%4 and %5). This "
@@ -367,7 +367,7 @@ of vehicle, and so on, but this would cause mayhem in the model world. So:
 int PL::Spatial::spatial_set_subkind_notify(kind *sub, kind *super) {
     if ((sub == K_thing) && (super != K_object)) {
         if (problem_count == 0)
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ThingAdrift),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ThingAdrift),
                 "'thing' is not allowed to be a kind of anything (other than "
                 "'object')",
                 "because it's too fundamental to the way Inform uses rooms "
@@ -376,7 +376,7 @@ of vehicle, and so on, but this would cause mayhem in the model world. So:
     }
     if ((sub == K_room) && (super != K_object)) {
         if (problem_count == 0)
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RoomAdrift),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RoomAdrift),
                 "'room' is not allowed to be a kind of anything (other than "
                 "'object')",
                 "because it's too fundamental to the way Inform uses rooms "
@@ -386,7 +386,7 @@ of vehicle, and so on, but this would cause mayhem in the model world. So:
     if (((sub == K_container) && (super == K_supporter)) ||
         ((sub == K_supporter) && (super == K_container))) {
         if (problem_count == 0)
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ContainerAdrift),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ContainerAdrift),
                 "'container' and 'supporter' are not allowed to be kinds "
                 "of each other",
                 "because they're too fundamental to the way Inform models the "
@@ -496,7 +496,7 @@ inference.
 

-    Problems::Issue::object_problem(_p_(PM_SceneryDoublyDescribed),
+    StandardProblems::object_problem(_p_(PM_SceneryDoublyDescribed),
         I,
         "is scenery, which means that it cannot sensibly have any 'initial "
         "appearance' property - being scenery, it isn't announced when the "
@@ -586,7 +586,7 @@ node using this wording in order to produce better problem messages if need be.
         inference_subject *left_subject = Node::get_subject(px);
         if (left_subject) {
             if (InferenceSubjects::domain(left_subject))
-                Problems::Issue::subject_problem_at_sentence(_p_(PM_KindNowhere),
+                StandardProblems::subject_problem_at_sentence(_p_(PM_KindNowhere),
                     left_subject,
                     "seems to be said to be 'nowhere' in some way",
                     "which doesn't make sense. An individual thing can be 'nowhere', "
@@ -626,7 +626,7 @@ with certainty read
     inference_subject *infs = Instances::as_subject(I);
     inference *inf;
     POSITIVE_KNOWLEDGE_LOOP(inf, infs, PARENTAGE_HERE_INF) {
-        Problems::Issue::contradiction_problem(_p_(PM_DuplicateHere),
+        StandardProblems::contradiction_problem(_p_(PM_DuplicateHere),
             World::Inferences::where_inferred(inf),
             current_sentence,
             I,
@@ -843,7 +843,7 @@ when it's legitimately a door.
 

-    Problems::Issue::contradiction_problem(_p_(PM_PersonContaining),
+    StandardProblems::contradiction_problem(_p_(PM_PersonContaining),
         sentence_setting_kind,
         World::Inferences::where_inferred(geography_inference), I,
         "cannot contain or support things like something inanimate",
@@ -860,7 +860,7 @@ Inform spatial model:
 

-    Problems::Issue::contradiction_problem(_p_(PM_CantContainAndSupport),
+    StandardProblems::contradiction_problem(_p_(PM_CantContainAndSupport),
         decider, World::Inferences::where_inferred(geography_inference), I,
         "cannot both contain things and support things",
         "which is what you're implying here. If you need both, the easiest way is "
@@ -874,7 +874,7 @@ Inform spatial model:
 

-    Problems::Issue::contradiction_problem(_p_(PM_BothRoomAndSupporter),
+    StandardProblems::contradiction_problem(_p_(PM_BothRoomAndSupporter),
         decider,
         World::Inferences::where_inferred(geography_inference), I,
         "would need to have two different and incompatible kinds to make both "
@@ -968,7 +968,7 @@ the kind of here-objects.
             Problems::quote_object(2, I);
             Problems::quote_object(3, PL::Spatial::progenitor(I));
             Problems::quote_kind(4, Instances::to_kind(I));
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NonThingInModel));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NonThingInModel));
             Problems::issue_problem_segment(
                 "In the sentence %1, you create an object '%2' which you then seem "
                 "to place in or on or as part of '%3', but the kind of '%2' is %4. "
@@ -1021,7 +1021,7 @@ object under investigation.
 
 
     if (parent_setting_inference) {
-        Problems::Issue::contradiction_problem(_p_(PM_DuplicateParentage),
+        StandardProblems::contradiction_problem(_p_(PM_DuplicateParentage),
             World::Inferences::where_inferred(parent_setting_inference),
             World::Inferences::where_inferred(inf),
             I,
@@ -1042,7 +1042,7 @@ object under investigation.
         Set the whereabouts to the last discussed room prior to this inference being drawn32.3.2.1;
         if (whereabouts == NULL) {
             current_sentence = here_sentence;
-            Problems::Issue::object_problem_at_sentence(_p_(PM_NoHere),
+            StandardProblems::object_problem_at_sentence(_p_(PM_NoHere),
                 I,
                 "was described as being 'here', and there doesn't seem to be any "
                 "location being talked about at this point in the source text",
@@ -1071,7 +1071,7 @@ when it finishes this will be set to the most recently mentioned.
     inference *inf;
     POSITIVE_KNOWLEDGE_LOOP(inf, Instances::as_subject(I), PART_OF_INF) {
         if ((PL::Spatial::object_is_a_room(I)) || (PL::Map::object_is_a_door(I))) {
-            Problems::Issue::object_problem(_p_(PM_RoomOrDoorAsPart),
+            StandardProblems::object_problem(_p_(PM_RoomOrDoorAsPart),
                 I,
                 "was set up as being part of something else, which doors and rooms "
                 "are not allowed to be",
@@ -1305,7 +1305,7 @@ changed progenitors at Stage II.)
 
 
     Problems::quote_object(1, I);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_IllFounded));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_IllFounded));
     Problems::issue_problem_segment("The %1 seems to be containing itself: ");
     instance *I3 = I;
     while (TRUE) {
@@ -1557,7 +1557,7 @@ empty.
         instance *I;
         LOOP_OVER_OBJECT_INSTANCES(I)
             if (PL::Spatial::object_is_a_room(I)) {
-                Problems::Issue::unlocated_problem(Task::syntax_tree(), _p_(PM_RoomInIgnoredSource),
+                StandardProblems::unlocated_problem(Task::syntax_tree(), _p_(PM_RoomInIgnoredSource),
                     "This is supposed to be a source text which only contains "
                     "release instructions to bind up an existing story file "
                     "(for instance, one produced using Inform 6). That's because "
diff --git a/docs/if-module/3-sr.html b/docs/if-module/3-sr.html
index 055aa261e..5bb97a829 100644
--- a/docs/if-module/3-sr.html
+++ b/docs/if-module/3-sr.html
@@ -256,7 +256,7 @@ place the same object in a container, a room or a region respectively.
         *I1 = InferenceSubjects::as_object_instance(infs1);
     if ((I0) && (I1)) {
         if (I1 == I0) {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_MiseEnAbyme),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_MiseEnAbyme),
                 "this asks to put something inside itself",
                 "like saying 'the bottle is in the bottle'.");
             return TRUE;
@@ -298,7 +298,7 @@ way which isn't symmetrical between the two, and this way round is cleanest.
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_Unassertable),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_Unassertable),
         "the relationship you describe is not exact enough",
         "so that I do not know how to make this assertion come true. "
         "For instance, saying 'The Study is adjacent to the Hallway.' "
@@ -314,7 +314,7 @@ way which isn't symmetrical between the two, and this way round is cleanest.
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PartOfRoom),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PartOfRoom),
         "this asks to make something a part of a room",
         "when only things are allowed to have parts.");
     return TRUE;
diff --git a/docs/if-module/3-tm.html b/docs/if-module/3-tm.html
index c6bf23206..23c4608df 100644
--- a/docs/if-module/3-tm.html
+++ b/docs/if-module/3-tm.html
@@ -294,7 +294,7 @@ Rules. (So there is no need to translate this to other languages.)
 int PL::Map::map_set_subkind_notify(kind *sub, kind *super) {
     if ((sub == K_direction) && (super != K_object)) {
         if (problem_count == 0)
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_DirectionAdrift),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DirectionAdrift),
                 "'direction' is not allowed to be a kind of anything (other than "
                 "'object')",
                 "because it's too fundamental to the way Inform maps out the "
@@ -303,21 +303,21 @@ Rules. (So there is no need to translate this to other languages.)
     }
     if (super == K_direction) {
         if (problem_count == 0)
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_DirectionSubkinded),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DirectionSubkinded),
                 "'direction' is not allowed to have more specific kinds",
                 "because it's too fundamental to the way Inform maps out the "
                 "geography of the physical world.");
         return TRUE;
     }
     if ((K_backdrop) && (sub == K_door) && (Kinds::Compare::le(super, K_backdrop))) {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_DoorAdrift),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DoorAdrift),
                 "'door' is not allowed to be a kind of 'backdrop'",
                 "because it's too fundamental to the way Inform maps out the "
                 "geography of the physical world.");
         return TRUE;
     }
     if ((K_backdrop) && (sub == K_backdrop) && (Kinds::Compare::le(super, K_door))) {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BackdropAdrift),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BackdropAdrift),
                 "'backdrop' is not allowed to be a kind of 'door'",
                 "because it's too fundamental to the way Inform maps out the "
                 "geography of the physical world.");
@@ -417,13 +417,13 @@ no need to translate this to other languages.)
 
 
     if (Wordings::empty(IW)) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NamelessDirection),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NamelessDirection),
             "nameless directions are not allowed",
             "so writing something like 'There is a direction.' is forbidden.");
         return TRUE;
     }
     if (Wordings::length(IW) > MAX_WORDS_IN_DIRECTION) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_DirectionTooLong),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DirectionTooLong),
             "although direction names can be really quite long in today's Inform",
             "they can't be as long as that.");
         return TRUE;
@@ -750,7 +750,7 @@ because, of course, that does set its kind.
             return FALSE;
         }
         if (Annotations::read_int(px, nowhere_ANNOT)) {
-            Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_NowhereDescribed),
+            Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_NowhereDescribed),
                 "'nowhere' cannot be made specific",
                 "and so cannot have specific properties or be of any given kind.");
             return TRUE;
@@ -794,7 +794,7 @@ pairs.
         Problems::quote_source(1, current_sentence);
         Problems::quote_object(2, forwards_dir);
         Problems::quote_object(3, go_to);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_WayFromUnclear));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_WayFromUnclear));
         Problems::issue_problem_segment(
             "On the basis of %1, I'm trying to make a map connection in the "
             "%2 direction to %3, but I can't make sense of where it goes from.");
@@ -807,7 +807,7 @@ pairs.
         if (Instances::of_kind(reverse_dir, K_direction) == FALSE) {
             Problems::quote_object(1, forwards_dir);
             Problems::quote_object(2, reverse_dir);
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_OppositeNotDirection));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_OppositeNotDirection));
             Problems::issue_problem_segment(
                 "I'm trying to make a map connection in the %1 direction, "
                 "which means there ought to be map connection back in the "
@@ -897,7 +897,7 @@ checks that various mapping impossibilities do not occur.
             if ((PL::Spatial::object_is_a_room(I)) && (to) &&
                 (PL::Map::object_is_a_door(to) == FALSE) &&
                 (PL::Spatial::object_is_a_room(to) == FALSE))
-                Problems::Issue::contradiction_problem(_p_(PM_BadMapCell),
+                StandardProblems::contradiction_problem(_p_(PM_BadMapCell),
                     Instances::get_creating_sentence(to),
                     World::Inferences::where_inferred(inf), to,
                     "appears to be something which can be reached via a map "
@@ -905,7 +905,7 @@ checks that various mapping impossibilities do not occur.
                     "and these are the only possibilities allowed by Inform.");
             if ((PL::Map::object_is_a_door(I)) &&
                 (PL::Spatial::object_is_a_room(to) == FALSE))
-                Problems::Issue::object_problem(_p_(PM_DoorToNonRoom),
+                StandardProblems::object_problem(_p_(PM_DoorToNonRoom),
                     I,
                     "seems to be a door opening on something not a room",
                     "but a door must connect one or two rooms (and in particular is "
@@ -971,7 +971,7 @@ checks that various mapping impossibilities do not occur.
 

-    Problems::Issue::object_problem(_p_(PM_DoorUnconnected),
+    StandardProblems::object_problem(_p_(PM_DoorUnconnected),
         I,
         "seems to be a door with no way in or out",
         "so either you didn't mean it to be a door or you haven't specified what's "
@@ -987,7 +987,7 @@ checks that various mapping impossibilities do not occur.
     Problems::quote_source(2, where[0]);
     Problems::quote_source(3, where[1]);
     Problems::quote_source(4, where[2]);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_DoorOverconnected));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_DoorOverconnected));
     Problems::issue_problem_segment(
         "%1 seems to be a door with three ways out (specified %2, %3 and %4), but "
         "you can only have one or two sides to a door in Inform: a one-sided "
@@ -1023,7 +1023,7 @@ from which there's no way back.)
                         Problems::quote_object(1, I);
                         Problems::quote_object(2, to);
                         Problems::quote_object(3, exit1);
-                        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RoomTwistyDoor));
+                        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RoomTwistyDoor));
                         Problems::issue_problem_segment(
                             "%1, a room, seems to have a map connection which goes "
                             "through %2, a door: but that doesn't seem physically "
@@ -1035,7 +1035,7 @@ from which there's no way back.)
                         Problems::quote_object(2, to);
                         Problems::quote_object(3, exit1);
                         Problems::quote_object(4, exit2);
-                        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RoomMissingDoor));
+                        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RoomMissingDoor));
                         Problems::issue_problem_segment(
                             "%1, a room, seems to have a map connection which goes "
                             "through %2, a door: but that doesn't seem physically "
@@ -1059,7 +1059,7 @@ from which there's no way back.)
             (PF_I(map, I)->map_connection_b) &&
             (World::Inferences::get_prop_state(
                 Instances::as_subject(I), P_other_side)))
-                Problems::Issue::object_problem(_p_(PM_BothWaysDoor),
+                StandardProblems::object_problem(_p_(PM_BothWaysDoor),
                     I, "seems to be a door whose connections have been given in both "
                     "of the alternative ways at once",
                     "by directly giving its map connections (the normal way to set up "
@@ -1086,7 +1086,7 @@ model at run-time.) This is where we apply the kill-joy rule in question:
             (PL::Spatial::progenitor(I)) &&
             (PL::Spatial::progenitor(I) != PF_I(map, I)->map_connection_a) &&
             (PL::Spatial::progenitor(I) != PF_I(map, I)->map_connection_b))
-            Problems::Issue::object_problem(_p_(PM_DoorInThirdRoom),
+            StandardProblems::object_problem(_p_(PM_DoorInThirdRoom),
                 I, "seems to be a door which is present in a room to which it is not connected",
                 "but this is not allowed. A door must be in one or both of the rooms it is "
                 "between, but not in a third place altogether.");
diff --git a/docs/if-module/3-tnt.html b/docs/if-module/3-tnt.html
index fadc04ef2..d1165716d 100644
--- a/docs/if-module/3-tnt.html
+++ b/docs/if-module/3-tnt.html
@@ -283,7 +283,7 @@ a comma, and that's caught here:
 
     LOOP_THROUGH_WORDING(j, W) {
         if (Lexer::word(j) == COMMA_V) {
-            Problems::Issue::subject_creation_problem(_p_(PM_CommaInName),
+            StandardProblems::subject_creation_problem(_p_(PM_CommaInName),
                 subj,
                 "has a comma in its name",
                 "which is forbidden. Perhaps you used a comma in "
@@ -293,7 +293,7 @@ a comma, and that's caught here:
             break;
         }
         if (Vocabulary::test_flags(j, TEXT_MC+TEXTWITHSUBS_MC)) {
-            Problems::Issue::subject_creation_problem(_p_(BelievedImpossible),
+            StandardProblems::subject_creation_problem(_p_(BelievedImpossible),
                 subj,
                 "has some double-quoted text in its name",
                 "which is forbidden. Perhaps something odd happened "
diff --git a/docs/if-module/3-tp.html b/docs/if-module/3-tp.html
index 335d51e62..ba2d9acf1 100644
--- a/docs/if-module/3-tp.html
+++ b/docs/if-module/3-tp.html
@@ -401,7 +401,7 @@ we assume he is freestanding in the earliest defined room.
 
 
     if ((start_room == NULL) && (Task::wraps_existing_storyfile() == FALSE)) {
-        Problems::Issue::unlocated_problem(Task::syntax_tree(), _p_(PM_NoStartRoom),
+        StandardProblems::unlocated_problem(Task::syntax_tree(), _p_(PM_NoStartRoom),
             "There doesn't seem to be any location in this story, so there's "
             "nowhere for the player to begin. This may be because I have "
             "misunderstood what was meant to be a room and what wasn't: I "
@@ -429,7 +429,7 @@ will do. But otherwise:
             while ((start_room) && (PL::Spatial::progenitor(start_room)))
                 start_room = PL::Spatial::progenitor(start_room);
             if ((start_room) && (PL::Spatial::object_is_a_room(start_room) == FALSE)) {
-                Problems::Issue::object_problem(_p_(PM_StartsOutsideRooms),
+                StandardProblems::object_problem(_p_(PM_StartsOutsideRooms),
                     start_object,
                     "seems to be where the player is supposed to begin",
                     "but (so far as I know) it is not a room, nor is it ultimately "
@@ -438,7 +438,7 @@ will do. But otherwise:
             inference *inf;
             POSITIVE_KNOWLEDGE_LOOP(inf,
                 Instances::as_subject(player_character_object), PART_OF_INF) {
-                Problems::Issue::object_problem(_p_(PM_PlayerIsPart),
+                StandardProblems::object_problem(_p_(PM_PlayerIsPart),
                     start_object,
                     "seems to have the player attached as a component part",
                     "which is not allowed. The player can be in a room, or "
diff --git a/docs/if-module/4-act.html b/docs/if-module/4-act.html
index ee5407aff..77111999c 100644
--- a/docs/if-module/4-act.html
+++ b/docs/if-module/4-act.html
@@ -603,14 +603,14 @@ names of significance in the I6 library.
     if (<action-name>(W)) an = <<rp>>;
     else {
         LOG("Tried action name %W\n", W);
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TranslatesNonAction),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TranslatesNonAction),
             "this does not appear to be the name of an action",
             "so cannot be translated into I6 at all.");
         return;
     }
     if (an->translated) {
         LOG("Tried action name %W = %n\n", W, PL::Actions::base_iname(an));
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TranslatesActionAlready),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TranslatesActionAlready),
             "this action has already been translated",
             "so there must be some duplication somewhere.");
         return;
@@ -666,7 +666,7 @@ action patterns. For example, the Standard Rules define:
     *X = NOT_APPLICABLE;
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, W);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadMatchingSyntax));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadMatchingSyntax));
     Problems::issue_problem_segment(
         "You wrote %1, which I am reading as a request to make "
         "a new named variable for an action - a value associated "
@@ -682,7 +682,7 @@ action patterns. For example, the Standard Rules define:
 
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, W);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ActionVarAnd));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ActionVarAnd));
     Problems::issue_problem_segment(
         "You wrote %1, which I am reading as a request to make "
         "a new named variable for an action - a value associated "
@@ -701,7 +701,7 @@ action patterns. For example, the Standard Rules define:
 
     if (Node::get_type(cnode) != PROPERTYCALLED_NT) {
         Problems::quote_source(1, current_sentence);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ActionVarUncalled));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ActionVarUncalled));
         Problems::issue_problem_segment(
             "You wrote %1, which I am reading as a request to make "
             "a new named variable for an action - a value associated "
@@ -716,7 +716,7 @@ action patterns. For example, the Standard Rules define:
     if (an->owned_by_an == NULL) {
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, Node::get_text(cnode->down->next));
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(Untestable));  since we no longer define such actions
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(Untestable));  since we no longer define such actions
         Problems::issue_problem_segment(
             "You wrote %1, which I am reading as a request to make "
             "a new named variable for an action - a value associated "
@@ -740,7 +740,7 @@ action patterns. For example, the Standard Rules define:
             if (Wordings::length(MW) > 1) {
                 Problems::quote_source(1, current_sentence);
                 Problems::quote_wording(2, MW);
-                Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_MatchedAsTooLong));
+                StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_MatchedAsTooLong));
                 Problems::issue_problem_segment(
                     "You wrote %1, which I am reading as a request to make "
                     "a new named variable for an action - a value associated "
@@ -762,7 +762,7 @@ action patterns. For example, the Standard Rules define:
         if (Specifications::is_description(spec)) {
             Problems::quote_source(1, current_sentence);
             Problems::quote_wording(2, Node::get_text(cnode->down));
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ActionVarOverspecific));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ActionVarOverspecific));
             Problems::issue_problem_segment(
                 "You wrote %1, which I am reading as a request to make "
                 "a new named variable for an action - a value associated "
@@ -777,7 +777,7 @@ action patterns. For example, the Standard Rules define:
             LOG("Offending SP: $T", spec);
             Problems::quote_source(1, current_sentence);
             Problems::quote_wording(2, Node::get_text(cnode->down));
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ActionVarUnknownKOV));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ActionVarUnknownKOV));
             Problems::issue_problem_segment(
                 "You wrote %1, but '%2' is not the name of a kind of "
                 "value which I know (such as 'number' or 'text').");
@@ -789,7 +789,7 @@ action patterns. For example, the Standard Rules define:
     if (Kinds::Compare::eq(K, K_value)) {
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, Node::get_text(cnode->down));
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ActionVarValue));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ActionVarValue));
         Problems::issue_problem_segment(
             "You wrote %1, but saying that a variable is a 'value' "
             "does not give me a clear enough idea what it will hold. "
@@ -849,7 +849,7 @@ action patterns. For example, the Standard Rules define:
 
 
     *X = FALSE; *XP = NULL;
-    Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_BadActionDeclaration),
+    Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_BadActionDeclaration),
         "it is not sufficient to say that something is an 'action'",
         "without giving the necessary details: for example, 'Unclamping "
         "is an action applying to one thing.'");
@@ -918,7 +918,7 @@ action to be created.
 
 
     *XP = NULL;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ActionAlreadyExists),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ActionAlreadyExists),
         "that seems to be an action already existing",
         "so it cannot be redefined now. If you would like to reconfigure "
         "an action in the standard set - for instance if you prefer "
@@ -996,7 +996,7 @@ It's convenient to define a single action clause first:
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ActionClauseUnknown),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ActionClauseUnknown),
         "the action definition contained text I couldn't follow",
         "and may be too complicated.");
 
@@ -1011,7 +1011,7 @@ It's convenient to define a single action clause first: case PP_ACT_CLAUSE: { wording C = GET_RW(<action-clause>, 1); if (Wordings::length(C) != 1) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_MultiwordPastParticiple), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_MultiwordPastParticiple), "a past participle must be given as a single word", "even if the action name itself is longer than that. " "(For instance, the action name 'hanging around until' " @@ -1060,7 +1060,7 @@ It's convenient to define a single action clause first:
     *X = REQUIRES_ACCESS; *XP = K_thing;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ActionMisapplied),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ActionMisapplied),
         "an action can only apply to things or to kinds of value",
         "for instance: 'photographing is an action applying to "
         "one visible thing'.");
@@ -1101,7 +1101,7 @@ It's convenient to define a single action clause first:
     if (an->max_parameters >= 2) {
         if ((Kinds::Compare::le(an->noun_kind, K_object) == FALSE) &&
             (Kinds::Compare::le(an->second_kind, K_object) == FALSE)) {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ActionBothValues),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ActionBothValues),
                 "this action definition asks to have a single action apply "
                 "to two different things which are not objects",
                 "and unfortunately a fundamental restriction is that an "
@@ -1303,7 +1303,7 @@ in question. This is where we compile the bitmaps in their fresh, empty form.
             Problems::quote_wording(2, Node::get_text(an->designers_specification));
         Problems::quote_wording(3, an->present_name);
         Problems::quote_text(4, failed_on);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_GrammarMismatchesAction));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_GrammarMismatchesAction));
         Problems::issue_problem_segment("The grammar you give in %1 is not compatible "
             "with the %3 action (defined as '%2') - %4.");
         Problems::issue_problem_end();
diff --git a/docs/if-module/4-ap.html b/docs/if-module/4-ap.html
index bdb544146..e0521d8ae 100644
--- a/docs/if-module/4-ap.html
+++ b/docs/if-module/4-ap.html
@@ -420,14 +420,14 @@ an action.
     LOGIF(ACTION_PATTERN_PARSING, "Categorising the action:\n$A...as %W\n", ap, W);
 
     if (<article>(W)) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NamedAPIsArticle),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NamedAPIsArticle),
             "there's only an article here",
             "not a name, so I'm not sure what this action is supposed to be.");
         return;
     }
 
     if (ap->actor_spec) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NamedAPWithActor),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NamedAPWithActor),
             "behaviour characterised by named action patterns can only specify the action",
             "not the actor: as a result, it cannot include requests to other people to "
             "do things.");
@@ -456,7 +456,7 @@ an action.
         Problems::quote_kind(4, ka);
         Problems::quote_kind(5, Instances::to_kind(oref));
         if (kb) Problems::quote_kind(6, kb);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_GoingWrongKind));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_GoingWrongKind));
         if (kb)
         Problems::issue_problem_segment(
             "In the sentence %1, %2 seems to be intended as something the "
@@ -472,7 +472,7 @@ an action.
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, Node::get_text(spec));
     Problems::quote_text(3, keyword);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_GoingWithoutObject));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_GoingWithoutObject));
     Problems::issue_problem_segment(
         "In the sentence %1, '%2' seems to be intended as something the player "
         "might be going %3, but it doesn't make sense in that context.");
@@ -507,7 +507,7 @@ form the usage conditions for rules in object-based rulebooks.
     if (Node::is(spec, UNKNOWN_NT)) {
         Problems::quote_source(1, current_sentence);
         Problems::quote_wording(2, W);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadOptionalAPClause));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadOptionalAPClause));
         Problems::issue_problem_segment(
             "In %1, I tried to read a description of an action - a complicated "
             "one involving optional clauses; but '%2' wasn't something I "
@@ -1700,7 +1700,7 @@ and in this case we therefore ignore     LOGIF(ACTION_PATTERN_COMPILATION, "[MPE on $P: $P]\n", I6_var_TS, spec);
     kind *K = Specifications::to_kind(spec);
     if (Kinds::Behaviour::definite(K) == FALSE) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_APClauseIndefinite),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_APClauseIndefinite),
             "that action seems to involve a value which is unclear about "
             "its kind",
             "and that's not allowed. For example, you're not allowed to just "
@@ -2496,7 +2496,7 @@ and in this case we therefore ignore 
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PTAPTooComplex),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PTAPTooComplex),
         "that is too complex a past tense action",
         "at least for this version of Inform to handle: we may improve "
         "matters in later releases. The restriction is that the "
diff --git a/docs/if-module/5-gl.html b/docs/if-module/5-gl.html
index 9721ac761..f6d82ff17 100644
--- a/docs/if-module/5-gl.html
+++ b/docs/if-module/5-gl.html
@@ -279,7 +279,7 @@ known what the action will be.
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_WhenAction),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_WhenAction),
         "the condition after 'when' involves the current action",
         "but this can never work, because when Inform is still trying to "
         "understand a command, the current action isn't yet decided on.");
@@ -289,7 +289,7 @@ known what the action will be.
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadWhen),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadWhen),
         "the condition after 'when' makes no sense to me",
         "although otherwise this worked - it is only the part after 'when' "
         "which I can't follow.");
@@ -662,7 +662,7 @@ lexeme is annotated accordingly.
     for (pn = gl->tokens->down; pn; pn = pn->next)
         if ((Annotations::read_int(pn, slash_class_ANNOT) > 0) &&
             (Annotations::read_int(pn, grammar_token_literal_ANNOT) == FALSE)) {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_OverAmbitiousSlash),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_OverAmbitiousSlash),
                 "the slash '/' can only be used between single literal words",
                 "so 'underneath/under/beneath' is allowed but "
                 "'beneath/[florid ways to say under]/under' isn't.");
@@ -729,7 +729,7 @@ commands is not also used to determine a value.)
         if (PL::Parsing::Verbs::allow_mixed_lines(gv)) continue;
 
         current_sentence = gl->where_grammar_specified;
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_MixedOutcome),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_MixedOutcome),
             "grammar tokens must have the same outcome whatever the way they are "
             "reached",
             "so writing a line like 'Understand \"within\" or \"next to "
@@ -794,7 +794,7 @@ quantities used in sorting GLs: the "general sorting bonus" and the
     }
 
     if (multiples > 1)
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_MultipleMultiples),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_MultipleMultiples),
             "there can be at most one token in any line which can match "
             "multiple things",
             "so you'll have to remove one of the 'things' tokens and "
@@ -805,7 +805,7 @@ quantities used in sorting GLs: the "general sorting bonus" and the
     if (gv_is == GV_IS_COMMAND) spec = NULL;
     else {
         if (nrv < 2) spec = PL::Parsing::Tokens::Types::get_single_type(&(gl->gl_type));
-        else Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TwoValuedToken),
+        else StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TwoValuedToken),
             "there can be at most one varying part in the definition of a "
             "named token",
             "so 'Understand \"button [a number]\" as \"[button indication]\"' "
@@ -1169,7 +1169,7 @@ command GVs) have not yet been type-checked, whereas all others have.
     pn = gl->tokens->down;
     if ((genuinely_verbal) && (pn)) {
         if (Annotations::read_int(pn, slash_class_ANNOT) != 0) {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_SlashedCommand),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_SlashedCommand),
                 "at present you're not allowed to use a / between command "
                 "words at the start of a line",
                 "so 'put/interpose/insert [something]' is out.");
@@ -1203,7 +1203,7 @@ command GVs) have not yet been type-checked, whereas all others have.
 
             if (gl->reversed) {
                 if (token_values < 2) {
-                    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantReverseOne),
+                    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantReverseOne),
                         "you can't use a 'reversed' action when you supply fewer "
                         "than two values for it to apply to",
                         "since reversal is the process of exchanging them.");
@@ -1318,7 +1318,7 @@ command GVs) have not yet been type-checked, whereas all others have.
     for (; pn; pn = pn->next) {
         if ((PL::Parsing::Tokens::is_text(pn)) && (pn->next) &&
             (PL::Parsing::Tokens::is_literal(pn->next) == FALSE)) {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TextFollowedBy),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TextFollowedBy),
                 "a '[text]' token must either match the end of some text, or "
                 "be followed by definitely known wording",
                 "since otherwise the run-time parser isn't good enough to "
@@ -1326,7 +1326,7 @@ command GVs) have not yet been type-checked, whereas all others have.
         }
 
         if ((Node::get_grammar_token_relation(pn)) && (gv_is != GV_IS_OBJECT)) {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_GrammarObjectlessRelation),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_GrammarObjectlessRelation),
                 "a grammar token in an 'Understand...' can only be based "
                 "on a relation if it is to understand the name of a room or thing",
                 "since otherwise there is nothing for the relation to be with.");
diff --git a/docs/if-module/5-gp.html b/docs/if-module/5-gp.html
index c3cb29123..af63a7a0c 100644
--- a/docs/if-module/5-gp.html
+++ b/docs/if-module/5-gp.html
@@ -410,7 +410,7 @@ depends on a property permission and not a mere property.
     if (Dash::validate_conditional_clause(spec) == FALSE) {
         LOG("$T", spec);
         current_sentence = PLUGIN_PP(parsing, pp)->visibility_sentence;
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadVisibilityWhen),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadVisibilityWhen),
             "the condition after 'when' makes no sense to me",
             "although otherwise this worked - it is only the part after 'when' "
             "which I can't follow.");
diff --git a/docs/if-module/5-gt.html b/docs/if-module/5-gt.html
index c746b994c..5cd42f3c0 100644
--- a/docs/if-module/5-gt.html
+++ b/docs/if-module/5-gt.html
@@ -114,7 +114,7 @@ changing that discussion.
             gty->second_multiplicity = multiple_flag;
             return score;
         case 2:
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ThreeValuedLine),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ThreeValuedLine),
                 "there can be at most two varying parts to a line of grammar",
                 "so 'put [something] in [a container]' is allowed but 'put "
                 "[something] in [something] beside [a door]' is not.");
diff --git a/docs/if-module/5-gt2.html b/docs/if-module/5-gt2.html
index bed9414dd..8570c9192 100644
--- a/docs/if-module/5-gt2.html
+++ b/docs/if-module/5-gt2.html
@@ -347,7 +347,7 @@ to be used in I7: these are defined by the following routine.
     *X = RELATED_GTC; *XP = NULL;
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, W);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_GrammarBadRelation));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_GrammarBadRelation));
     Problems::issue_problem_segment(
         "The grammar token '%2' in the sentence %1 "
         "invites me to understand names of related things, "
@@ -362,7 +362,7 @@ to be used in I7: these are defined by the following routine.
     *X = TOPIC_TOKEN_GTC;
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, W);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_UseTextNotTopic));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_UseTextNotTopic));
     Problems::issue_problem_segment(
         "The grammar token '%2' in the sentence %1 would in some "
         "ways be the right logical way to suggest 'any words at "
@@ -383,7 +383,7 @@ to be used in I7: these are defined by the following routine.
     *X = MULTI_TOKEN_GTC;
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, W);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_UseThingNotObject));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_UseThingNotObject));
     Problems::issue_problem_segment(
         "The grammar token '%2' in the sentence %1 would in some "
         "ways be the right logical way to suggest 'any object at "
@@ -421,11 +421,11 @@ that nobody complained about what might have been a controversial change.
     Problems::quote_text(2, token_tried);
     Problems::quote_text(3, token_instead);
     Problems::quote_text(4, token_better);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ObsoleteHeldTokens));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ObsoleteHeldTokens));
     Problems::issue_problem_segment(
         "In the sentence %1, you used the '[%2]' as a token, which was "
         "allowed in the early Public Beta versions of Inform 7, but became "
-        "out of date in August 2006%|. A change was then made so that if an "
+        "out of date in August 2006.%L A change was then made so that if an "
         "action needed to apply to something which was carried, this would "
         "now be specified when the action is created - not in the Understand "
         "line for it. For instance, one might say 'Dismantling is an action "
@@ -450,7 +450,7 @@ that nobody complained about what might have been a controversial change.
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, W);
     Problems::quote_kind_of(3, RP[1]);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BizarreToken));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BizarreToken));
     Problems::issue_problem_segment(
         "The grammar token '%2' in the sentence %1 looked to me as "
         "if it might be %3, but this isn't something allowed in "
@@ -466,7 +466,7 @@ that nobody complained about what might have been a controversial change.
     LOG("$T", current_sentence);
     Problems::quote_source(1, current_sentence);
     Problems::quote_wording(2, W);
-    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_UnknownToken));
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_UnknownToken));
     Problems::issue_problem_segment(
         "I was unable to understand what you meant by the grammar token '%2' "
         "in the sentence %1.");
@@ -565,7 +565,7 @@ look seriously at tokens is in Phase II.
             (Kinds::Behaviour::request_I6_GPR(K) == FALSE)) {
             Problems::quote_source(1, current_sentence);
             Problems::quote_wording(2, Node::get_text(pn));
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_UnparsableKind));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_UnparsableKind));
             Problems::issue_problem_segment(
                 "The grammar token '%2' in the sentence %1 "
                 "invites me to understand values typed by the player during "
@@ -851,7 +851,7 @@ nothing else.
         } else if (bp == R_equality) {
             Problems::quote_source(1, current_sentence);
             Problems::quote_source(2, pn);
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RelatedByEquality));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RelatedByEquality));
             Problems::issue_problem_segment(
                 "The grammar you give in %1 contains a token %2 which would "
                 "create a circularity. To follow this, I'd have to compute "
@@ -1000,7 +1000,7 @@ nothing else.
                 } else {
                     Problems::quote_source(1, current_sentence);
                     Problems::quote_source(2, pn);
-                    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_GrammarValueRelation));
+                    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_GrammarValueRelation));
                     Problems::issue_problem_segment(
                         "The grammar you give in %1 contains a token "
                         "which relates things to values - %2. At present, "
@@ -1050,7 +1050,7 @@ nothing else.
                             Problems::quote_source(1, current_sentence);
                             Problems::quote_source(2, pn);
                             Problems::quote_kind(3, K);
-                            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_GrammarValueRelation2));
+                            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_GrammarValueRelation2));
                             Problems::issue_problem_segment(
                                 "The grammar you give in %1 contains a token "
                                 "which relates things to values - %2. (It would "
@@ -1095,7 +1095,7 @@ nothing else.
                     LOG("Whose reversal is: $2\n", BinaryPredicates::get_reversal(bp));
                     Problems::quote_source(1, current_sentence);
                     Problems::quote_source(2, pn);
-                    Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_GrammarTokenCowardice));
+                    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_GrammarTokenCowardice));
                     Problems::issue_problem_segment(
                         "The grammar you give in %1 contains a token "
                         "which uses a relation I'm unable to test - %2.");
@@ -1231,7 +1231,7 @@ nothing else.
     if (Descriptions::is_complex(spec)) {
         Problems::quote_source(1, current_sentence);
         Problems::quote_source(2, pn);
-        Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_OverComplexToken));
+        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_OverComplexToken));
         Problems::issue_problem_segment(
             "The grammar you give in %1 contains a token "
             "which is just too complicated - %2. %PFor instance, a "
@@ -1247,7 +1247,7 @@ nothing else.
             K = PL::Parsing::Tokens::kind_for_special_token(gtc);
             if (code_mode) {
                 if ((consult_mode) && (gtc == TOPIC_TOKEN_GTC)) {
-                    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TextTokenRestricted),
+                    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TextTokenRestricted),
                         "the '[text]' token is not allowed with 'matches' "
                         "or in table columns",
                         "as it is just too complicated to sort out: a "
diff --git a/docs/if-module/5-gv.html b/docs/if-module/5-gv.html
index 3fb0ce890..fdb54ec9e 100644
--- a/docs/if-module/5-gv.html
+++ b/docs/if-module/5-gv.html
@@ -280,7 +280,7 @@ now supplies new ones).
     if (gv->gv_is != GV_IS_COMMAND)
         internal_error("tried to add alias command to non-command GV");
     if (gv->no_aliased_commands == MAX_ALIASED_COMMANDS) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TooManyAliases),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TooManyAliases),
             "this 'understand the command ... as ...' makes too many aliases "
             "for the same command",
             "exceeding the limit of 32.");
@@ -353,7 +353,7 @@ now supplies new ones).
             current_sentence = gv->where_gv_created;
             Problems::quote_source(1, current_sentence);
             Problems::quote_wording(2, gv->command);
-            Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
+            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible));
             Problems::issue_problem_segment(
                 "You wrote %1, but %2 is a built-in Inform testing verb, which "
                 "means it is reserved for Inform's own use and can't be used "
@@ -512,7 +512,7 @@ names (e.g., "suitable colour").
     grammar_verb *gv;
     LOOP_OVER(gv, grammar_verb)
         if ((gv->gv_is == GV_IS_TOKEN) && (Wordings::match(W, gv->name))) {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_GrammarTranslatedAlready),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_GrammarTranslatedAlready),
                 "this grammar token has already been translated",
                 "so there must be some duplication somewhere.");
             return;
@@ -617,7 +617,7 @@ possible.
     LOGIF(GRAMMAR, "Adding grammar line $g to verb $G\n", gl, gv);
     if ((gv->gv_is == GV_IS_COMMAND) &&
         (PL::Parsing::Lines::list_length(gv->first_line) >= MAX_LINES_PER_COMMAND)) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TooManyGrammarLines),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TooManyGrammarLines),
             "this command verb now has too many Understand possibilities",
             "that is, there are too many 'Understand \"whatever ...\" as ...' "
             "which share the same initial word 'whatever'. The best way to "
@@ -704,7 +704,7 @@ pass the buck down to the list of grammar lines.
         return PL::Parsing::Tokens::Types::get_single_type(&(gv->gv_type));
 
     if (depth > NUMBER_CREATED(grammar_verb)) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_GrammarIllFounded),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_GrammarIllFounded),
             "grammar tokens are not allowed to be defined in terms of "
             "themselves",
             "either directly or indirectly.");
diff --git a/docs/if-module/5-nft.html b/docs/if-module/5-nft.html
index 1ef969590..9e4df5476 100644
--- a/docs/if-module/5-nft.html
+++ b/docs/if-module/5-nft.html
@@ -92,7 +92,7 @@ their names (used as I6 tokens), and compile their routines.
     pcalc_prop *prop = Specifications::to_proposition(spec);
     if ((prop) && (Calculus::Variables::number_free(prop) != 1)) {
         LOG("So $P and $D\n", spec, prop);
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_FilterQuantified),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_FilterQuantified),
             "the [any ...] doesn't clearly give a description in the '...' part",
             "where I was expecting something like '[any vehicle]'.");
         spec = Specifications::from_kind(K_object);
@@ -320,14 +320,14 @@ that's why.)
 
 int PL::Parsing::Tokens::Filters::new_id(parse_node *spec, int global_scope, int any_things) {
     if (too_late_for_further_NFTs)
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
             "complicated instructions on understanding the player's command "
             "are not allowed in the past tense",
             "for instance by being applied to several previous turns in a row.");
 
     kind *K = Specifications::to_kind(spec);
     if ((Kinds::Compare::le(K, K_object) == FALSE) && (Kinds::Behaviour::request_I6_GPR(K) == FALSE) && (global_scope))
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
             "this is a kind of value I can't understand in command grammar",
             "so the '[any ...]' part will have to go.");
 
diff --git a/docs/if-module/5-tfg.html b/docs/if-module/5-tfg.html
index 397083e21..994c02098 100644
--- a/docs/if-module/5-tfg.html
+++ b/docs/if-module/5-tfg.html
@@ -242,7 +242,7 @@ As examples:
 
 
     *X = NO_UNDERSTAND_FORM;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_OldVerbUsage),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_OldVerbUsage),
         "this is an outdated form of words",
         "and Inform now prefers 'Understand the command ...' "
         "rather than 'Understand the verb ...'. (Since this "
@@ -292,7 +292,7 @@ formal way (with "property").
 
 
     if (!preform_lookahead_mode)
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnknownUnderstandProperty),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnknownUnderstandProperty),
         "I don't understand what property that refers to",
         "but it doesn't seem to be a property I know. An example of "
         "correct usage is 'understand the transparent property as "
@@ -445,7 +445,7 @@ first is the most popularly used:
 
 
     *X = -1;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TextlessMistake),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TextlessMistake),
         "when 'understand' results in a mistake it can only be "
         "followed by a textual message in brackets",
         "so for instance 'understand \"take\" as a mistake "
@@ -458,7 +458,7 @@ first is the most popularly used:
 
     *X = -1;
     LOG("Offending pseudo-meaning is: %W\n", W);
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandVariable),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandVariable),
         "this meaning is a value that varies",
         "whereas I need something fixed. "
         "(The most common case of this is saying that something should be "
@@ -480,7 +480,7 @@ first is the most popularly used:
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandVague),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandVague),
         "'understand ... as ...' should be followed "
         "by a meaning",
         "which might be an action (e.g., "
@@ -517,7 +517,7 @@ first is the most popularly used:
 
 
     *X = -1;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandCommandWhen),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandCommandWhen),
         "'understand the command ... as ...' is not allowed to have a "
         "'... when ...' clause",
         "for the moment at any rate.");
@@ -572,7 +572,7 @@ to or described can be of any kind, but in fact we restrict to kinds of object.
 
 
     *X = 0;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadUnderstandProperty),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadUnderstandProperty),
         "'understand the ... property as ...' is only allowed if "
         "followed by 'describing ...' or 'referring to ...'",
         "so for instance 'understand the transparent property as "
@@ -584,7 +584,7 @@ to or described can be of any kind, but in fact we restrict to kinds of object.
 
 
     *XP = NULL;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadUnderstandPropertyAs),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadUnderstandPropertyAs),
         "I don't understand what single thing or kind of thing that refers to",
         "but it does need to be an object (or kind of object) and not "
         "some other sort of value. For instance, 'understand the transparent "
@@ -684,7 +684,7 @@ problem message for this case is now commented out.
     wchar_t *p = Lexer::word_text(Wordings::first_wn(W));
     for (int i=0; p[i]; i++)
         if (p[i] == ' ') {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_SpacyCommand),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_SpacyCommand),
                 "'understand the command ... as ...' is only allowed when "
                 "the old command is a single word",
                 "so for instance 'understand the command \"capture\" as \"get\"' "
@@ -702,7 +702,7 @@ problem message for this case is now commented out.
                 DESTROY(gv, grammar_verb);
                 gv = NULL;
             } else {
-                Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NotNewCommand),
+                StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NotNewCommand),
                     "'understand the command ... as ...' is only allowed when "
                     "the new command has no meaning already",
                     "so for instance 'understand \"drop\" as \"throw\"' is not "
@@ -724,7 +724,7 @@ problem message for this case is now commented out.
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NotOldCommand),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NotOldCommand),
         "'understand the command ... as ...' should end with a command "
         "already defined",
         "as in 'understand the command \"steal\" as \"take\"'. (This "
@@ -745,7 +745,7 @@ problem message for this case is now commented out.
         (Str::len(Kinds::Behaviour::get_recognition_only_GPR(Properties::Valued::kind(pr))) == 0) &&
         ((Kinds::Compare::le(Properties::Valued::kind(pr), K_object)) ||
             (Kinds::Behaviour::request_I6_GPR(Properties::Valued::kind(pr)) == FALSE))) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadReferringProperty),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadReferringProperty),
             "that property is of a kind which I can't recognise in "
             "typed commands",
             "so that it cannot be understand as describing or referring to "
@@ -755,7 +755,7 @@ problem message for this case is now commented out.
             "(like snippet or rulebook, for instance) I can't use.");
     }
     if (PL::Parsing::Visibility::seek(pr, subj, level, WHENW) == FALSE) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnknownUnpermittedProperty),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnknownUnpermittedProperty),
             "that property is not allowed for the thing or kind in question",
             "just as (ordinarily) 'understand the open property as describing a "
             "device' would not be allowed because it makes no sense to call a "
@@ -769,11 +769,11 @@ problem message for this case is now commented out.
 
 void PL::Parsing::understand_nothing(understanding_reference *ur, wording WHENW) {
     if ((ur == NULL) || (ur->gv_result != GV_IS_OBJECT) || (ur->an_reference == NULL)) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandNothingNonAction),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandNothingNonAction),
             "'Understand nothing as ...' must be followed by an action",
             "such as 'Understand nothing as taking.'");
     } else if (Wordings::nonempty(WHENW)) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandNothingWhen),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandNothingWhen),
             "'Understand nothing as ...' must be unconditional",
             "so your 'when' or 'while' condition will have to go.");
     } else {
@@ -806,22 +806,22 @@ problem message for this case is now commented out.
     if (problem_count > base_problem_count) return;
     if (<quoted-text>(W) == FALSE) {
         if (table_entry)
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
                 "a table entry in a 'topic' column must be a single double-quoted "
                 "text",
                 "such as \"eternity\" or \"peruvian skies\".");
         else if (TEST_COMPILATION_MODE(SPECIFICATIONS_CMODE))
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NontextualUnderstandInAP),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NontextualUnderstandInAP),
                 "the topic here should be in the form of a textual description",
                 "as in 'asking about \"[something]\"'.");
         else
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NontextualUnderstand),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NontextualUnderstand),
                 "'understand' should be followed by a textual description",
                 "as in 'understand \"take [something]\" as taking the noun'.");
         return;
     }
     if (Word::well_formed_text_routine(Lexer::word_text(Wordings::first_wn(W))) == FALSE) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandMismatch),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandMismatch),
             "'understand' should be followed by text in which brackets "
             "'[' and ']' match",
             "so for instance 'understand \"take [something]\" as taking the noun' "
@@ -850,7 +850,7 @@ problem message for this case is now commented out.
                     gv_is = GV_IS_OBJECT;
                     if (Descriptions::is_qualified(spec)) {
                         LOG("Offending description: $T", spec);
-                        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandAsQualified),
+                        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandAsQualified),
                             "I cannot understand text as meaning an object "
                             "qualified by relative clauses or properties",
                             "only a specific thing, a specific value or a kind. "
@@ -875,7 +875,7 @@ problem message for this case is now commented out.
                             gv_is = GV_IS_VALUE;
                         } else {
                             if (Kinds::get_construct(K) == CON_activity)
-                            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandAsActivity),
+                            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandAsActivity),
                                 "this 'understand ... as ...' gives text "
                                 "meaning an activity",
                                 "rather than an action. Since activities "
@@ -883,7 +883,7 @@ problem message for this case is now commented out.
                                 "happen, not in response to typed commands, "
                                 "this doesn't make sense.");
                             else
-                            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandAsBadValue),
+                            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandAsBadValue),
                                 "'understand ... as ...' gives text "
                                 "meaning a value whose kind is not allowed",
                                 "and should be a value such as 100.");
@@ -930,7 +930,7 @@ problem message for this case is now commented out.
     }
 
     if ((pluralised) && (gv_is != GV_IS_OBJECT)) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandPluralValue),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandPluralValue),
             "'understand' as a plural can only apply to things, rooms or kinds "
             "of things or rooms",
             "so 'Understand \"paperwork\" as the plural of a document.' is "
@@ -949,7 +949,7 @@ problem message for this case is now commented out.
             literal_punct = TRUE;
     }
     if (literal_punct) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LiteralPunctuation),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LiteralPunctuation),
             "'understand' text cannot contain literal punctuation",
             "or more specifically cannot contain any of these: . , ! ? : ; "
             "since they are already used in various ways by the parser, and "
@@ -961,7 +961,7 @@ problem message for this case is now commented out.
     to_pn = NounPhrases::new_raw(W);
     PL::Parsing::Tokens::break_into_tokens(to_pn, XW);
     if (to_pn->down == NULL) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandEmptyText),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandEmptyText),
             "'understand' should be followed by text which contains at least "
             "one word or square-bracketed token",
             "so for instance 'understand \"take [something]\" as taking' "
@@ -976,7 +976,7 @@ problem message for this case is now commented out.
         LOOP_THROUGH_WORDING(i, XW)
             if (i < Wordings::last_wn(XW))
                 if ((compare_word(i, COMMA_V)) && (compare_word(i+1, COMMA_V))) {
-                    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandCommaCommand),
+                    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandCommaCommand),
                         "'understand' as an action cannot involve a comma",
                         "since a command leading to an action never does. "
                         "(Although Inform understands commands like 'PETE, LOOK' "
@@ -1001,7 +1001,7 @@ problem message for this case is now commented out.
     if (Wordings::nonempty(WHENW)) {
         PL::Parsing::Lines::set_understand_when(gl, WHENW);
         if (gv_is == GV_IS_CONSULT) {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),  at present, I7 syntax prevents this anyway
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),  at present, I7 syntax prevents this anyway
                 "'when' cannot be used with this kind of 'Understand'",
                 "for the time being at least.");
             return;
@@ -1010,7 +1010,7 @@ problem message for this case is now commented out.
     if (Wordings::nonempty(WHENW)) {
         PL::Parsing::Lines::set_understand_when(gl, WHENW);
         if (gv_is == GV_IS_CONSULT) {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),  at present, I7 syntax prevents this anyway
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),  at present, I7 syntax prevents this anyway
                 "'when' cannot be used with this kind of 'Understand'",
                 "for the time being at least.");
             return;
@@ -1019,7 +1019,7 @@ problem message for this case is now commented out.
     if (u_prop) {
         PL::Parsing::Lines::set_understand_prop(gl, u_prop);
         if (gv_is == GV_IS_CONSULT) {
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),  at present, I7 syntax prevents this anyway
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),  at present, I7 syntax prevents this anyway
                 "'when' cannot be used with this kind of 'Understand'",
                 "for the time being at least.");
             return;
@@ -1031,7 +1031,7 @@ problem message for this case is now commented out.
             XW = Feeds::feed_C_string_full(Lexer::word_text(Wordings::first_wn(ur->reference_text)), TRUE, GRAMMAR_PUNCTUATION_MARKS);
             LOGIF(GRAMMAR_CONSTRUCTION, "GV_IS_TOKEN as words: %W\n", XW);
             if (PL::Parsing::valid_new_token_name(XW) == FALSE) {
-                Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandAsCompoundText),
+                StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandAsCompoundText),
                     "if 'understand ... as ...' gives the meaning as text "
                     "then it must describe a single new token",
                     "so that 'Understand \"group four/five/six\" as "
diff --git a/docs/index-module/2-dr.html b/docs/index-module/2-dr.html
index 436c186a7..75a216ac0 100644
--- a/docs/index-module/2-dr.html
+++ b/docs/index-module/2-dr.html
@@ -118,7 +118,27 @@ of cross-references generated by Indoc.
 
  • The structure documentation_ref is private to this section.

§3.

-
define DOCUMENTATION_REFERENCES_PRESENT
+
define DOCUMENTATION_REFERENCE_PROBLEMS_CALLBACK Index::DocReferences::show_xref_in_problem
+
+
+void Index::DocReferences::show_xref_in_problem(text_stream *OUT, text_stream *sigil) {
+    wchar_t *chap = NULL, *sec = NULL;
+    wchar_t *leaf = Index::DocReferences::link_if_possible_once(
+        sigil, &chap, &sec);
+    if (leaf) {
+        HTML::open_indented_p(OUT, 2, "tight");
+        HTML_OPEN_WITH("a", "href=inform:/%w.html", leaf);
+        HTML_TAG_WITH("img", "border=0 src=inform:/doc_images/help.png");
+        HTML_CLOSE("a");
+        WRITE("&nbsp;");
+        if ((chap) && (sec)) {
+            WRITE("<i>See the manual: %w &gt; %w</i>", chap, sec);
+        } else {
+            WRITE("<i>See the manual.</i>");
+        }
+        HTML_CLOSE("p");
+    }
+}
 

§4. The blue query icons link to pages in the documentation, as described above. Documentation references are used to match the documentation text against @@ -199,7 +219,7 @@ extension (say doc24

-wchar_t *Index::DocReferences::link_if_possible_once(text_stream *temp, wchar_t **chap, wchar_t **sec) {
+wchar_t *Index::DocReferences::link_if_possible_once(text_stream *temp, wchar_t **chap, wchar_t **sec) {
     Index::DocReferences::read_xrefs();
     documentation_ref *dr;
     LOOP_OVER(dr, documentation_ref)
@@ -307,7 +327,7 @@ following routine.
     }
 }
 
-void Index::DocReferences::link(OUTPUT_STREAM, text_stream *fn) {
+void Index::DocReferences::link(OUTPUT_STREAM, text_stream *fn) {
     Index::DocReferences::link_to_S(OUT, fn, FALSE);
 }
 
@@ -421,7 +441,7 @@ and we need to search fairly seldom:
 

-documentation_ref *Index::DocReferences::name_to_dr(text_stream *fn) {
+documentation_ref *Index::DocReferences::name_to_dr(text_stream *fn) {
     Index::DocReferences::read_xrefs();
     documentation_ref *dr;
     LOOP_OVER(dr, documentation_ref)
diff --git a/docs/index-module/2-ifs.html b/docs/index-module/2-ifs.html
index c234303b1..7159ecd0d 100644
--- a/docs/index-module/2-ifs.html
+++ b/docs/index-module/2-ifs.html
@@ -144,7 +144,7 @@ new index file for output.
     filename *F = Task::index_file(index_leaf, sub);
     if (ifl) Index::close_index_file();
     if (STREAM_OPEN_TO_FILE(&index_file_struct, F, UTF8_ENC) == FALSE)
-        Problems::Fatal::filename_related("Can't open index file", F);
+        Problems::fatal_on_file("Can't open index file", F);
     ifl = &index_file_struct;
     text_stream *OUT = ifl;
 
diff --git a/docs/multimedia-module/2-ef.html b/docs/multimedia-module/2-ef.html
index 1da1ee42a..24cdc63e4 100644
--- a/docs/multimedia-module/2-ef.html
+++ b/docs/multimedia-module/2-ef.html
@@ -124,7 +124,7 @@ with an external file, read or written by the story file during play.
     kind *K = Instances::to_kind(nc);
     if (Kinds::Compare::eq(K, K_external_file)) {
         if (allow_exf_creations == FALSE)
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BackdoorFileCreation),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BackdoorFileCreation),
                 "this is not the way to create a new external file",
                 "which should be done with a special 'The File ... is called ...' "
                 "sentence.");
@@ -175,7 +175,7 @@ with an external file, read or written by the story file during play.
 
 
     *X = NOT_APPLICABLE;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadFileOwner),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadFileOwner),
         "the owner of this file is wrongly specified",
         "since it is not one of the three possibilities - "
         "(1) Specify nothing: making the file belong to this "
@@ -204,7 +204,7 @@ letters or digits, with the first being a letter.
 
 
     *X = -1;
-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_FilenameNotTextual),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_FilenameNotTextual),
         "a file can only be called with a single quoted piece of text",
         "as in: 'The File of Wisdom is called \"wisdom\".'");
 
@@ -267,7 +267,7 @@ letters or digits, with the first being a letter. } if (bad_filename) { LOG("Filename: %s\n", p); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_FilenameUnsafe), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_FilenameUnsafe), "filenames must be very conservatively chosen", "in order to be viable on a wide range of computers. They must " "consist of 3 to 23 English letters or digits, with the first being " @@ -296,7 +296,7 @@ letters or digits, with the first being a letter. LOG("Objected to character %c\n", p[j]); } if ((invalid) || (j==47)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadFileIFID), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadFileIFID), "the owner of the file should be specified " "using a valid double-quoted IFID", "as in: 'The File of Wisdom (owned by project " @@ -313,7 +313,7 @@ letters or digits, with the first being a letter. if ((<s-value>(F)) && (Rvalues::is_CONSTANT_of_kind(<<rp>>, K_external_file))) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_FilenameDuplicate), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_FilenameDuplicate), "this is already the name of a file", "so there must be some duplication somewhere."); return; diff --git a/docs/multimedia-module/2-fgr.html b/docs/multimedia-module/2-fgr.html index 6338f2d76..bd1956b87 100644 --- a/docs/multimedia-module/2-fgr.html +++ b/docs/multimedia-module/2-fgr.html @@ -125,7 +125,7 @@ within the application. kind *K = Instances::to_kind(nc); if (Kinds::Compare::eq(K, K_figure_name)) { if (allow_figure_creations == FALSE) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BackdoorFigureCreation), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BackdoorFigureCreation), "this is not the way to create a new figure name", "which should be done with a special 'Figure ... is the file ...' " "sentence."); @@ -201,7 +201,7 @@ within the application.

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PictureNotTextual),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PictureNotTextual),
         "a figure can only be declared as a quoted file name",
         "which should be the name of a JPEG or PNG image inside the "
         "project's .materials folder. For instance, 'Figure 2 is the "
@@ -233,7 +233,7 @@ is no need to translate this to other languages.)
     Assertions::Creator::vet_name_for_noun(F);
     if ((<s-value>(F)) &&
         (Rvalues::is_CONSTANT_of_kind(<<rp>>, K_figure_name))) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PictureDuplicate),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PictureDuplicate),
             "this is already the name of a Figure",
             "so there must be some duplication somewhere.");
         return;
diff --git a/docs/multimedia-module/2-se.html b/docs/multimedia-module/2-se.html
index d354cee25..392f18e32 100644
--- a/docs/multimedia-module/2-se.html
+++ b/docs/multimedia-module/2-se.html
@@ -120,7 +120,7 @@ within the application.
     kind *K = Instances::to_kind(nc);
     if (Kinds::Compare::eq(K, K_sound_name)) {
         if (allow_sound_creations == FALSE)
-            Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BackdoorSoundCreation),
+            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BackdoorSoundCreation),
                 "this is not the way to create a new sound name",
                 "which should be done with a special 'Sound ... is the file ...' "
                 "sentence.");
@@ -192,7 +192,7 @@ within the application.
 

-    Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_SoundNotTextual),
+    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_SoundNotTextual),
         "a sound effect can only be declared as a quoted file name",
         "which should be the name of an AIFF or OGG file inside the Sounds "
         "subfolder of the project's .materials folder. For instance, 'Sound "
@@ -215,7 +215,7 @@ within the application.
 
     if ((<s-value>(F)) &&
         (Rvalues::is_CONSTANT_of_kind(<<rp>>, K_sound_name))) {
-        Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_SoundDuplicate),
+        StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_SoundDuplicate),
             "this is already the name of a sound effect",
             "so there must be some duplication somewhere.");
         return;
diff --git a/docs/problems-module/1-tlm.html b/docs/problems-module/1-tlm.html
index afe99830e..f4966cc8c 100644
--- a/docs/problems-module/1-tlm.html
+++ b/docs/problems-module/1-tlm.html
@@ -90,12 +90,12 @@ finishes.
 text_stream *telemetry_file = &telemetry_file_struct;  Main telemetry stream
 text_stream *telmy = NULL;  Current telemetry stream
 
-void Telemetry::ensure_telemetry_file(void) {
+void Telemetry::ensure_telemetry_file(void) {
     if (spool_telemetry_to == NULL) return;
     if (telmy) return;
     if (attempts_to_open_telemetry++ > 0) return;
     if (STREAM_OPEN_TO_FILE_APPEND(telemetry_file, spool_telemetry_to, ISO_ENC) == FALSE)
-        Problems::Fatal::filename_related("Can't open telemetry file", spool_telemetry_to);
+        Problems::fatal_on_file("Can't open telemetry file", spool_telemetry_to);
     telmy = telemetry_file;
     WRITE_TO(telmy, "\n-- -- -- -- -- -- -- --\n%B (build %B): telemetry.\n",
         FALSE, TRUE);
diff --git a/docs/problems-module/2-pl0.html b/docs/problems-module/2-pl0.html
index ef34e1901..3d003d335 100644
--- a/docs/problems-module/2-pl0.html
+++ b/docs/problems-module/2-pl0.html
@@ -66,7 +66,7 @@ function togglePopup(material_id) {
     
 

To handle fatal errors and establish how problem sigils work.

-
+

§1. Sudden exits. In my beginning is my end: this lowest level of the error-handling system deals with systemic collapses, and it begins with the exit itself. Note that @@ -85,39 +85,58 @@ filing-system-related failure. int echo_problem_message_sigils = FALSE; int crash_on_all_problems = FALSE; -void Problems::Fatal::exit(int code) { +void ProblemSigils::exit(int code) { if ((sigil_of_required_problem) && (sigil_of_required_problem_found == FALSE)) exit(0); so that the problem test case will fail in intest exit(code); }

-

§2. Inform calls this in response to its -require-problem command line switch: +

§2. The following function has had an amusing evolution over the years. It does +something nobody is ever supposed to do: deliberately crashes the process. +At one time it executed int x = 1/0;, but compilers got wise to that, or +else would detect that such an expression had no side effects and was not used. +What we now do is to dereference a null pointer, while apparently trying to make +use of the result.

-void Problems::Fatal::require(text_stream *sigil) {
+void ProblemSigils::force_crash(void) {
+    STREAM_FLUSH(STDOUT);
+    STREAM_FLUSH(DL);
+    WRITE_TO(STDERR,
+        "*** Intentionally crashing to force stack backtrace to console logs ***\n");
+    STREAM_FLUSH(STDERR);
+    parse_node *PN = NULL; LOG("$T", PN->next);
+    ProblemSigils::exit(1);  should never in fact be reached
+}
+
+

§3. Configuration. Inform calls this in response to its -require-problem command line switch: +

+ +
+void ProblemSigils::require(text_stream *sigil) {
     sigil_of_required_problem = Str::duplicate(sigil);
 }
 
-

§3. And this in response to -sigils, which causes the sigil of any problem to +

§4. And this in response to -sigils, which causes the sigil of any problem to be echoed to standard output (i.e., printed). Again, this is useful in testing.

-void Problems::Fatal::echo_sigils(int state) {
+void ProblemSigils::echo_sigils(int state) {
     echo_problem_message_sigils = state;
 }
 
-

§4. And this in response to -crash-all, an ugly expedient for working with +

§5. And this in response to -crash-all, an ugly expedient for working with Inform in the debugger.

-void Problems::Fatal::crash_on_problems(int state) {
+void ProblemSigils::crash_on_problems(int state) {
     crash_on_all_problems = state;
 }
 
-

§5. Sigils. Every problem message in Inform is identified by a sigil, a short alphanumeric +

§6. Sigils. Every problem message in Inform is identified by a sigil, a short alphanumeric symbol. The _p_ notation is used to write these; this expands to the name in double quotes followed by the source section and line number at which it is generated. @@ -125,7 +144,7 @@ generated.

define _p_(sigil) #sigil, __FILE__, __LINE__
 
-

§6. That means that when a _p_ argument is given to a function, it is actually +

§7. That means that when a _p_ argument is given to a function, it is actually a list of three arguments, matching the SIGIL_ARGUMENTS prototype. SIGIL_ARGUMENTS appears as a pseudo-argument in the function prototypes of the many of the functions in this module as a result. @@ -138,7 +157,7 @@ another problem function, using define SIGIL_ARGUMENTS char *sigil, char *file, int line define PASS_SIGIL sigil, file, line

-

§7. We will maintain the following variables. The distinction is that the +

§8. We will maintain the following variables. The distinction is that the "unlinked" one holds the sigil of a message which is next up to be hyperlinked to documentation; sigil_of_latest_unlinked_problem is then emptied when this is done, whereas sigil_of_latest_problem keeps its value until the next @@ -149,7 +168,7 @@ problem is issued. text_stream *sigil_of_latest_problem = NULL; text_stream *sigil_of_latest_unlinked_problem = NULL;

-

§8. So, then, the following long macro is how a function "acts" on a sigil: +

§9. So, then, the following long macro is how a function "acts" on a sigil:

define ACT_ON_SIGIL
@@ -173,44 +192,6 @@ problem is issued.
     if (echo_problem_message_sigils)
         WRITE_TO(STDERR, "Problem__ %S\n", sigil_of_latest_problem);
 
-

§9. Further fatalities.

- -
-void Problems::Fatal::issue(char *message) {
-    WRITE_TO(STDERR, message);
-    WRITE_TO(STDERR, "\n");
-    STREAM_FLUSH(STDERR);
-    if (crash_on_all_problems) Problems::Fatal::force_crash();
-    Problems::Fatal::exit(2);
-}
-
-void Problems::Fatal::filename_related(char *message, filename *F) {
-    WRITE_TO(STDERR, message);
-    WRITE_TO(STDERR, "\nOffending filename: <%f>\n", F);
-    STREAM_FLUSH(STDERR);
-    if (crash_on_all_problems) Problems::Fatal::force_crash();
-    Problems::Fatal::exit(2);
-}
-
-

§10. The following function has had an amusing evolution over the years. It does -something nobody is ever supposed to do: deliberately crashes the process. -At one time it executed int x = 1/0;, but compilers got wise to that, or -else would detect that such an expression had no side effects and was not used. -What we now do is to dereference a null pointer, while apparently trying to make -use of the result. -

- -
-void Problems::Fatal::force_crash(void) {
-    STREAM_FLUSH(STDOUT);
-    STREAM_FLUSH(DL);
-    WRITE_TO(STDERR,
-        "*** Intentionally crashing to force stack backtrace to console logs ***\n");
-    STREAM_FLUSH(STDERR);
-    parse_node *PN = NULL; LOG("$T", PN->next);
-    Problems::Fatal::exit(1);  should never in fact be reached
-}
-
diff --git a/docs/problems-module/2-pl1.html b/docs/problems-module/2-pl1.html index 9abfac664..2686a21b1 100644 --- a/docs/problems-module/2-pl1.html +++ b/docs/problems-module/2-pl1.html @@ -66,7 +66,7 @@ function togglePopup(material_id) {

To render problem messages either as plain text or HTML, and write them out to files.

-
+

§1. Buffering. Only one error text needs to be stored in memory at any one time, so we keep it in a single text stream: @@ -75,7 +75,7 @@ it in a single text stream:

 text_stream *PBUFF = NULL;
 
-void Problems::Buffer::clear(void) {
+void ProblemBuffer::clear(void) {
     if (PBUFF == NULL) PBUFF = Str::new();
     else Str::clear(PBUFF);
 }
@@ -95,7 +95,7 @@ any sentence in one go:
 
define QUOTATION_TOLERANCE_LIMIT 100
 
-void Problems::Buffer::copy_text_into_problem_buffer(wording W) {
+void ProblemBuffer::copy_text(wording W) {
     W = Wordings::truncate(W, QUOTATION_TOLERANCE_LIMIT);
     WRITE_TO(PBUFF, "%<W", W);
 }
@@ -106,7 +106,8 @@ any sentence in one go:
 
 parse_node *redirected_sentence = NULL;
 parse_node *redirected_to_A = NULL, *redirected_to_B = NULL;
-void Problems::Buffer::redirect_problem_sentence(parse_node *from, parse_node *A, parse_node *B) {
+void ProblemBuffer::redirect_problem_sentence(parse_node *from,
+    parse_node *A, parse_node *B) {
     redirected_sentence = from; redirected_to_A = A; redirected_to_B = B;
 }
 
@@ -118,13 +119,12 @@ mask out angle brackets which we don't want to interpret as HTML: define PROTECTED_GT_CHAR L'\x02'
-void Problems::Buffer::copy_source_reference_into_problem_buffer(wording W) {
+void ProblemBuffer::copy_source_reference(wording W) {
     if (Wordings::empty(W)) { WRITE_TO(PBUFF, "<no text>"); return; }
     source_file *referred = Lexer::file_of_origin(Wordings::first_wn(W));
     TEMPORARY_TEXT(file);
     if (referred) {
         WRITE_TO(file, "%f", TextFromFiles::get_filename(referred));
-        #ifdef HTML_MODULE
         pathname *proj = HTML::get_link_abbreviation_path();
         if (proj) {
             TEMPORARY_TEXT(project_prefix);
@@ -132,25 +132,14 @@ mask out angle brackets which we don't want to interpret as HTML:
             if (Str::prefix_eq(file, project_prefix, Str::len(project_prefix)))
                 Str::delete_n_characters(file, Str::len(project_prefix));
         }
-        #endif
     } else {
         WRITE_TO(file, "(no file)");
     }
     WRITE_TO(PBUFF, "'");
-    Problems::Buffer::copy_text_into_problem_buffer(W);
+    ProblemBuffer::copy_text(W);
     text_stream *paraphrase = file;
-    #ifdef SUPERVISOR_MODULE
-    paraphrase = I"source text";
-    inform_extension *E = Extensions::corresponding_to(referred);
-    if (E) {
-        inbuild_work *work = E->as_copy->edition->work;
-        if ((work) && (Works::is_standard_rules(work)))
-            paraphrase = I"the Standard Rules";
-        else if ((work) && (Works::is_basic_inform(work)))
-            paraphrase = I"Basic Inform";
-        else
-            paraphrase = file;
-    }
+    #ifdef DESCRIBE_SOURCE_FILE_PROBLEMS_CALLBACK
+    paraphrase = DESCRIBE_SOURCE_FILE_PROBLEMS_CALLBACK(paraphrase, referred, file);
     #endif
     WRITE_TO(PBUFF, "' %c%S%c%S%c%d%c",
         SOURCE_REF_CHAR, paraphrase,
@@ -162,10 +151,10 @@ mask out angle brackets which we don't want to interpret as HTML:
         (redirected_to_B) &&
         (Wordings::eq(Node::get_text(redirected_sentence), W))) {
         WRITE_TO(PBUFF, " (which asserts that ");
-        Problems::Buffer::copy_source_reference_into_problem_buffer(
+        ProblemBuffer::copy_source_reference(
             Node::get_text(redirected_to_A));
         WRITE_TO(PBUFF, " is/are ");
-        Problems::Buffer::copy_source_reference_into_problem_buffer(
+        ProblemBuffer::copy_source_reference(
             Node::get_text(redirected_to_B));
         WRITE_TO(PBUFF, ")");
     }
@@ -174,7 +163,7 @@ mask out angle brackets which we don't want to interpret as HTML:
 

§5. Once the error message is fully constructed, we will want to output it to a file: in fact, by default it will go in three directions, to -stderr, to the debugging log and of course to the error log. The main +stderr, to the debugging log and of course to the problems file. The main thing is to word-wrap it, since it is likely to be a paragraph-sized chunk of text, not a single line. The unprintable SOURCE_REF_CHAR and FORCE_NEW_PARA_CHAR are simply filtered out for plain text output: for @@ -184,18 +173,13 @@ HTML, they are dealt with elsewhere.

 int problem_count_at_last_in = 1;
 text_stream problems_file_struct;  The actual report of Problems file
-text_stream *problems_file = &problems_file_struct;  The actual report of Problems file
-
-text_stream *probl = NULL;  Current destination of problem message text
-
-int it_is_not_worth_adding = FALSE;  To suppress the "It may be worth adding..."
-
+text_stream *problems_file = &problems_file_struct;  As a text_sream *
 
 #ifndef PROBLEMS_HTML_EMITTER
 #define PROBLEMS_HTML_EMITTER PUT_TO
 #endif
 
-void Problems::Buffer::output_problem_buffer_to(OUTPUT_STREAM, int indentation) {
+void ProblemBuffer::output_problem_buffer_to(OUTPUT_STREAM, int indentation) {
     int line_width = 0, html_flag = FALSE;
     if (OUT == problems_file) html_flag = TRUE;
     for (int k=0; k<indentation; k++) { WRITE("  "); line_width+=2; }
@@ -319,10 +303,12 @@ and Windows caused by the slashes going the wrong way, and so on.
 
 
     WRITE("("); line_width++;
-    while (Str::get_at(PBUFF, ++i) != SOURCE_REF_CHAR) Output single character of problem message5.4;
+    while (Str::get_at(PBUFF, ++i) != SOURCE_REF_CHAR)
+        Output single character of problem message5.4;
     while (Str::get_at(PBUFF, ++i) != SOURCE_REF_CHAR) ;
     WRITE(", line "); line_width += 7;
-    while (Str::get_at(PBUFF, ++i) != SOURCE_REF_CHAR) Output single character of problem message5.4;
+    while (Str::get_at(PBUFF, ++i) != SOURCE_REF_CHAR)
+        Output single character of problem message5.4;
     WRITE(")"); line_width++;
 
  • This code is used in §5.
@@ -368,34 +354,57 @@ after the sequence of whitespace. }
  • This code is used in §5.4.
-

§6. The following handles the three-way distribution of problems, but also -allows us to route individual messages to only one output of our choice by -temporarily setting the probl variable: which is a convenience for -informational messages such as appear in index files, for instance. +

§6. The following allows us to route individual messages to only one output of +our choice.

-void Problems::Buffer::redirect_problem_stream(text_stream *S) {
-    probl = S;
+text_stream *redirected_problem_text = NULL;  Current destination of problem message text
+void ProblemBuffer::redirect_problem_stream(text_stream *S) {
+    redirected_problem_text = S;
 }
 
 int telemetry_recording = FALSE;
 
-void Problems::Buffer::output_problem_buffer(int indentation) {
-    if (probl == NULL) {
-        Problems::Buffer::output_problem_buffer_to(problems_file, indentation);
+void ProblemBuffer::output_problem_buffer(int indentation) {
+    if (redirected_problem_text == NULL) {
+        ProblemBuffer::output_problem_buffer_to(problems_file, indentation);
         WRITE_TO(problems_file, "\n");
-        Problems::Buffer::output_problem_buffer_to(STDERR, indentation);
+        ProblemBuffer::output_problem_buffer_to(STDERR, indentation);
         STREAM_FLUSH(STDERR);
         WRITE_TO(DL, "\n");
-        Problems::Buffer::output_problem_buffer_to(DL, indentation);
+        ProblemBuffer::output_problem_buffer_to(DL, indentation);
         WRITE_TO(DL, "\n");
         if (telemetry_recording) {
             WRITE_TO(telmy, "\n");
-            Problems::Buffer::output_problem_buffer_to(telmy, indentation);
+            ProblemBuffer::output_problem_buffer_to(telmy, indentation);
             WRITE_TO(telmy, "\n");
         }
-    } else Problems::Buffer::output_problem_buffer_to(probl, indentation);
+    } else ProblemBuffer::output_problem_buffer_to(redirected_problem_text, indentation);
+}
+
+

§7. Problems report and index. That gives us enough infrastructure to produce the final report. Note the use +of error redirection to in order to put pseudo-problem messages — actually +informational — into the report. In the case where the run was successful and +there we no Problem messages, we have to be careful to reset problem_count +— it will have been increased by the issuing of these pseudo-problems, and we +need it to remain 0 so that main() can finally return back to the operating +system without an error code. +

+ +
+int tail_of_report_written = FALSE;
+void ProblemBuffer::write_reports(int disaster_struck) {
+    if (tail_of_report_written) return;
+    tail_of_report_written = TRUE;
+
+    crash_on_all_problems = FALSE;
+    #ifdef INFORMATIONAL_ADDENDA_PROBLEMS_CALLBACK
+    int pc = problem_count;
+    INFORMATIONAL_ADDENDA_PROBLEMS_CALLBACK(disaster_struck, problem_count);
+    problem_count = pc;
+    #endif
+    HTML::end_body(problems_file);
 }
 
-

§7. And here is the callback function. It's only ever needed for inform7, +

§9. And here is the callback function. It's only ever needed for inform7, not for inbuild, which isn't in the inventions business.

-
define NEW_NONSTRUCTURAL_SENTENCE_SYNTAX_CALLBACK SourceText::annotate_new_sentence
+
define NEW_NONSTRUCTURAL_SENTENCE_SYNTAX_CALLBACK SourceText::annotate_new_sentence
 
 void SourceText::annotate_new_sentence(parse_node *new) {
@@ -231,7 +264,7 @@ not for inbuild, which isn'
     }
 }
 
-

§8. The next tweak to syntax is to give it some node metadata. syntax +

§10. The next tweak to syntax is to give it some node metadata. syntax itself places nodes of a small number of basic types into the syntax tree; we want to expand on those. (And the core module will expand on them still further, so this still isn't everything: see Parse Tree Usage (in core).) @@ -242,7 +275,7 @@ look for below. (The asterisk notation for define NODE_METADATA_SETUP_SYNTAX_CALLBACK SourceText::node_metadata +

define NODE_METADATA_SETUP_SYNTAX_CALLBACK SourceText::node_metadata
 enum BIBLIOGRAPHIC_NT     For the initial title sentence
 enum RULE_NT           "Instead of taking something, ..."
 enum INFORM6CODE_NT       "Include (- ... -)
@@ -264,7 +297,7 @@ Inform users: it increases output to the debugging log.)
     NodeType::new(INVOCATION_LIST_NT, I"INVOCATION_LIST_NT", 0, INFTY, L4_NCAT, 0);
 }
 
-

§9. Sentences in the source text are of five categories: dividing sentences, +

§11. Sentences in the source text are of five categories: dividing sentences, which divide up the source into segments; structural sentences, which split the source into different forms (standard text, tables, equations, I6 matter, and so on); nonstructural sentences, which make grammatical definitions and @@ -313,15 +346,15 @@ and here goes: section ... ==> 5 <extension-end-marker-sentence> ::= - ... begin/begins here | ==> -1; Check we can begin an extension here9.1; - ... end/ends here ==> -2; Check we can end an extension here9.2; + ... begin/begins here | ==> -1; Check we can begin an extension here11.1; + ... end/ends here ==> -2; Check we can end an extension here11.2;

-

§9.1. Note that the extension end markers are only read in extensions, so they can +

§11.1. Note that the extension end markers are only read in extensions, so they can never accidentally match in the main source text.

-

Check we can begin an extension here9.1 = +

Check we can begin an extension here11.1 =

@@ -331,8 +364,8 @@ never accidentally match in the main source text.
         case 3: PROBLEM_SYNTAX_CALLBACK(ExtBeginsAfterEndsHere_SYNERROR, W, sfsm->ref, 0); break;
     }
 
-
  • This code is used in §9.
-

§9.2. Check we can end an extension here9.2 = +

  • This code is used in §11.
+

§11.2. Check we can end an extension here11.2 =

@@ -342,8 +375,8 @@ never accidentally match in the main source text.
         case 3: PROBLEM_SYNTAX_CALLBACK(ExtMultipleEndsHere_SYNERROR, W, sfsm->ref, 0); break;
     }
 
-
  • This code is used in §9.
-

§10. syntax also requires this definition: +

  • This code is used in §11.
+

§12. syntax also requires this definition:

@@ -360,7 +393,7 @@ never accidentally match in the main source text.
     include (- ...                                 ==> 0; sfsm->nt = INFORM6CODE_NT;
 
-

§11. Rules are ordinarily detected by their colon, which divides the header from the +

§13. Rules are ordinarily detected by their colon, which divides the header from the rest: colons are not otherwise legal in Inform. But there's an exception. If the sentence consists of text matching the following grammar, followed by comma, followed by more text, then the comma is read as if it's a colon and the @@ -380,7 +413,7 @@ sentence becomes a rule. For example: when ...

-

§12. Properly speaking, despite the definition above, language modifying sentences +

§14. Properly speaking, despite the definition above, language modifying sentences are nonstructural. So what are they doing here? The answer is that we need to read them early on, because they affect the way that they parse all other sentences. Whereas other nonstructural sentences can wait, these can't. @@ -392,12 +425,12 @@ sentences. Whereas other nonstructural sentences can wait, these can't. use ... language element/elements ==> -1

-

§13. The following callback function is called by syntax when it breaks a +

§15. The following callback function is called by syntax when it breaks a sentence of type BEGINHERE_NT or ENDHERE_NT — i.e., the beginning or end of an extension.

-
define BEGIN_OR_END_HERE_SYNTAX_CALLBACK SourceText::new_beginend
+
define BEGIN_OR_END_HERE_SYNTAX_CALLBACK SourceText::new_beginend
 
 void SourceText::new_beginend(parse_node *pn, inbuild_copy *C) {
@@ -406,7 +439,7 @@ of an extension.
     if (Node::get_type(pn) == ENDHERE_NT) Inclusions::check_ends_here(pn, E);
 }
 
-

§14. Lastly, this callback is called by syntax when it hits a sentence like: +

§16. Lastly, this callback is called by syntax when it hits a sentence like:

@@ -417,7 +450,7 @@ of an extension. stack into the new world of kits), so we issue a syntax error.

-
define LANGUAGE_ELEMENT_SYNTAX_CALLBACK SourceText::new_language
+
define LANGUAGE_ELEMENT_SYNTAX_CALLBACK SourceText::new_language
 
 void SourceText::new_language(wording W) {
diff --git a/docs/supervisor-module/P-wtmd.html b/docs/supervisor-module/P-wtmd.html
index c2c844269..d6801a066 100644
--- a/docs/supervisor-module/P-wtmd.html
+++ b/docs/supervisor-module/P-wtmd.html
@@ -463,7 +463,7 @@ to headings like:
     

Chapter 7a (in place of Chapter 7 in Applied Pathology by Attila Hun)

-

This is performed by Headings::satisfy_individual_heading_dependency, +

This is performed by Headings::satisfy_individual_heading_dependency, and it has to be done after all the extension inclusions have been made. It's a step only performed for the syntax tree of a whole project: if we've just made an isolated tree for a single extension, we don't bother, because we diff --git a/inbuild/supervisor-module/Chapter 5/Kit Services.w b/inbuild/supervisor-module/Chapter 5/Kit Services.w index c2c9b718e..357b9ebd1 100644 --- a/inbuild/supervisor-module/Chapter 5/Kit Services.w +++ b/inbuild/supervisor-module/Chapter 5/Kit Services.w @@ -239,7 +239,7 @@ void Kits::activate_elements(inform_kit *K) { LOOP_OVER_LINKED_LIST(EA, element_activation, K->activations) { int S = Plugins::Manage::parse(EA->element_name); if (S == -1) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(Untestable), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(Untestable), "one of the Inform kits made reference to a language segment " "which does not exist", "which suggests that Inform is not properly installed, unless " diff --git a/inbuild/supervisor-module/Chapter 6/Headings.w b/inbuild/supervisor-module/Chapter 6/Headings.w index dc856c108..c2579be34 100644 --- a/inbuild/supervisor-module/Chapter 6/Headings.w +++ b/inbuild/supervisor-module/Chapter 6/Headings.w @@ -555,6 +555,15 @@ wording Headings::get_text(heading *h) { return h->heading_text; } +@ Whence: + +@d WORDING_FOR_HEADING_NODE_PROBLEMS_CALLBACK Headings::wording_for_heading_node + += +wording Headings::wording_for_heading_node(parse_node *p) { + return Headings::get_text(Headings::from_node(p)); +} + @h Headings with extension dependencies. If the content under a heading depended on a VM not in use, or was marked not for release in a release run, we were able to exclude it just by diff --git a/inbuild/supervisor-module/Chapter 6/Source Text.w b/inbuild/supervisor-module/Chapter 6/Source Text.w index 67f730e05..a96dd0c8b 100644 --- a/inbuild/supervisor-module/Chapter 6/Source Text.w +++ b/inbuild/supervisor-module/Chapter 6/Source Text.w @@ -75,6 +75,39 @@ applications. STREAM_FLUSH(STDOUT); LOG(message, synopsis, wc); +@h Bridge to the problems system. +These are both used when issuing problem messages on content in the relevant +source files. + +@d DESCRIBE_SOURCE_FILE_PROBLEMS_CALLBACK SourceText::describe_source_file + += +text_stream *SourceText::describe_source_file(text_stream *paraphrase, + source_file *referred, text_stream *file) { + paraphrase = I"source text"; + inform_extension *E = Extensions::corresponding_to(referred); + if (E) { + inbuild_work *work = E->as_copy->edition->work; + if ((work) && (Works::is_standard_rules(work))) + paraphrase = I"the Standard Rules"; + else if ((work) && (Works::is_basic_inform(work))) + paraphrase = I"Basic Inform"; + else + paraphrase = file; + } + return paraphrase; +} + +@ + +@d GLOSS_EXTENSION_SOURCE_FILE_PROBLEMS_CALLBACK SourceText::gloss_extension + += +void SourceText::gloss_extension(text_stream *OUT, source_file *referred) { + inform_extension *E = Extensions::corresponding_to(referred); + if (E) WRITE(" in the extension %X", E->as_copy->edition->work); +} + @h Bridge to the syntax analyser. Similarly, //supervisor// sits on top of the //syntax// module, which forms up the stream of words from the lexer into syntax trees. This too produces diff --git a/inform7/core-module/Chapter 1/Main Routine.w b/inform7/core-module/Chapter 1/Main Routine.w index 1574982ca..6498080d9 100644 --- a/inform7/core-module/Chapter 1/Main Routine.w +++ b/inform7/core-module/Chapter 1/Main Routine.w @@ -36,7 +36,7 @@ int CoreMain::main(int argc, char *argv[]) { @; if (proceed) @; - if (problem_count > 0) Problems::Fatal::exit(1); + if (problem_count > 0) ProblemSigils::exit(1); return 0; } @@ -46,7 +46,7 @@ problems report) rather than simply causing an abrupt exit with only a plain text error written to |stderr|. See the |problems| module for more. @ = - Errors::set_internal_handler(&Problems::Issue::internal_error_fn); + Errors::set_internal_handler(&StandardProblems::internal_error_fn); PRINT("Inform 7 v[[Version Number]] has started.\n", FALSE, TRUE); Plugins::Manage::start(); inform7_timer = Time::start_stopwatch(NULL, I"inform7 run"); @@ -60,7 +60,7 @@ isn't set up to allow more, so this error is not easy to generate. inform_project *proj; LOOP_OVER(proj, inform_project) { if (project) - Problems::Fatal::issue( + Problems::fatal( "Multiple projects given on the command line"); project = proj; } @@ -74,7 +74,7 @@ but we won't assume that. Remember, //supervisor// knows best. @ = pathname *build_folder = Projects::build_path(project); if (Pathnames::create_in_file_system(build_folder) == 0) - Problems::Fatal::issue( + Problems::fatal( "Unable to create Build folder for project: is it read-only?"); filename *DF = Filenames::in(build_folder, I"Debug log.txt"); @@ -86,7 +86,7 @@ but we won't assume that. Remember, //supervisor// knows best. CommandLine::play_back_log(); filename *PF = Filenames::in(build_folder, I"Problems.html"); - Problems::Issue::start_problems_report(PF); + StandardProblems::start_problems_report(PF); HTML::set_link_abbreviation_path(Projects::path(project)); @@ -155,7 +155,7 @@ they can be rather lengthy. } @ = - Problems::write_reports(FALSE); + ProblemBuffer::write_reports(FALSE); LOG("Total of %d files written as streams.\n", total_file_writes); Writers::log_escape_usage(); WRITE_TO(STDOUT, "Inform 7 has finished.\n"); @@ -253,12 +253,12 @@ int do_not_update_census = FALSE; /* Set by the |-no-update-census| command line void CoreMain::switch(int id, int val, text_stream *arg, void *state) { switch (id) { case CRASHALL_CLSW: debugger_mode = val; - Problems::Fatal::crash_on_problems(val); break; + ProblemSigils::crash_on_problems(val); break; case INDEX_CLSW: do_not_generate_index = val?FALSE:TRUE; break; case CENSUS_UPDATE_CLSW: do_not_update_census = val?FALSE:TRUE; break; case PROGRESS_CLSW: show_progress_indicator = val; break; - case SIGILS_CLSW: Problems::Fatal::echo_sigils(val); break; - case REQUIRE_PROBLEM_CLSW: Problems::Fatal::require(arg); break; + case SIGILS_CLSW: ProblemSigils::echo_sigils(val); break; + case REQUIRE_PROBLEM_CLSW: ProblemSigils::require(arg); break; case DIAGNOSTICS_CLSW: diagnostics_path = Pathnames::from_text(arg); break; } Supervisor::option(id, val, arg, state); diff --git a/inform7/core-module/Chapter 10/Conditions and Phrases.w b/inform7/core-module/Chapter 10/Conditions and Phrases.w index d6618db77..94720cb15 100644 --- a/inform7/core-module/Chapter 10/Conditions and Phrases.w +++ b/inform7/core-module/Chapter 10/Conditions and Phrases.w @@ -188,7 +188,7 @@ is handled. The following nonterminal exists to enter the AP to the meaning list #ifdef IF_MODULE action_pattern *ap = RP[1]; if (PL::Actions::Patterns::makes_callings(ap)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PastActionCalled), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PastActionCalled), "a description of an action cannot both refer to past " "history and also use '(called ...)'", "because that would require Inform in general to remember " @@ -343,7 +343,7 @@ limit that we were unable to construct a test case for it. spec->down->down->next = NULL; /* truncate to just one */ Node::set_text(spec, Node::get_text(current_sentence)); Problems::quote_source(1, current_sentence); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); Problems::issue_problem_segment( "In %1, the phrase being constructed is just too " "long and complicated, and will need to be simplified. (This " diff --git a/inform7/core-module/Chapter 10/Constants and Descriptions.w b/inform7/core-module/Chapter 10/Constants and Descriptions.w index 488aaaa4e..68fe5ff19 100644 --- a/inform7/core-module/Chapter 10/Constants and Descriptions.w +++ b/inform7/core-module/Chapter 10/Constants and Descriptions.w @@ -521,7 +521,7 @@ except that the noun is optional. The only difference is right at the bottom. if (Node::is(p, CONSTANT_NT)) { if (PM_SpecificCalling_issued_at != current_sentence) { PM_SpecificCalling_issued_at = current_sentence; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_SpecificCalling), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_SpecificCalling), "a 'called' name can only be given to something " "which is described vaguely", "and can't be given to a definite object or value. " @@ -565,7 +565,7 @@ context of a proper noun, as in "some tea", because it may be confusion of PM_DefiniteCommonNoun_issued_at = current_sentence; Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_DefiniteCommonNoun)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_DefiniteCommonNoun)); Problems::issue_problem_segment( "In %1, I'm not able to understand what specific thing is meant " "by the phrase '%2'. You use the definite article 'the', which " diff --git a/inform7/core-module/Chapter 10/Parse Literals.w b/inform7/core-module/Chapter 10/Parse Literals.w index 81da9a533..e8a61a9f9 100644 --- a/inform7/core-module/Chapter 10/Parse Literals.w +++ b/inform7/core-module/Chapter 10/Parse Literals.w @@ -164,7 +164,7 @@ Still: e_notation_problem_issued = TRUE; Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_WantonEngineering)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_WantonEngineering)); Problems::issue_problem_segment( "In %1, you write '%2', which looks to me like the engineering " "notation for a real number - I'm guessing that the 'e' means " diff --git a/inform7/core-module/Chapter 10/Type Expressions and Values.w b/inform7/core-module/Chapter 10/Type Expressions and Values.w index bd4f26f0c..c0a617c5f 100644 --- a/inform7/core-module/Chapter 10/Type Expressions and Values.w +++ b/inform7/core-module/Chapter 10/Type Expressions and Values.w @@ -116,7 +116,7 @@ higher up in Inform. Ultimately, the text must match in each case. @ = Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TypeCantVary)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TypeCantVary)); Problems::issue_problem_segment( "In %1, '%2' is not a kind of value which a variable can safely have, " "as it cannot ever vary."); @@ -126,7 +126,7 @@ higher up in Inform. Ultimately, the text must match in each case. @ = Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TypeUnmaintainable)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TypeUnmaintainable)); Problems::issue_problem_segment( "In %1, '%2' is not a kind of value which a variable can safely have, " "as it cannot be guaranteed that the contents will always meet " @@ -465,7 +465,7 @@ Again, this is part of a condition, and can't evaluate. spec->down = RP[1]; if ((LocalVariables::are_we_using_table_lookup() == FALSE) && (problem_count == 0)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NoRowSelected), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NoRowSelected), "no row seems to have been chosen at this point", "so it doesn't make sense to talk about the entries " "within it. (By 'at this point', I mean the point " diff --git a/inform7/core-module/Chapter 10/Verbal and Relative Clauses.w b/inform7/core-module/Chapter 10/Verbal and Relative Clauses.w index 4d044720f..d7acdfeb7 100644 --- a/inform7/core-module/Chapter 10/Verbal and Relative Clauses.w +++ b/inform7/core-module/Chapter 10/Verbal and Relative Clauses.w @@ -340,13 +340,13 @@ has the standard form, but we check it anyway. subject_noun_phrase = A; verb_phrase = B; - if (verb_phrase->down == NULL) Problems::Issue::s_subtree_error(Task::syntax_tree(), "VP childless"); + if (verb_phrase->down == NULL) StandardProblems::s_subtree_error(Task::syntax_tree(), "VP childless"); if (Node::get_type(verb_phrase) != UNKNOWN_NT) - Problems::Issue::s_subtree_error(Task::syntax_tree(), "VP not a VP"); + StandardProblems::s_subtree_error(Task::syntax_tree(), "VP not a VP"); vu = Node::get_vu(verb_phrase); - if (vu == NULL) Problems::Issue::s_subtree_error(Task::syntax_tree(), "verb null"); + if (vu == NULL) StandardProblems::s_subtree_error(Task::syntax_tree(), "verb null"); verb_phrase_negated = (VerbUsages::is_used_negatively(vu))?TRUE:FALSE; prep = Node::get_prep(verb_phrase); @@ -389,7 +389,7 @@ using a tense other than the present, and all is well. @ = if (PM_DescLocalPast_location != current_sentence) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_DescLocalPast), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DescLocalPast), "conditions written in the past tense cannot refer to " "temporary values", "because they have no past. For instance, the name given in a " @@ -423,7 +423,7 @@ pattern) plus "in the Home" (a description). void ExParser::Subtrees::throw_past_problem(int desc) { if (PM_PastSubordinate_issued_at != current_sentence) { PM_PastSubordinate_issued_at = current_sentence; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PastSubordinate), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PastSubordinate), "subordinate clauses have to be in the present tense", "so 'the Black Door was open' is fine, but not 'something which " "was open'. Only the main verb can be in the past tense."); diff --git a/inform7/core-module/Chapter 11/Sentence Conversions.w b/inform7/core-module/Chapter 11/Sentence Conversions.w index db635e1ed..d23b0aafd 100644 --- a/inform7/core-module/Chapter 11/Sentence Conversions.w +++ b/inform7/core-module/Chapter 11/Sentence Conversions.w @@ -55,7 +55,7 @@ pcalc_prop *Calculus::Propositions::FromSentences::S_subtree(int SV_not_SN, word } @ = - if (A) Problems::Issue::s_subtree_error_set_position(Task::syntax_tree(), A); + if (A) StandardProblems::s_subtree_error_set_position(Task::syntax_tree(), A); if (conv_log_depth == 0) LOGIF(PREDICATE_CALCULUS, "-----------\n"); conv_log_depth++; LOGIF(PREDICATE_CALCULUS, "[%d] Starting fs on: <%W>\n", conv_log_depth, W); @@ -97,14 +97,14 @@ it can be applied. @ = subject_phrase_subtree = A; - if (subject_phrase_subtree == NULL) Problems::Issue::s_subtree_error(Task::syntax_tree(), "SP subtree null"); + if (subject_phrase_subtree == NULL) StandardProblems::s_subtree_error(Task::syntax_tree(), "SP subtree null"); parse_node *verb_phrase_subtree = B; - if (verb_phrase_subtree == NULL) Problems::Issue::s_subtree_error(Task::syntax_tree(), "VP subtree null"); - if (verb_phrase_subtree->down == NULL) Problems::Issue::s_subtree_error(Task::syntax_tree(), "VP subtree broken"); + if (verb_phrase_subtree == NULL) StandardProblems::s_subtree_error(Task::syntax_tree(), "VP subtree null"); + if (verb_phrase_subtree->down == NULL) StandardProblems::s_subtree_error(Task::syntax_tree(), "VP subtree broken"); object_phrase_subtree = verb_phrase_subtree->down; verb_usage *vu = Node::get_vu(verb_phrase_subtree); - if (vu == NULL) Problems::Issue::s_subtree_error(Task::syntax_tree(), "verb null"); + if (vu == NULL) StandardProblems::s_subtree_error(Task::syntax_tree(), "verb null"); if ((SV_not_SN == FALSE) && (VerbUsages::get_tense_used(vu) != IS_TENSE)) @; diff --git a/inform7/core-module/Chapter 11/Tree Conversions.w b/inform7/core-module/Chapter 11/Tree Conversions.w index 5febcb238..652a7aed8 100644 --- a/inform7/core-module/Chapter 11/Tree Conversions.w +++ b/inform7/core-module/Chapter 11/Tree Conversions.w @@ -167,7 +167,7 @@ parse the text to find what which property is referred to. Problems::quote_wording(2, Node::get_text(p)); Problems::quote_property(3, prn); Problems::quote_wording(4, VW); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_WithEitherOrValue)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_WithEitherOrValue)); Problems::issue_problem_segment( "The sentence '%1' seems to be trying to create something which " "has '%2', where the %3 property is being set equal to %4. But " @@ -187,7 +187,7 @@ parse the text to find what which property is referred to. Problems::quote_wording(2, Node::get_text(p)); Problems::quote_property(3, prn); Problems::quote_kind(4, Properties::Valued::kind(prn)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_WithValuelessValue)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_WithValuelessValue)); Problems::issue_problem_segment( "The sentence '%1' seems to be trying to create something which " "has '%2', where the %3 property is being set in some way. But " @@ -213,7 +213,7 @@ that the rest is property name; and otherwise @ = wording W = Articles::remove_the(Node::get_text(p)); if (Wordings::empty(W)) { - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(BelievedImpossible), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(BelievedImpossible), "this looked to me as if it might be trying to create something " "which has certain properties", "and that made no sense on investigation. This sometimes happens " @@ -230,7 +230,7 @@ that the rest is property name; and otherwise @ = LOG("Failed property list: pname = <%W>; pval = <%W>\n", PW, VW); - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_BadPropertyList), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_BadPropertyList), "this looked to me as if it might be trying to create something " "which has certain properties", "and that made no sense on investigation. This sometimes happens " diff --git a/inform7/core-module/Chapter 11/Type Check Propositions.w b/inform7/core-module/Chapter 11/Type Check Propositions.w index cad7b4325..70f99fccf 100644 --- a/inform7/core-module/Chapter 11/Type Check Propositions.w +++ b/inform7/core-module/Chapter 11/Type Check Propositions.w @@ -190,7 +190,7 @@ but it's a very subtle one, and we want to use it only when everything else LOG("Rejecting as unarticled\n"); if (tck->issue_error == FALSE) return NEVER_MATCH; Problems::quote_source(1, current_sentence); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BareKindVariable)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BareKindVariable)); Problems::issue_problem_segment( "The sentence %1 seems to use a kind variable by its letter " "alone in the context of a noun, which Inform doesn't allow. " @@ -232,7 +232,7 @@ problem message has already been issued, but just in case not... if (tck->issue_error == FALSE) return NEVER_MATCH; Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(spec)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); Problems::issue_problem_segment( "The sentence %1 seems to contain a value '%2' which I can't make " "any sense of."); @@ -316,7 +316,7 @@ would work instead. If it would, we make the change within the proposition. if (tck->log_to_I6_text) LOG("Term $0 is $u not an object\n", &(pl->terms[0]), actually_find); Problems::quote_kind(4, actually_find); - Problems::Issue::tcp_problem(_p_(PM_EverywhereMisapplied), tck, + StandardProblems::tcp_problem(_p_(PM_EverywhereMisapplied), tck, "that seems to say that a value - specifically, %4 - is everywhere. " "To Inform, everywhere means 'in every room', and only objects " "can be everywhere - in fact not even all of those, as it's a " @@ -331,7 +331,7 @@ would work instead. If it would, we make the change within the proposition. if (tck->log_to_I6_text) LOG("Term $0 is $u not an object\n", &(pl->terms[0]), actually_find); Problems::quote_kind(4, actually_find); - Problems::Issue::tcp_problem(_p_(PM_NowhereMisapplied), tck, + StandardProblems::tcp_problem(_p_(PM_NowhereMisapplied), tck, "that seems to say that a value - specifically, %4 - is nowhere. " "To Inform, nowhere means 'in no room', and only things can be " "nowhere. (For instance, 'Godot is nowhere.' is allowed - it means " @@ -348,7 +348,7 @@ apply |HERE| incorrectly, but just in case: if (tck->log_to_I6_text) LOG("Term $0 is $u not an object\n", &(pl->terms[0]), actually_find); Problems::quote_kind(4, actually_find); - Problems::Issue::tcp_problem(_p_(BelievedImpossible), tck, + StandardProblems::tcp_problem(_p_(BelievedImpossible), tck, "that seems to say that a value - specifically, %4 - is here. " "To Inform, here means 'in the room we're talking about', so only " "objects can be 'here'."); @@ -447,7 +447,7 @@ int Calculus::Propositions::Checker::type_check_unary_predicate(pcalc_prop *pl, LOG("Adjective '%W' undefined on $u\n", W, K); Problems::quote_wording(4, W); Problems::quote_kind(5, K); - Problems::Issue::tcp_problem(_p_(PM_AdjectiveMisapplied), tck, + StandardProblems::tcp_problem(_p_(PM_AdjectiveMisapplied), tck, "that seems to involve applying the adjective '%4' to %5 - and I " "have no definition of it which would apply in that situation. " "(Try looking it up in the Lexicon part of the Phrasebook index " @@ -501,7 +501,7 @@ int Calculus::Propositions::Checker::type_check_binary_predicate(pcalc_prop *pl, LOG("($u, $u) failed in $2\n", kinds_of_terms[0], kinds_of_terms[1], bp); Problems::quote_kind(4, kinds_of_terms[0]); Problems::quote_kind(5, kinds_of_terms[1]); - Problems::Issue::tcp_problem(_p_(PM_ComparisonFailed), tck, + StandardProblems::tcp_problem(_p_(PM_ComparisonFailed), tck, "that would mean comparing two kinds of value which cannot mix - " "%4 and %5 - so this must be incorrect."); } @@ -534,7 +534,7 @@ produce a |kinds_required| which is |NULL|. @ = if (Kinds::get_construct(kinds_of_terms[0]) != CON_relation) { Problems::quote_kind(4, kinds_of_terms[0]); - Problems::Issue::tcp_problem(_p_(PM_BadUniversal1), tck, + StandardProblems::tcp_problem(_p_(PM_BadUniversal1), tck, "that asks whether something relates something, and in Inform 'to relate' " "means that a particular relation applies between two things. Here, though, " "we have %4 rather than the name of a relation."); @@ -542,7 +542,7 @@ produce a |kinds_required| which is |NULL|. } if (Kinds::get_construct(kinds_of_terms[1]) != CON_combination) { Problems::quote_kind(4, kinds_of_terms[1]); - Problems::Issue::tcp_problem(_p_(BelievedImpossible), tck, + StandardProblems::tcp_problem(_p_(BelievedImpossible), tck, "that asks whether something relates something, and in Inform 'to relate' " "means that a particular relation applies between two things. Here, though, " "we have %4 rather than the combination of the two things."); @@ -582,7 +582,7 @@ void Calculus::Propositions::Checker::issue_bp_typecheck_error(binary_predicate Problems::quote_kind(4, t0); Problems::quote_kind(5, t1); Problems::quote_relation(6, bp); - Problems::Issue::tcp_problem(_p_(PM_TypeCheckBP2), tck, + StandardProblems::tcp_problem(_p_(PM_TypeCheckBP2), tck, "that would mean applying %6 to kinds of value which do not " "fit - %4 and %5 - so this must be incorrect."); } @@ -596,10 +596,10 @@ void Calculus::Propositions::Checker::issue_kind_typecheck_error(kind *actually_ Problems::quote_kind(5, need_to_find); if (bp) { Problems::quote_relation(6, bp); - Problems::Issue::tcp_problem(_p_(PM_TypeCheckBP2a), tck, + StandardProblems::tcp_problem(_p_(PM_TypeCheckBP2a), tck, "that doesn't work because you use %6 with %4 instead of %5."); } else { - Problems::Issue::tcp_problem(_p_(PM_TypeCheckKind), tck, + StandardProblems::tcp_problem(_p_(PM_TypeCheckKind), tck, "%4 cannot be %5, so this must be incorrect."); } } diff --git a/inform7/core-module/Chapter 12/Assert Propositions.w b/inform7/core-module/Chapter 12/Assert Propositions.w index 5adc1305c..a0669c449 100644 --- a/inform7/core-module/Chapter 12/Assert Propositions.w +++ b/inform7/core-module/Chapter 12/Assert Propositions.w @@ -223,7 +223,7 @@ me about twenty sentences to get there ("The car is a vehicle in most rooms which are dark" will do it). @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantAssertQuantifier), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantAssertQuantifier), "the relationship you describe is not exact enough", "so that I cannot be sure of the initial situation. A specific " "relationship would be something like 'the box is a container in " @@ -351,7 +351,7 @@ through here, but it isn't exactly an everyday sentence. @ = if (now_negated) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantAssertNonKind), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantAssertNonKind), "that seems to say what kind something doesn't have", "which is too vague. You must say what kind it does have."); return; @@ -374,7 +374,7 @@ we're dealing with a backdrop. So we play dumb. @ = if (now_negated) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantAssertNegatedEverywhere), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantAssertNegatedEverywhere), "that seems to say that something isn't everywhere", "which is too vague. You must say where it is."); return; @@ -391,13 +391,13 @@ we're dealing with a backdrop. So we play dumb. inference_subject *subj = Calculus::Propositions::Assert::subject_of_term(pl->terms[0]); instance *ox = InferenceSubjects::as_object_instance(subj); if (now_negated) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), "that seems to say that something isn't nowhere", "which is too vague. You must say where it is."); return; } if (ox == NULL) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), "that seems to say that something generic is 'nowhere'", "which suggests it could some day have a physical location."); return; @@ -415,13 +415,13 @@ problem aside for now. inference_subject *subj = Calculus::Propositions::Assert::subject_of_term(pl->terms[0]); instance *ox = InferenceSubjects::as_object_instance(subj); if (now_negated) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), "that seems to say that something isn't here", "which is too vague. You must say where it is."); return; } if (ox == NULL) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NonInstanceHere), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NonInstanceHere), "that seems to say that something generic is 'here'", "which would give it a physical location. (It would be like saying " "'A number is here' - well, numbers are everywhere and nowhere.)"); @@ -468,7 +468,7 @@ success flag. wording W = Adjectives::get_text(aph, FALSE); Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_CantAssertAdjective)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_CantAssertAdjective)); if (parity == FALSE) Problems::issue_problem_segment( "In the sentence %1, you ask me to arrange for something not to be " "'%2' at the start of play. This is only possible when an adjective " @@ -509,7 +509,7 @@ these kind atoms. @ = if (now_negated) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantAssertNegatedRelations), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantAssertNegatedRelations), "that seems to make a negative statement about a relationship", "which is too vague. You must make positive assertions."); return; @@ -544,14 +544,14 @@ these kind atoms. if ((Rvalues::is_nothing_object_constant(spec0)) || (Rvalues::is_nothing_object_constant(spec1))) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RelationFailedOnNothing), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RelationFailedOnNothing), "that is an assertion which involves 'nothing'", "which looks as if it might be trying to give me negative rather " "than positive information. There's no need to tell me something " "like 'Nothing is in the box.': just don't put anything in the box, " "and then nothing will be in it."); else - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), "that is an assertion I can't puzzle out", "which seems to involve placing two things in some sort of " "relationship, but if so then I can't make it work. Perhaps the " @@ -573,7 +573,7 @@ simpler and clearer. if (the_fn == NULL) { the_fn = pt1.function; side = 0; } if (the_fn) { if ((pl->terms[side].function) || (the_fn->fn_of.function)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), "that is too complicated an assertion", "and cannot be declared as part of the initial situation. (It " "does make sense, and could be tested with 'if' - it's just " diff --git a/inform7/core-module/Chapter 12/Compile Atoms.w b/inform7/core-module/Chapter 12/Compile Atoms.w index bc938d71c..1267b8b16 100644 --- a/inform7/core-module/Chapter 12/Compile Atoms.w +++ b/inform7/core-module/Chapter 12/Compile Atoms.w @@ -81,11 +81,11 @@ void Calculus::Atoms::Compile::compile(value_holster *VH, int task, pcalc_prop * @ = LOG("Failed on task: $o\n", pl); if (task == TEST_ATOM_TASK) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), "this is not a condition I am able to test", "or at any rate not during play."); else - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantForceRelation), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantForceRelation), "this is not something I can make true with 'now'", "because it is too vague about the underlying cause which would " "need to be arranged."); @@ -97,7 +97,7 @@ void Calculus::Atoms::Compile::compile(value_holster *VH, int task, pcalc_prop * (Frames::used_for_past_tense()) && (suppress_C14ActionVarsPastTense == FALSE)) { if (problem_count == 0) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ActionVarsPastTense), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ActionVarsPastTense), "it is misleading to talk about the noun, the second noun " "or the person asked to do something in past tenses", "because in the past, those were different things and " @@ -196,7 +196,7 @@ the I6 |ofclass| operator. if ((Kinds::get_construct(pl->assert_kind) == CON_list_of) && (problem_count == 0)) { Problems::quote_source(1, current_sentence); Problems::quote_kind(2, pl->assert_kind); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_CantCheckListContents)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_CantCheckListContents)); Problems::issue_problem_segment( "In %1, you use a list which might or might not match a " "definition requiring %2. But there's no efficient way to " @@ -212,7 +212,7 @@ the I6 |ofclass| operator. case NOW_ATOM_TRUE_TASK: case NOW_ATOM_FALSE_TASK: if (suppress_C14CantChangeKind == FALSE) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantChangeKind), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantChangeKind), "the kind of something is fixed", "and cannot be changed during play with a 'now'."); asch.schema = NULL; @@ -233,7 +233,7 @@ to all backdrops which are currently everywhere. Calculus::Schemas::modify(sch, "MoveObject(*1, FoundEverywhere); MoveFloatingObjects();"); return asch; case NOW_ATOM_FALSE_TASK: - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantChangeEverywhere), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantChangeEverywhere), "not being 'everywhere' is not something which can be changed " "during play using 'now'", "because it's not exact enough about what needs to be done."); @@ -265,7 +265,7 @@ propositions to be compiled, so this code is never used.) return asch; case NOW_ATOM_TRUE_TASK: case NOW_ATOM_FALSE_TASK: - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), "being 'here' is not something which can be changed during play", "so it cannot be brought about or cancelled out with 'now'."); asch.schema = NULL; return asch; diff --git a/inform7/core-module/Chapter 12/Compile Deferred Propositions.w b/inform7/core-module/Chapter 12/Compile Deferred Propositions.w index ccb69039b..719c62824 100644 --- a/inform7/core-module/Chapter 12/Compile Deferred Propositions.w +++ b/inform7/core-module/Chapter 12/Compile Deferred Propositions.w @@ -146,7 +146,7 @@ wrong in the calling routine, where they are needed. @ = if ((LocalVariables::are_we_using_table_lookup()) && (!ct_locals_problem_thrown)) { ct_locals_problem_thrown = TRUE; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantLookUpTableInDeferred), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantLookUpTableInDeferred), "I am not able to look up table entries in this complicated " "condition", "which seems to involve making a potentially large number " @@ -162,7 +162,7 @@ possible.) @ = if (negated_quantifier_found) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), "this involves a very complicated negative thought", "which I'm not able to untangle. Perhaps you could rephrase " "this more simply, or split it into more than one sentence?"); diff --git a/inform7/core-module/Chapter 12/Deciding to Defer.w b/inform7/core-module/Chapter 12/Deciding to Defer.w index acd807999..21f46b517 100644 --- a/inform7/core-module/Chapter 12/Deciding to Defer.w +++ b/inform7/core-module/Chapter 12/Deciding to Defer.w @@ -89,7 +89,7 @@ that the resulting routine will be called |Prop_n|. inter_name *Calculus::Deferrals::compile_deferred_description_test(parse_node *spec) { pcalc_prop *prop = Specifications::to_proposition(spec); if (Calculus::Propositions::contains_callings(prop)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantCallDeferredDescs), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantCallDeferredDescs), "'called' can't be used when testing a description", "since it would make a name for something which existed only " "so temporarily that it couldn't be used anywhere else."); @@ -476,7 +476,7 @@ does not have run-time object or value creation. switch(pl->element) { case QUANTIFIER_ATOM: if (Calculus::Atoms::is_existence_quantifier(pl)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantForceExistence), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantForceExistence), "this is not explicit enough", "and should set out definite relationships between specific " "things, like 'now the cat is in the bag', not something " @@ -485,7 +485,7 @@ does not have run-time object or value creation. return; } if (Calculus::Atoms::is_now_assertable_quantifier(pl) == FALSE) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantForceGeneralised), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantForceGeneralised), "this can't be made true with 'now'", "because it is too vague about what it applies to. It's fine " "to say 'now all the doors are open' or 'now none of the doors " @@ -497,7 +497,7 @@ does not have run-time object or value creation. quantifier_count++; break; case CALLED_ATOM: - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantForceCalling), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantForceCalling), "a 'now' is not allowed to call names", "and it wouldn't really make sense to do so anyway. 'if " "a person (called the victim) is in the Trap Room' makes " @@ -544,7 +544,7 @@ void Calculus::Deferrals::compile_multiple_use_proposition(value_holster *VH, else if ((q) && (q != for_all_quantifier)) { Problems::quote_source(1, current_sentence); Problems::quote_spec(2, spec); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); Problems::issue_problem_segment( "In %1 you wrote the description '%2' in the context of a value, " "but descriptions used that way are not allowed to talk about " @@ -566,7 +566,7 @@ void Calculus::Deferrals::compile_multiple_use_proposition(value_holster *VH, LOG("Offending proposition: $D\n", prop); Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(example)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_LocalInDescription)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_LocalInDescription)); Problems::issue_problem_segment( "You wrote %1, but descriptions used as values are not allowed to " "contain references to temporary values (defined by 'let', or by loops, " @@ -721,7 +721,7 @@ void Calculus::Deferrals::emit_random_of_S(parse_node *spec) { } @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RandomImpossible), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RandomImpossible), "this asks to find a random choice from a range which is too " "large or impractical", "so can't be done. For instance, 'a random person' is fine - " @@ -960,13 +960,13 @@ void Calculus::Deferrals::emit_repeat_through_domain_S(parse_node *spec, } @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CalledInRepeat), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CalledInRepeat), "this tries to use '(called ...)' to give names to values " "arising in the course of working out what to repeat through", "but this is not allowed. (Sorry: it's too hard to get right.)"); @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadRepeatDomain), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadRepeatDomain), "this describes a collection of values which can't be repeated through", "because the possible range is too large (or has no sensible ordering). " "For instance, you can 'repeat with D running through doors' because " @@ -1228,7 +1228,7 @@ void Calculus::Deferrals::prop_verify_descriptive(pcalc_prop *prop, char *billin Problems::quote_source(1, current_sentence); Problems::quote_text(2, billing); Problems::quote_wording(3, EW); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); Problems::issue_problem_segment( "In %1, you are asking for %2, but this should range over a " "simpler description than '%3', please - it should not include any " @@ -1243,7 +1243,7 @@ void Calculus::Deferrals::prop_verify_descriptive(pcalc_prop *prop, char *billin Problems::quote_source(1, current_sentence); Problems::quote_text(2, billing); Problems::quote_wording(3, EW); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); Problems::issue_problem_segment( "In %1, you are asking for %2, but '%3' looks as if it ranges " "over only a single specific object, not a whole collection of " diff --git a/inform7/core-module/Chapter 12/Quasinumeric Relations.w b/inform7/core-module/Chapter 12/Quasinumeric Relations.w index 6f808b9b4..b04e6ae91 100644 --- a/inform7/core-module/Chapter 12/Quasinumeric Relations.w +++ b/inform7/core-module/Chapter 12/Quasinumeric Relations.w @@ -77,7 +77,7 @@ int Calculus::QuasinumericRelations::REL_typecheck(binary_predicate *bp, LOG("Unable to apply inequality of $u and $u\n", kinds_of_terms[0], kinds_of_terms[1]); Problems::quote_kind(4, kinds_of_terms[0]); Problems::quote_kind(5, kinds_of_terms[1]); - Problems::Issue::tcp_problem(_p_(PM_InequalityFailed), tck, + StandardProblems::tcp_problem(_p_(PM_InequalityFailed), tck, "that would mean comparing two kinds of value which cannot mix - " "%4 and %5 - so this must be incorrect."); return NEVER_MATCH; diff --git a/inform7/core-module/Chapter 12/The Equality Relation.w b/inform7/core-module/Chapter 12/The Equality Relation.w index 16a4f1634..b7e781913 100644 --- a/inform7/core-module/Chapter 12/The Equality Relation.w +++ b/inform7/core-module/Chapter 12/The Equality Relation.w @@ -56,7 +56,7 @@ int Calculus::Equality::REL_typecheck(binary_predicate *bp, if ((K_understanding) && (Kinds::Compare::eq(kinds_of_terms[0], K_understanding)) && (Kinds::Compare::eq(kinds_of_terms[1], K_text))) { LOGIF(MATCHING, "No!\n"); - Problems::Issue::tcp_problem(_p_(PM_TextIsNotTopic), tck, + StandardProblems::tcp_problem(_p_(PM_TextIsNotTopic), tck, "though they look the same, because both are written in double " "quotes, text values can't in fact be used as topics, so it's " "impossible to store this piece of text in that location."); @@ -92,7 +92,7 @@ for a fairly common mistake: if (tck->log_to_I6_text) LOG("Comparison of object with $u value\n", kinds_of_terms[1]); Problems::quote_kind(4, kinds_of_terms[1]); - Problems::Issue::tcp_problem(_p_(PM_NonPropertyCompared), tck, + StandardProblems::tcp_problem(_p_(PM_NonPropertyCompared), tck, "taken literally that says that an object is the same as a " "value. Maybe you intended to say that the object " "has a property - but right now %4 is not yet a property; if you " @@ -144,7 +144,7 @@ int Calculus::Equality::REL_assert(binary_predicate *bp, if ((NonlocalVariables::is_constant(q)) && (prevailing_mood == CERTAIN_CE)) allowed = TRUE; if (allowed == FALSE) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantQualifyVariableValues), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantQualifyVariableValues), "a variable can only be given its value straightforwardly or " "qualified by 'usually'", "not with 'always', 'seldom' or 'never'."); @@ -206,7 +206,7 @@ int Calculus::Equality::REL_compile(int task, binary_predicate *bp, annotated_i6 Kinds::RunTime::interpret_test_equality(st[0], st[1])); else if (problem_count == 0) { LOG("$0 and $0; $u and $u\n", &(asch->pt0), &(asch->pt1), st[0], st[1]); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantCompareValues), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantCompareValues), "that would involve comparing things which don't mean " "anything to me", "so I'm lost."); @@ -265,7 +265,7 @@ lantern is bright". @ = switch (task) { case TEST_ATOM_TASK: - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ResponseComparisonUnsafe), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ResponseComparisonUnsafe), "for complicated internal reasons this comparison isn't safe to perform", "and might give you a falsely negative result. To avoid what might " "be misleading, you aren't allowed to compare a response to text."); @@ -302,7 +302,7 @@ lantern is bright". Problems::quote_source(1, current_sentence); Problems::quote_kind(2, st[1]); Problems::quote_kind(3, st[0]); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); Problems::issue_problem_segment( "In the line %1, you seem to be asking me to put %2 into %3, " "which can't safely be done."); @@ -318,12 +318,12 @@ one that's more helpfully specific and return |TRUE|. @ = if (Rvalues::to_instance(asch->pt0.constant)) { if (Kinds::Compare::le(Specifications::to_kind(asch->pt0.constant), K_object)) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantEquateValues), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantEquateValues), "equality is not something I can change", "so either those are already the same or are different, and I " "can't alter matters."); else - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantChangeNamedConstant), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantChangeNamedConstant), "I can't change that", "because it is a name for a constant value. Some named values, " "like 'the score', can be changed, because they were defined " diff --git a/inform7/core-module/Chapter 13/Compile Arithmetic.w b/inform7/core-module/Chapter 13/Compile Arithmetic.w index b008af124..3e31ba79b 100644 --- a/inform7/core-module/Chapter 13/Compile Arithmetic.w +++ b/inform7/core-module/Chapter 13/Compile Arithmetic.w @@ -38,7 +38,7 @@ void Kinds::Compile::perform_arithmetic_emit(int op, equation *eqn, case UNARY_MINUS_OPERATION: @; break; case IMPLICIT_APPLICATION_OPERATION: @; break; default: - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), "this doesn't seem to be an arithmetic operation", "suggesting a problem with some inline definition."); break; diff --git a/inform7/core-module/Chapter 13/Knowledge about Kinds.w b/inform7/core-module/Chapter 13/Knowledge about Kinds.w index 40da1e55d..f13275202 100644 --- a/inform7/core-module/Chapter 13/Knowledge about Kinds.w +++ b/inform7/core-module/Chapter 13/Knowledge about Kinds.w @@ -166,17 +166,17 @@ void Kinds::Knowledge::include_templates_for_kinds(void) { void Kinds::Knowledge::kinds_problem_handler(int err_no, parse_node *pn, kind *K1, kind *K2) { switch (err_no) { case DimensionRedundant_KINDERROR: - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_DimensionRedundant), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DimensionRedundant), "multiplication rules can only be given once", "and this combination is already established."); break; case DimensionNotBaseKOV_KINDERROR: - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_DimensionNotBaseKOV), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DimensionNotBaseKOV), "multiplication rules can only involve simple kinds of value", "rather than complicated ones such as lists of other values."); break; case NonDimensional_KINDERROR: - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NonDimensional), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NonDimensional), "multiplication rules can only be given between kinds of " "value which are known to be numerical", "and not all of these are. Saying something like 'Pressure is a " @@ -186,7 +186,7 @@ void Kinds::Knowledge::kinds_problem_handler(int err_no, parse_node *pn, kind *K "Inform will realise."); break; case UnitSequenceOverflow_KINDERROR: - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnitSequenceOverflow), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnitSequenceOverflow), "reading that sentence led me into calculating such a complicated " "kind of value that I ran out of memory", "which my programmer really didn't expect to happen. I think you " @@ -195,7 +195,7 @@ void Kinds::Knowledge::kinds_problem_handler(int err_no, parse_node *pn, kind *K "weirdly tricky. Can you simplify?"); break; case DimensionsInconsistent_KINDERROR: - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_DimensionsInconsistent), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DimensionsInconsistent), "this is inconsistent with what is already known about those kinds of value", "all three of which already have well-established relationships - see the " "Kinds index for more."); @@ -205,7 +205,7 @@ void Kinds::Knowledge::kinds_problem_handler(int err_no, parse_node *pn, kind *K Problems::quote_source(2, pn); Problems::quote_kind(3, K1); Problems::quote_kind(4, K2); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_KindUnalterable)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_KindUnalterable)); Problems::issue_problem_segment( "You wrote %1, but that seems to contradict %2, as %3 and %4 " "are incompatible. (If %3 were a kind of %4 or vice versa " @@ -217,7 +217,7 @@ void Kinds::Knowledge::kinds_problem_handler(int err_no, parse_node *pn, kind *K Problems::quote_source(2, pn); Problems::quote_kind(3, K1); Problems::quote_kind(4, K2); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_KindsCircular)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_KindsCircular)); Problems::issue_problem_segment( "You wrote %1, but that seems to contradict %2, as it would " "make a circularity with %3 and %4 each being kinds of the " @@ -225,13 +225,13 @@ void Kinds::Knowledge::kinds_problem_handler(int err_no, parse_node *pn, kind *K Problems::issue_problem_end(); break; case LPCantScaleYet_KINDERROR: - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LPCantScaleYet), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LPCantScaleYet), "this tries to scale up or down a value which so far has no point of " "reference to scale from", "which is impossible."); break; case LPCantScaleTwice_KINDERROR: - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LPCantScaleTwice), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LPCantScaleTwice), "this tries to specify the scaling for a kind of value whose " "scaling is already established", "which is impossible."); diff --git a/inform7/core-module/Chapter 13/Runtime Support for Kinds.w b/inform7/core-module/Chapter 13/Runtime Support for Kinds.w index 88225fa1a..1b5050c80 100644 --- a/inform7/core-module/Chapter 13/Runtime Support for Kinds.w +++ b/inform7/core-module/Chapter 13/Runtime Support for Kinds.w @@ -157,14 +157,14 @@ int Kinds::RunTime::compile_default_value_vh(value_holster *VH, kind *K, Problems::quote_wording_as_source(1, W); Problems::quote_kind(2, K); Problems::quote_text(3, storage_name); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_EmptyKind2)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_EmptyKind2)); Problems::issue_problem_segment( "I am unable to put any value into the %3 %1, which needs to be %2, " "because the world does not contain %2."); Problems::issue_problem_end(); } else { Problems::quote_kind(2, K); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_EmptyKind)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_EmptyKind)); Problems::issue_problem_segment( "I am unable to find %2 to use here, because the world does not " "contain %2."); @@ -176,7 +176,7 @@ int Kinds::RunTime::compile_default_value_vh(value_holster *VH, kind *K, if (Wordings::nonempty(W)) { Problems::quote_wording_as_source(1, W); Problems::quote_kind(2, K); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); Problems::issue_problem_segment( "I am unable to create %1 with the kind of value '%2', " "because this is a kind of value which is not allowed as " @@ -187,7 +187,7 @@ int Kinds::RunTime::compile_default_value_vh(value_holster *VH, kind *K, Problems::issue_problem_end(); } else { Problems::quote_kind(1, K); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); Problems::issue_problem_segment( "I am unable to create a value of the kind '%1' " "because this is a kind of value which is not allowed as " @@ -201,7 +201,7 @@ int Kinds::RunTime::compile_default_value_vh(value_holster *VH, kind *K, @<"Value" is too vague to be the kind of a variable@> = Problems::quote_wording_as_source(1, W); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); Problems::issue_problem_segment( "I am unable to start %1 off with any value, because the " "instructions do not tell me what kind of value it should be " @@ -728,7 +728,7 @@ void Kinds::RunTime::compile_structures(void) { } else { Problems::quote_source(1, current_sentence); Problems::quote_kind(2, K); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); Problems::issue_problem_segment( "While working on '%1', I needed to be able to make a default value " "for the kind '%2', but there's no obvious way to make one."); @@ -1818,7 +1818,7 @@ void Kinds::RunTime::notify_of_use(kind *K) { if (Kinds::RunTime::target_VM_supports(K) == FALSE) { if (VM_non_support_problem_issued == FALSE) { VM_non_support_problem_issued = TRUE; - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_KindRequiresGlulx)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_KindRequiresGlulx)); Problems::quote_source(1, current_sentence); Problems::quote_kind(2, K); Problems::issue_problem_segment( diff --git a/inform7/core-module/Chapter 14/Dash.w b/inform7/core-module/Chapter 14/Dash.w index a143ae1a1..bbe48f1e8 100644 --- a/inform7/core-module/Chapter 14/Dash.w +++ b/inform7/core-module/Chapter 14/Dash.w @@ -269,9 +269,9 @@ then it will be the "random ..." phrase which is backtraced, and not the if (problem_count > backtraced_problem_count) { if ((p) && (p->down) && (Node::get_type(p) == INVOCATION_LIST_NT)) { - it_is_not_worth_adding = TRUE; + Strings::TextSubstitutions::it_is_not_worth_adding(); @; - it_is_not_worth_adding = FALSE; + Strings::TextSubstitutions::it_is_worth_adding(); backtraced_problem_count = problem_count; } } @@ -293,7 +293,7 @@ from a text substitution.) } int announce = TRUE; - text_stream *latest = Problems::Issue::latest_sigil(); + text_stream *latest = Problems::latest_sigil(); if (Str::eq_wide_string(latest, L"PM_AllInvsFailed")) announce = FALSE; if (announce) @; @@ -615,7 +615,7 @@ extension, which made use of the old undocumented |phrase| token. THIS_IS_AN_ORDINARY_PROBLEM; Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(p->down)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ValueAsStorageItem)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ValueAsStorageItem)); Problems::issue_problem_segment( "You wrote %1, but '%2' is a value, not a place where a value is " "stored. " @@ -631,7 +631,7 @@ extension, which made use of the old undocumented |phrase| token. THIS_IS_AN_ORDINARY_PROBLEM; Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(p->down)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ValueAsTableReference)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ValueAsTableReference)); Problems::issue_problem_segment( "You wrote %1, but '%2' is a value, not a reference to an entry " "in a table."); @@ -647,7 +647,7 @@ extension, which made use of the old undocumented |phrase| token. Problems::quote_text(3, "a kind of value"); else Problems::quote_kind_of(3, p->down); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ExistingVarNotFound)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ExistingVarNotFound)); Problems::issue_problem_segment( "In the sentence %1, I was expecting that '%2' would be the " "name of a temporary value, but it turned out to be %3."); @@ -661,7 +661,7 @@ extension, which made use of the old undocumented |phrase| token. Problems::quote_wording(2, Node::get_text(p->down)); Problems::quote_spec(3, p->down); Problems::quote_spec(4, val); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NotExactValueWanted)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NotExactValueWanted)); Problems::issue_problem_segment( "In the sentence %1, I was expecting that '%2' would be the specific " "value '%4'."); @@ -672,7 +672,7 @@ extension, which made use of the old undocumented |phrase| token. THIS_IS_AN_ORDINARY_PROBLEM; Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(p->down)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(...)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(...)); Problems::issue_problem_segment( "In the sentence %1, I was expecting that '%2' would be a phrase."); Problems::issue_problem_end(); @@ -723,7 +723,7 @@ species; and then to misuse that phrase. else Problems::quote_kind_of(3, p->down); Problems::quote_kind(4, K); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_KindOfVariable)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_KindOfVariable)); Problems::issue_problem_segment( "In the sentence %1, I was expecting that '%2' would be a new " "variable name (to hold %4), but it turned out to be %3."); @@ -956,7 +956,7 @@ no way safely to adjudicate that at run-time. @ = THIS_IS_AN_ORDINARY_PROBLEM; Problems::quote_source(1, current_sentence); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_UnequalValueAmbiguity)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_UnequalValueAmbiguity)); Problems::issue_problem_segment( "The phrase %1 is ambiguous in a way that I can't disentangle. " "It has more than one plausible interpretation, such that it " @@ -1073,7 +1073,7 @@ Room" is a number, because the kind of the property "carrying capacity" is Node::set_kind_resulting(inv, Properties::Valued::kind(prn)); else { THIS_IS_AN_INTERESTING_PROBLEM { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TotalEitherOr), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TotalEitherOr), "this seems to be an attempt to total up an either/or property", "and by definition such a property has nothing to total."); } @@ -1088,7 +1088,7 @@ with it.) LOG_DASH("(4I.a.1) failed as nonproperty"); if (Kinds::get_construct(Node::get_kind_of_value(P)) == CON_table_column) { THIS_IS_AN_INTERESTING_PROBLEM { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TotalTableColumn), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TotalTableColumn), "this seems to be an attempt to total up the column of a table", "whereas it's only legal to use 'total' for properties."); } @@ -1151,7 +1151,7 @@ L and R are more definite. case REMAINDER_OPERATION: Problems::quote_text(6, "dividing"); Problems::quote_text(7, "by"); break; case APPROXIMATION_OPERATION: Problems::quote_text(6, "rounding"); Problems::quote_text(7, "to"); break; } - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadArithmetic)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadArithmetic)); Problems::issue_problem_segment( "You wrote %1, but that seems to involve %6 %4 ('%2') %7 %5 ('%3'), " "which is not good arithmetic."); @@ -1215,7 +1215,7 @@ instance, if |inv| is an invocation of this phrase: if ((Routines::Compile::disallow_let()) && (Phrases::TypeData::is_a_let_assignment(ph))) { THIS_IS_AN_INTERESTING_PROBLEM { Problems::quote_source(1, current_sentence); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_LetCreatedInIf)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_LetCreatedInIf)); Problems::issue_problem_segment( "You wrote %1, but when a temporary value is created " "inside an 'if ..., ...' or an 'otherwise ...', it only " @@ -1299,7 +1299,7 @@ in |ith_token|, an invocation of "the list of K", whereas (5) won't. Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); Problems::quote_kind(3, ikind); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NameOfKindMismatch)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NameOfKindMismatch)); Problems::issue_problem_segment( "You wrote %1, but although '%2' is the name of a kind, " "it isn't the name of a kind of %3, which this phrase needs."); @@ -1312,7 +1312,7 @@ in |ith_token|, an invocation of "the list of K", whereas (5) won't. Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); Problems::quote_kind(3, ikind); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadLocalKOV)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadLocalKOV)); Problems::issue_problem_segment( "You wrote %1, but although '%2' is the name of a kind, " "it isn't a definite kind and is instead a general " @@ -1330,7 +1330,7 @@ in |ith_token|, an invocation of "the list of K", whereas (5) won't. THIS_IS_AN_ORDINARY_PROBLEM { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(ith_token)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NameOfKindIsnt)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NameOfKindIsnt)); Problems::issue_problem_segment( "You wrote %1, but although '%2' does have a meaning, " "it isn't the name of a kind, which this phrase needs."); @@ -1415,7 +1415,7 @@ against a definition like: THIS_IS_A_GROSSER_THAN_GROSS_PROBLEM; Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(p)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); Problems::issue_problem_segment( "In the line %1, you seem to be using '%2' to produce a value, but " "it's not clear what kind of value this will be. It seems to use " @@ -1559,7 +1559,7 @@ this case in the type-checker is never exercised. Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(target)); Problems::quote_wording(3, Node::get_text(new_value)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); /* the parser seems not to allow these */ + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); /* the parser seems not to allow these */ Problems::issue_problem_segment( "You wrote %1, asking to change the object '%2'. This would " "make sense if '%3' were an either/or property like 'open' " @@ -1574,7 +1574,7 @@ this case in the type-checker is never exercised. Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(target)); Problems::quote_property(3, prn); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); Problems::issue_problem_segment( "You wrote %1, but '%2' is not allowed to have the property '%3'."); Problems::issue_problem_end(); @@ -1618,7 +1618,7 @@ literal can mean are too generous.) Problems::quote_kind(3, Specifications::to_kind(target)); Problems::quote_wording(4, Node::get_text(new_value)); Problems::quote_kind(5, Specifications::to_kind(new_value)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ChangeToWrongValue)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ChangeToWrongValue)); Problems::issue_problem_segment( "You wrote %1, but '%2' is supposed to be " "%6 %3, so it cannot be set equal to %4, whose kind is %5."); @@ -1706,7 +1706,7 @@ And here is where we check that "break" is indeed used only in a loop. if (Frames::Blocks::inside_a_loop_body() == FALSE) { THIS_IS_AN_INTERESTING_PROBLEM { Problems::quote_source(1, current_sentence); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_CantUseOutsideLoop)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_CantUseOutsideLoop)); Problems::issue_problem_segment( "%1 makes sense only inside a 'while' or 'repeat' loop."); Problems::issue_problem_end(); @@ -1720,7 +1720,7 @@ And here is where we check that "break" is indeed used only in a loop. THIS_IS_AN_INTERESTING_PROBLEM { Problems::quote_source(1, current_sentence); Problems::quote_wide_text(2, required); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_CantUseOutsideStructure)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_CantUseOutsideStructure)); Problems::issue_problem_segment( "%1 makes sense only inside a '%2' block."); Problems::issue_problem_end(); @@ -1736,7 +1736,7 @@ And here is where we check that "break" is indeed used only in a loop. if ((ph) && (ph->type_data.now_deprecated)) { THIS_IS_AN_INTERESTING_PROBLEM { Problems::quote_source(1, current_sentence); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); /* too moving a target to test */ + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); /* too moving a target to test */ Problems::issue_problem_segment( "'%1' uses a phrase which is now deprecated: you should rephrase " "to avoid the need for it. I'd normally allow this, but you have " @@ -1814,7 +1814,7 @@ and allowed only in phrases using the |table-reference| token. (kind_needed) && (!(Node::is(context, LVALUE_TR_CONTEXT_NT)))) { THIS_IS_A_GROSSER_THAN_GROSS_PROBLEM; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_InexplicitTableEntryAsValue), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_InexplicitTableEntryAsValue), "this form of table entry can only be used in certain special phrases", "because it doesn't explicitly refer to a single value. (You can see " "which phrases in the Phrasebook index: it's allowed wherever a 'table " @@ -1830,14 +1830,14 @@ and allowed only in phrases using the |table-reference| token. kind *K2 = Specifications::to_kind(p->down->next); if (Kinds::unary_construction_material(K1) == NULL) { THIS_IS_A_GROSSER_THAN_GROSS_PROBLEM; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_EntryOfNonList), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_EntryOfNonList), "that doesn't make sense to me as a list entry", "since the entry is taken from something which isn't a list."); return NEVER_MATCH; } if (Kinds::Compare::eq(K2, K_number) == FALSE) { THIS_IS_A_GROSSER_THAN_GROSS_PROBLEM; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NonNumericListEntry), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NonNumericListEntry), "that doesn't make sense to me as a list entry", "because the indication of which entry is not a number. " "For instance, 'entry 3 of L' is allowed, but not 'entry " @@ -1883,7 +1883,7 @@ a property when recovering from other problems. Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(p)); Problems::quote_wording(3, Node::get_text(the_property)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); Problems::issue_problem_segment( "In the sentence %1, it looks as if you intend '%2' to be a property " "of something, but there is no such property as '%3'."); @@ -1894,7 +1894,7 @@ a property when recovering from other problems. THIS_IS_A_GROSSER_THAN_GROSS_PROBLEM; Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(p)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_EitherOrAsValue)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_EitherOrAsValue)); Problems::issue_problem_segment( "In the sentence %1, it looks as if you intend '%2' to be the value " "of a property of something, but that property has no value: it's " @@ -1914,7 +1914,7 @@ a property when recovering from other problems. Problems::quote_wording(3, Node::get_text(the_owner)); else owner_quoted = FALSE; LOG("Owner tree is $T\n", the_owner); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyOfKind2)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyOfKind2)); if (owner_quoted) { if (Wordings::nonempty(Node::get_text(p))) Problems::issue_problem_segment( @@ -1950,7 +1950,7 @@ a property when recovering from other problems. Problems::quote_source(1, current_sentence); Problems::quote_wording(2, prn->name); Problems::quote_subject(3, owning_subject); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_LookedUpForbiddenProperty)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_LookedUpForbiddenProperty)); Problems::issue_problem_segment( "In the sentence %1, you seem to be looking up the '%2' property, " "but '%3' is not allowed to have that property. "); @@ -1970,7 +1970,7 @@ a property when recovering from other problems. if ((Kinds::get_construct(col_kind) != CON_table_column) || (col_contents_kind == NULL)) { THIS_IS_A_GROSSER_THAN_GROSS_PROBLEM; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), "that doesn't make sense to me as a table entry", "since the entry is taken from something which isn't a table."); return NEVER_MATCH; @@ -1980,7 +1980,7 @@ a property when recovering from other problems. Problems::quote_source(1, current_sentence); Problems::quote_kind(2, col_contents_kind); Problems::quote_kind(3, key_kind); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TableCorrFruitless)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TableCorrFruitless)); Problems::issue_problem_segment( "In the sentence %1, you seem to be looking up a corresponding " "entry in a table: but it's fruitless to go looking for %3 " @@ -1994,13 +1994,13 @@ a property when recovering from other problems. THIS_IS_A_GROSS_PROBLEM; if ((Node::get_text(p)) == FALSE) { if (Wordings::mismatched_brackets(Node::get_text(p))) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnpairedBrackets), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnpairedBrackets), "this is a phrase which I don't recognise", "perhaps because it uses brackets '(' and ')' or braces '{' and '}' " "in a way that doesn't make sense to me. Each open '(' or '{' has " "to have a matching ')' or '}'."); } else { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnknownPhrase), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnknownPhrase), "this is a phrase which I don't recognise", "possibly because it is one you meant to define but never got round " "to, or because the wording is wrong (see the Phrasebook section of " @@ -2020,7 +2020,7 @@ up on misuse of structural phrases. continue ==> @ @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_WrongContinue), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_WrongContinue), "this is a phrase which I don't recognise", "and which isn't defined. Perhaps you wanted the phrase which " "would skip to the next repetition of a loop, since that's " @@ -2159,7 +2159,7 @@ of a relation. THIS_IS_AN_ORDINARY_PROBLEM; Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(initial_value)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); Problems::issue_problem_segment( "The phrase %1 tries to use 'let' to give a temporary name to a value, " "but the value ('%2') is one that I can't understand."); @@ -2176,7 +2176,7 @@ relevant code to issue a better problem message if it can. Lists::check_one(Node::get_text(initial_value)); if (pc == problem_count) { Problems::quote_source(1, current_sentence); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_CantLetEmptyList)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_CantLetEmptyList)); Problems::issue_problem_segment( "The phrase %1 tries to use 'let' to give a temporary name to the " "empty list '{ }', but because it's empty, I can't tell what kind of " @@ -2190,7 +2190,7 @@ relevant code to issue a better problem message if it can. @ = THIS_IS_AN_ORDINARY_PROBLEM; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), "this isn't a definite kind", "and is instead a general description which might apply to many " "different kinds, so I can't see how to create this named value. " @@ -2314,7 +2314,7 @@ int Dash::failed(parse_node **list_of_possible_readings, int no_of_possible_read Problems::quote_wording(2, PW); Problems::quote_kind(3, K); Problems::quote_kind(4, W); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadIntermediateKind)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadIntermediateKind)); Problems::issue_problem_segment( "In %1, the phrase '%2' doesn't seem to fit: I was hoping it would " "be %4, but in fact it's %3."); @@ -2331,14 +2331,14 @@ int Dash::failed(parse_node **list_of_possible_readings, int no_of_possible_read END_DASH_MODE; } if (problem_count == 0) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), "the ingredients in this phrase do not fit it", "and I am confused enough by this that I can't give a very helpful " "problem message. Sorry about that."); } @ = - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_AllInvsFailed)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_AllInvsFailed)); Problems::quote_source(1, current_sentence); Problems::issue_problem_segment( "You wrote %1, which I tried to match against several possible phrase " @@ -2354,7 +2354,7 @@ unrecognised. ... ==> @ @ = - Problems::Issue::sentence_in_detail_problem(Task::syntax_tree(), _p_(PM_SayAList), W, + StandardProblems::sentence_in_detail_problem(Task::syntax_tree(), _p_(PM_SayAList), W, "this asked to say 'a list of...'", "which I read as being a general description applying to some " "lists and not others, so it's not something which can be said. " @@ -2362,7 +2362,7 @@ unrecognised. "a definite list of whatever matches the '...' part.)"); @ = - Problems::Issue::sentence_in_detail_problem(Task::syntax_tree(), _p_(BelievedImpossible), W, + StandardProblems::sentence_in_detail_problem(Task::syntax_tree(), _p_(BelievedImpossible), W, "this asked to say something which I do not recognise", "either as a value or as one of the possible text substitutions."); @@ -2469,7 +2469,7 @@ us with the air of having just made a great discovery; well, you can't have Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(p)); Problems::quote_kind(3, kind_expected); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NothingForSomething)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NothingForSomething)); Problems::issue_problem_segment( "You wrote %1, but '%2' is literally no thing, and it consequently does " "not count as %3."); @@ -2533,7 +2533,7 @@ helpful about what exactly is wrong. Dash::clear_validation_case(); (Node::get_text(p)); if (Dash::get_validation_case(&spec, &K, &K2)) { - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_UnknownTryAction1)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_UnknownTryAction1)); Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(p)); Problems::quote_wording(3, Node::get_text(spec)); @@ -2546,7 +2546,7 @@ helpful about what exactly is wrong. "made sense, but it turned out to be %5."); Problems::issue_problem_end(); } else { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnknownTryAction2), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnknownTryAction2), "this is not an action I recognise", "or else is malformed in a way I can't see how to sort out."); } @@ -2570,7 +2570,7 @@ substitution or not. ... ==> @ @ = - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_SayComma)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_SayComma)); Problems::issue_problem_segment( "In the line %1, I was expecting that '%2' would be something to " "'say', but unexpectedly it began with a comma. The usual form is " @@ -2579,7 +2579,7 @@ substitution or not. Problems::issue_problem_end(); @ = - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_SayUnicode)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_SayUnicode)); Problems::issue_problem_segment( "In the line %1, I was expecting that '%2' would be something to " "'say', but it didn't look like any form of 'say' that I know. " @@ -2595,7 +2595,7 @@ substitution or not. Problems::issue_problem_end(); @ = - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_SayElseMisplaced)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_SayElseMisplaced)); Problems::issue_problem_segment( "In the line %1, I was expecting that '%2' would be something to " "'say', but unexpectedly I found an 'otherwise' (or 'else'). That " @@ -2604,7 +2604,7 @@ substitution or not. Problems::issue_problem_end(); @ = - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_SayUnknownCondition)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_SayUnknownCondition)); Problems::issue_problem_segment( "In the line %1, I was expecting that '%2' would be something to " "'say', but it didn't look like any form of 'say' that I know. So " @@ -2627,7 +2627,7 @@ substitution or not. Problems::issue_problem_end(); @ = - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_SayUnknown)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_SayUnknown)); Problems::issue_problem_segment( "In the line %1, I was expecting that '%2' would be something to " "'say', but it didn't look like any form of 'say' that I know. So " @@ -2650,7 +2650,7 @@ the clauses, summing up their status in turn: @d WHENWHILE_CP_BIT 2 @ = - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_CompoundConditionFailed)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_CompoundConditionFailed)); Problems::issue_problem_segment( "In the sentence %1, I was expecting that '%2' would be a condition. " "It didn't make sense as one long phrase, but because it was divided up by " @@ -2702,7 +2702,7 @@ common misunderstanding. ... ==> @ @ = - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NumberOfTurns)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NumberOfTurns)); @; Problems::issue_problem_segment( "%PPerhaps by 'turns' you meant the number of turns of play to date? " @@ -2710,7 +2710,7 @@ common misunderstanding. Problems::issue_problem_end(); @ = - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_OutOfPlay)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_OutOfPlay)); @; Problems::issue_problem_segment( "%PPeople sometimes say that things or people removed from all " @@ -2722,7 +2722,7 @@ common misunderstanding. Problems::issue_problem_end(); @ = - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_OptionlessOption)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_OptionlessOption)); @; Problems::issue_problem_segment( "%PThe names of use options, on the rare occasions when they " @@ -2733,7 +2733,7 @@ common misunderstanding. Problems::issue_problem_end(); @ = - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ActivityOf)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ActivityOf)); @; Problems::issue_problem_segment( "%PActivity names rarely end with 'of': for instance, when we talk " @@ -2742,7 +2742,7 @@ common misunderstanding. Problems::issue_problem_end(); @ = - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_MidTextUnicode)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_MidTextUnicode)); @; Problems::issue_problem_segment( "%PMaybe you intended this to produce a Unicode character? " @@ -2756,7 +2756,7 @@ common misunderstanding. Problems::issue_problem_end(); @ = - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_UnknownCondition)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_UnknownCondition)); @; Problems::issue_problem_segment( "%PNames which end in 'condition' often represent the current " @@ -2769,7 +2769,7 @@ common misunderstanding. Problems::issue_problem_end(); @ = - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ActivityWithFor)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ActivityWithFor)); @; Problems::issue_problem_segment( "%PWere you by any chance meaning to refer to an activity by name, " @@ -2778,7 +2778,7 @@ common misunderstanding. Problems::issue_problem_end(); @ = - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_Unknown)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_Unknown)); @; Problems::issue_problem_end(); @@ -2919,7 +2919,7 @@ action value, which is a specific action. THIS_IS_A_GROSSER_THAN_GROSS_PROBLEM; Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(p)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ActionNotSpecific)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ActionNotSpecific)); Problems::issue_problem_segment( "You wrote %1, but '%2' is too vague to describe a specific action. " "%PIt has to be an exact instruction about what is being done, and " @@ -2932,7 +2932,7 @@ action value, which is a specific action. THIS_IS_A_GROSSER_THAN_GROSS_PROBLEM; Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(p)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ActionTooSpecific)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ActionTooSpecific)); Problems::issue_problem_segment( "You wrote %1, but '%2' imposes too many restrictions on the " "action to be carried out, by saying something about the " @@ -3017,7 +3017,7 @@ it to a constant value, using the "description of..." constructor. THIS_IS_AN_INTERESTING_PROBLEM { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(p)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadQuantifierInDescription)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadQuantifierInDescription)); Problems::issue_problem_segment( "In %1 you wrote the description '%2' in the context of a value, " "but descriptions used that way are not allowed to talk about " @@ -3039,7 +3039,7 @@ defined a phrase for only one case: Problems::quote_wording(2, Node::get_text(p)); Problems::quote_kind(3, K); Problems::quote_kind(4, domain); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); Problems::issue_problem_segment( "In the line %1, the text '%2' seems to be a description of %3, but " "a description of %4 was required."); @@ -3056,7 +3056,7 @@ any universal quantifier ("all", etc.) is removed. THIS_IS_AN_ORDINARY_PROBLEM; Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(p)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); Problems::issue_problem_segment( "In the line %1, the text '%2' is given where a description of a collection " "of things or values was required. For instance, 'rooms which contain " @@ -3078,7 +3078,7 @@ have made an understandable confusion. THIS_IS_AN_ORDINARY_PROBLEM; Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(p)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); /* screened out at definition time */ + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); /* screened out at definition time */ Problems::issue_problem_segment( "In the line %1, '%2' ought to be a value, but isn't - there must be " "something fishy about the way it was created. %P" @@ -3154,14 +3154,14 @@ it says the value has the wrong kind. if (Node::is(p, LOCAL_VARIABLE_NT)) { local_variable *lvar = Node::get_constant_local_variable(p); Problems::quote_kind(4, LocalVariables::kind(lvar)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_LocalMismatch)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_LocalMismatch)); Problems::issue_problem_segment( "You wrote %1, but '%2' is a temporary name for %4 (created by 'let' " "or 'repeat'), whereas I was expecting to find %3 there."); Problems::issue_problem_end(); } else if (Kinds::Compare::eq(kind_expected, K_sayable_value)) { Problems::quote_kind(4, Specifications::to_kind(p)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_AllSayInvsFailed)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_AllSayInvsFailed)); if (Wordings::empty(Node::get_text(p))) Problems::issue_problem_segment( "You wrote %1, but that only works for sayable values, that is, " @@ -3177,7 +3177,7 @@ it says the value has the wrong kind. LOG("Found: $u; Expected: $u\n", Specifications::to_kind(p), kind_expected); Problems::quote_kind(4, Specifications::to_kind(p)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TypeMismatch)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TypeMismatch)); if (Wordings::empty(Node::get_text(p))) Problems::issue_problem_segment( "You wrote %1, but that has the wrong kind of value: %4 rather than %3."); @@ -3213,7 +3213,7 @@ same species as well. Problems::quote_wording(2, Node::get_text(p)); Problems::quote_kind(3, kind_expected); Problems::quote_kind_of(4, p); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_GenericDescription)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_GenericDescription)); Problems::issue_problem_segment( "You wrote %1, but '%2' is used in a context where I'd expect to see " "a (single) specific example of %3. Although what you wrote did " @@ -3227,7 +3227,7 @@ same species as well. Problems::quote_wording(2, Node::get_text(p)); Problems::quote_kind(3, kind_expected); Problems::quote_kind_of(4, p); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_LiteralDescriptionAsValue)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_LiteralDescriptionAsValue)); Problems::issue_problem_segment( "You wrote %1, but '%2' is used in a context where I'd expect to see " "a (single) specific example of %3, not a description."); @@ -3252,7 +3252,7 @@ resorts when it has nothing more specific to say. Problems::quote_wording(2, Node::get_text(p)); Problems::quote_kind(3, kind_expected); Problems::quote_kind_of(4, p); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); /* at any rate I haven't seen it lately */ + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); /* at any rate I haven't seen it lately */ Problems::issue_problem_segment( "You wrote %1, but '%2' seems to be %4, whereas I was expecting to " "find %3 there."); diff --git a/inform7/core-module/Chapter 14/Rvalues.w b/inform7/core-module/Chapter 14/Rvalues.w index 4c2e9d0c2..67ff0a584 100644 --- a/inform7/core-module/Chapter 14/Rvalues.w +++ b/inform7/core-module/Chapter 14/Rvalues.w @@ -804,7 +804,7 @@ in several contexts by using a tilde: |~attr|. if (parity == 1) { Emit::holster(VH, Properties::iname(prn_to_eval)); } else { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(Untestable), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(Untestable), "this refers to an either-or property with a negative " "that I can't unravel'", "which normally never happens. (Are you using 'change' " diff --git a/inform7/core-module/Chapter 15/Comparative Relations.w b/inform7/core-module/Chapter 15/Comparative Relations.w index d56c2f63b..9144806ca 100644 --- a/inform7/core-module/Chapter 15/Comparative Relations.w +++ b/inform7/core-module/Chapter 15/Comparative Relations.w @@ -57,7 +57,7 @@ int Properties::ComparativeRelations::REL_typecheck(binary_predicate *bp, LOG("Comparative misapplied to $Y not $Y\n", prn, bp->comparative_property); Problems::quote_property(4, bp->comparative_property); Problems::quote_property(5, prn); - Problems::Issue::tcp_problem(_p_(PM_ComparativeMisapplied), tck, + StandardProblems::tcp_problem(_p_(PM_ComparativeMisapplied), tck, "that ought to make a comparison of %4 not %5."); return NEVER_MATCH; } diff --git a/inform7/core-module/Chapter 15/Condition Properties.w b/inform7/core-module/Chapter 15/Condition Properties.w index f38fea97b..e924680fd 100644 --- a/inform7/core-module/Chapter 15/Condition Properties.w +++ b/inform7/core-module/Chapter 15/Condition Properties.w @@ -57,7 +57,7 @@ property *Properties::Conditions::new(inference_subject *infs, wording NW, parse Problems::quote_kind(2, common_kind); Problems::quote_wording(3, CKW); Problems::quote_wording(4, NKW); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_MixedExistingConstants)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_MixedExistingConstants)); Problems::issue_problem_segment( "In %1, one of the values you supply as a possibility is '%3', " "but this already has a meaning (as %2). This might be okay if " @@ -66,7 +66,7 @@ property *Properties::Conditions::new(inference_subject *infs, wording NW, parse } else if (prn == NULL) { Problems::quote_source(1, current_sentence); Problems::quote_kind(2, common_kind); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); /* because it won't parse */ + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); /* because it won't parse */ Problems::issue_problem_segment( "In %1, every value you supply as a possibility is %2. " "That would be okay if it were a property which is a condition " diff --git a/inform7/core-module/Chapter 15/Either-Or Properties.w b/inform7/core-module/Chapter 15/Either-Or Properties.w index 8b6f58e17..e021643a6 100644 --- a/inform7/core-module/Chapter 15/Either-Or Properties.w +++ b/inform7/core-module/Chapter 15/Either-Or Properties.w @@ -54,7 +54,7 @@ This is how the either/or properties declared by the source text are made. = property *Properties::EitherOr::obtain(wording W, inference_subject *infs) { if ((W)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_KindAdjectiveClash), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_KindAdjectiveClash), "this tries to create a new either/or adjective with the same name " "as an existing kind", "which isn't allowed. For example, 'A hopper can be a container.' is " @@ -131,7 +131,7 @@ void Properties::EitherOr::make_negations(property *prn, property *neg) { Problems::quote_property(4, neg); Problems::quote_property(5, neg->negation); } - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BrokenNegationPair)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BrokenNegationPair)); Problems::issue_problem_segment( "In %1, you proposed to set up the properties '%2' and '%3' as " "opposites of each other. But I can't allow that, because '%4' " diff --git a/inform7/core-module/Chapter 15/Indefinite Appearance.w b/inform7/core-module/Chapter 15/Indefinite Appearance.w index 2351e6682..161470db2 100644 --- a/inform7/core-module/Chapter 15/Indefinite Appearance.w +++ b/inform7/core-module/Chapter 15/Indefinite Appearance.w @@ -35,7 +35,7 @@ void Properties::Appearance::infer(inference_subject *infs, parse_node *spec) { ambiguously. @ = - Problems::Issue::infs_contradiction_problem(_p_(PM_TwoAppearances), + StandardProblems::infs_contradiction_problem(_p_(PM_TwoAppearances), World::Inferences::where_inferred(inf), current_sentence, infs, "seems to have two different descriptions", "perhaps because you intended the second description to apply to something " @@ -68,7 +68,7 @@ void Properties::Appearance::reallocate(inference_subject *infs) { if ((P_description) && (World::Permissions::find(infs, P_description, TRUE))) { Properties::Valued::assert(P_description, infs, txt, CERTAIN_CE); - } else Problems::Issue::inference_problem(_p_(PM_IndefiniteTextMeaningless), + } else StandardProblems::inference_problem(_p_(PM_IndefiniteTextMeaningless), infs, inf, "is not allowed", "i.e., you can't write a double-quoted piece of text as a " "sentence all by itself here. Some kinds or kinds of value " diff --git a/inform7/core-module/Chapter 15/Measurement Adjectives.w b/inform7/core-module/Chapter 15/Measurement Adjectives.w index cc4d1b9b9..be73a8eaf 100644 --- a/inform7/core-module/Chapter 15/Measurement Adjectives.w +++ b/inform7/core-module/Chapter 15/Measurement Adjectives.w @@ -145,7 +145,7 @@ void Properties::Measurement::validate(measurement_definition *mdef) { mdef->prop = NULL; LOG("Validating mdef with headword %W... <%W>\n", mdef->headword, mdef->name_of_property_to_compare); - Problems::Issue::definition_problem(Task::syntax_tree(), _p_(PM_GradingUnknownProperty), + StandardProblems::definition_problem(Task::syntax_tree(), _p_(PM_GradingUnknownProperty), mdef->measurement_node, "that definition involves an unknown property", "assuming it was meant to be a definition in the form 'Definition: " @@ -164,7 +164,7 @@ and issue a problem. mdef->region_threshold = Rvalues::to_encoded_notation(<>); if ((Kinds::Behaviour::is_quasinumerical(mdef->region_kind) == FALSE) && (mdef->region_shape != MEASURE_T_EXACTLY)) { - Problems::Issue::definition_problem(Task::syntax_tree(), _p_(PM_GradingNonarithmeticKOV), + StandardProblems::definition_problem(Task::syntax_tree(), _p_(PM_GradingNonarithmeticKOV), mdef->measurement_node, "the property value given here has a kind which can't be " "subject to numerical comparisons", @@ -175,7 +175,7 @@ and issue a problem. } if (Kinds::Compare::compatible(mdef->region_kind, Properties::Valued::kind(mdef->prop)) != ALWAYS_MATCH) { - Problems::Issue::definition_problem(Task::syntax_tree(), _p_(PM_GradingWrongKOV), + StandardProblems::definition_problem(Task::syntax_tree(), _p_(PM_GradingWrongKOV), mdef->measurement_node, "the property value given here is the wrong kind", "and does not match the property being looked at."); @@ -184,7 +184,7 @@ and issue a problem. } } else { LOG("Can't get literal from <%W>\n", mdef->region_threshold_text); - Problems::Issue::definition_problem(Task::syntax_tree(), _p_(PM_GradingNonLiteral), + StandardProblems::definition_problem(Task::syntax_tree(), _p_(PM_GradingNonLiteral), mdef->measurement_node, "that definition is wrongly phrased", "assuming it was meant to be a grading adjective like 'Definition: a " @@ -228,7 +228,7 @@ always to match , and the text in the range must match ... ==> MEASURE_T_EXACTLY @ = - Problems::Issue::definition_problem(Task::syntax_tree(), _p_(PM_GradingMisphrased), + StandardProblems::definition_problem(Task::syntax_tree(), _p_(PM_GradingMisphrased), NounPhrases::new_raw(W), "that definition is wrongly phrased", "assuming it was meant to be a grading adjective like 'Definition: a " @@ -259,7 +259,7 @@ adjective_meaning *Properties::Measurement::ADJ_parse(parse_node *q, @ = if (Wordings::length(AW) > 1) { if (shape != MEASURE_T_EXACTLY) - Problems::Issue::definition_problem(Task::syntax_tree(), _p_(PM_MultiwordGrading), + StandardProblems::definition_problem(Task::syntax_tree(), _p_(PM_MultiwordGrading), q, "a grading adjective must be a single word", "as in 'Definition: a container is large if its carrying capacity is " "10 or more.': 'fairly large' would not be allowed because it would " @@ -269,7 +269,7 @@ adjective_meaning *Properties::Measurement::ADJ_parse(parse_node *q, if (Wordings::nonempty(CALLW)) { if (shape != MEASURE_T_EXACTLY) - Problems::Issue::definition_problem(Task::syntax_tree(), _p_(PM_GradingCalled), + StandardProblems::definition_problem(Task::syntax_tree(), _p_(PM_GradingCalled), q, "callings are not allowed when defining grading adjectives", "so 'Definition: a container is large if its carrying capacity is 10 " "or more.' is fine, but so 'Definition: a container (called the bag) " @@ -280,7 +280,7 @@ adjective_meaning *Properties::Measurement::ADJ_parse(parse_node *q, if (sense != 1) { if (shape != MEASURE_T_EXACTLY) - Problems::Issue::definition_problem(Task::syntax_tree(), _p_(PM_GradingUnless), + StandardProblems::definition_problem(Task::syntax_tree(), _p_(PM_GradingUnless), q, "'unless' is not allowed when defining grading adjectives", "so 'Definition: a container is large if its carrying capacity is 10 " "or more.' is fine, but so 'Definition: a container is modest unless " diff --git a/inform7/core-module/Chapter 15/Properties of Values.w b/inform7/core-module/Chapter 15/Properties of Values.w index 47df20025..196c51d43 100644 --- a/inform7/core-module/Chapter 15/Properties of Values.w +++ b/inform7/core-module/Chapter 15/Properties of Values.w @@ -85,7 +85,7 @@ void Properties::OfValues::check_allowable(kind *K) { Problems::quote_source(1, current_sentence); Problems::quote_property(2, prn); Problems::quote_kind(3, K); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_AnomalousProperty)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_AnomalousProperty)); Problems::issue_problem_segment( "Sorry, but I'm going to have to disallow the sentence %1, even " "though it asks for something reasonable. A very small number " diff --git a/inform7/core-module/Chapter 15/Properties.w b/inform7/core-module/Chapter 15/Properties.w index 0ef81dcba..42778722e 100644 --- a/inform7/core-module/Chapter 15/Properties.w +++ b/inform7/core-module/Chapter 15/Properties.w @@ -133,7 +133,7 @@ property *Properties::create(wording W, package_request *using_package, inter_na int unfortunate = FALSE; if (((W)) && (<> == K_value)) { unfortunate = TRUE; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), "the single word 'value' cannot be used as the name of a property", "because it has a much broader meaning already. Inform uses the " "word 'value' to mean any number, time of day, name of something, " @@ -143,7 +143,7 @@ property *Properties::create(wording W, package_request *using_package, inter_na "room number' would be fine."); } if (Wordings::length(W) > MAX_WORDS_IN_ASSEMBLAGE-2) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PropertyNameTooLong), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PropertyNameTooLong), "this is too long a name for a single property to have", "and would become unwieldy."); W = Wordings::truncate(W, MAX_WORDS_IN_ASSEMBLAGE-2); @@ -152,7 +152,7 @@ property *Properties::create(wording W, package_request *using_package, inter_na unfortunate = TRUE; Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyNameUnsuitable)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyNameUnsuitable)); Problems::issue_problem_segment( "The sentence %1 seems to create a new property called '%2', but " "this is not a good name, and I think I must have misread what " @@ -179,7 +179,7 @@ something. Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); Problems::quote_kind_of(3, spec); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyNameClash)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyNameClash)); Problems::issue_problem_segment( "You wrote %1, but '%2' is not free to be the name of a fresh " "property: it already has a meaning (as %3)."); @@ -553,14 +553,14 @@ void Properties::translates(wording W, parse_node *p2) { @ = if (prn == NULL) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NonPropertyTranslated), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NonPropertyTranslated), "this property does not exist", "so cannot be translated."); return; } if ((prn->translated) && (Str::eq_wide_string(Produce::get_translation(Properties::iname(prn)), text) == FALSE)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TranslatedTwice), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TranslatedTwice), "this property has already been translated", "so there must be some duplication somewhere."); return; diff --git a/inform7/core-module/Chapter 15/Setting Property Relation.w b/inform7/core-module/Chapter 15/Setting Property Relation.w index bafb3b9f0..d55f643bc 100644 --- a/inform7/core-module/Chapter 15/Setting Property Relation.w +++ b/inform7/core-module/Chapter 15/Setting Property Relation.w @@ -76,13 +76,13 @@ void Properties::SettingRelations::fix_property_bp(binary_predicate *bp) { @ = *X = FALSE; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RelationWithEitherOrProperty), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RelationWithEitherOrProperty), "verbs can only set properties with values", "not either/or properties like this one."); @ = *X = FALSE; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RelationWithBadProperty), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RelationWithBadProperty), "that doesn't seem to be a property", "perhaps because you haven't defined it yet?"); @@ -178,17 +178,17 @@ be caught later on Inform's run. Problems::quote_kind(4, kinds_of_terms[1]); Problems::quote_kind(5, val_kind); if (Kinds::get_construct(kinds_of_terms[1]) == CON_property) - Problems::Issue::tcp_problem(_p_(PM_PropertiesEquated), tck, + StandardProblems::tcp_problem(_p_(PM_PropertiesEquated), tck, "that seems to say that two different properties are the same - " "like saying 'The indefinite article is the printed name': that " "might be true for some things, some of the time, but it makes no " "sense in a general statement like this one."); else if (prn == NULL) - Problems::Issue::tcp_problem(_p_(PM_UnknownPropertyType), tck, + StandardProblems::tcp_problem(_p_(PM_UnknownPropertyType), tck, "that tries to set the value of an unknown property to %4."); else { Problems::quote_property(6, prn); - Problems::Issue::tcp_problem(_p_(PM_PropertyType), tck, + StandardProblems::tcp_problem(_p_(PM_PropertyType), tck, "that tries to set the value of the '%6' property to %4 - which " "must be wrong because this property has to be %5."); } @@ -200,7 +200,7 @@ be caught later on Inform's run. LOG("Property value for impossible domain $u\n", kinds_of_terms[0]); Problems::quote_kind(4, kinds_of_terms[0]); Problems::quote_property(5, prn); - Problems::Issue::tcp_problem(_p_(BelievedImpossible), tck, + StandardProblems::tcp_problem(_p_(BelievedImpossible), tck, "that tries to set the property '%5' for %4. Values of that kind " "are not allowed to have properties. (Some kinds of value are, " "some aren't - see the Kinds index for details. It's a matter " diff --git a/inform7/core-module/Chapter 15/The Provision Relation.w b/inform7/core-module/Chapter 15/The Provision Relation.w index 01f1c567e..b50ac8939 100644 --- a/inform7/core-module/Chapter 15/The Provision Relation.w +++ b/inform7/core-module/Chapter 15/The Provision Relation.w @@ -46,7 +46,7 @@ int Properties::ProvisionRelation::REL_typecheck(binary_predicate *bp, kind **kinds_of_terms, kind **kinds_required, tc_problem_kit *tck) { if (Kinds::get_construct(kinds_of_terms[1]) == CON_property) return ALWAYS_MATCH; Problems::quote_kind(4, kinds_of_terms[1]); - Problems::Issue::tcp_problem(_p_(PM_BadProvides), tck, + StandardProblems::tcp_problem(_p_(PM_BadProvides), tck, "that asks whether something provides something, and in Inform 'to provide' " "means that an object (or value) has a property attached - for instance, " "containers provide the property 'carrying capacity'. Here, though, we have " diff --git a/inform7/core-module/Chapter 15/Valued Properties.w b/inform7/core-module/Chapter 15/Valued Properties.w index 03dd0a156..319143af1 100644 --- a/inform7/core-module/Chapter 15/Valued Properties.w +++ b/inform7/core-module/Chapter 15/Valued Properties.w @@ -41,7 +41,7 @@ property *Properties::Valued::obtain_within_kind(wording W, kind *K) { } @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadKOVForRelationProperty), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadKOVForRelationProperty), "that property already exists and contains a kind of value incompatible with " "what we need here", "so you will need to give it a different name."); @@ -122,7 +122,7 @@ void Properties::Valued::set_kind(property *prn, kind *K) { if ((Kinds::Behaviour::definite(K) == FALSE) && (prn->do_not_compile == FALSE)) { Problems::quote_wording(1, prn->name); Problems::quote_kind(2, K); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyIndefinite)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyIndefinite)); if (current_sentence) { Problems::quote_source(3, current_sentence); Problems::issue_problem_segment( @@ -241,7 +241,7 @@ void Properties::Valued::compile_default_value(value_holster *VH, property *prn) current_sentence = NULL; if (Kinds::RunTime::compile_default_value_vh(VH, K, prn->name, "property") == FALSE) { Problems::quote_wording(1, prn->name); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyUninitialisable)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyUninitialisable)); Problems::issue_problem_segment( "I am unable to put any value into the property '%1', because " "it seems to have a kind of value which has no actual values."); diff --git a/inform7/core-module/Chapter 16/Complete Model World.w b/inform7/core-module/Chapter 16/Complete Model World.w index f3e76c38a..bce0d148c 100644 --- a/inform7/core-module/Chapter 16/Complete Model World.w +++ b/inform7/core-module/Chapter 16/Complete Model World.w @@ -105,7 +105,7 @@ A nameless property added in Stages II and III does not need permission. property *prn = World::Inferences::get_property(inf); if (Wordings::nonempty(prn->name)) if (World::Permissions::find(infs, prn, TRUE) == NULL) - Problems::Issue::inference_problem(_p_(PM_PropertyNotPermitted), + StandardProblems::inference_problem(_p_(PM_PropertyNotPermitted), infs, inf, "is not allowed to exist", "because you haven't said it is. What properties something can " "have depends on what kind of thing it is: see the Index for " @@ -179,7 +179,7 @@ about the Portal, to stand. @ = LOG("Checking infs $j compatible with infs $j for property $Y:\n $I\n $I\n", infs, boss, prn, narrow, wide); - Problems::Issue::infs_contradiction_problem(_p_(PM_InstanceContradiction), + StandardProblems::infs_contradiction_problem(_p_(PM_InstanceContradiction), World::Inferences::where_inferred(narrow), World::Inferences::where_inferred(wide), infs, "therefore has to have two contradictory states of the same property at once", "which is impossible. When a kind's definition says that something is 'always' " diff --git a/inform7/core-module/Chapter 16/Inferences.w b/inform7/core-module/Chapter 16/Inferences.w index 2cbd2439c..0dd40cc09 100644 --- a/inform7/core-module/Chapter 16/Inferences.w +++ b/inform7/core-module/Chapter 16/Inferences.w @@ -308,7 +308,7 @@ void World::Inferences::verify_prop_states(inference_subject *infs) { Problems::quote_property(2, prn); Problems::quote_kind(3, VK); Problems::quote_kind(4, PK); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_LateInferenceProblem)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_LateInferenceProblem)); Problems::issue_problem_segment( "You wrote %1, but that tries to set the value of the '%2' " "property to %3 - which must be wrong because this property " @@ -752,7 +752,7 @@ and so clashed are impossible.) (Plugins::Call::explain_contradiction(list, i, d, infs))) return; if (i->inference_type == PROPERTY_INF) { if (i->inferred_property == P_variable_initial_value) - Problems::Issue::two_sentences_problem(_p_(PM_VariableContradiction), + StandardProblems::two_sentences_problem(_p_(PM_VariableContradiction), list->inferred_from, "this looks like a contradiction", "because the initial value of this variable seems to be being set " @@ -768,7 +768,7 @@ and so clashed are impossible.) Problems::quote_subject(4, infs); Problems::quote_spec(5, i->inferred_property_value); Problems::quote_spec(6, list->inferred_property_value); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RelationContradiction2)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RelationContradiction2)); Problems::issue_problem_segment( "I'm finding a contradiction at the sentence %1, " "because it means I can't set up %3. " @@ -783,7 +783,7 @@ and so clashed are impossible.) Problems::quote_subject(4, infs); Problems::quote_spec(5, i->inferred_property_value); Problems::quote_spec(6, list->inferred_property_value); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RelationContradiction)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RelationContradiction)); Problems::issue_problem_segment( "I'm finding a contradiction at the sentences %1 and %2, " "because between them they set up rival versions of %3. " @@ -795,7 +795,7 @@ and so clashed are impossible.) return; } } - Problems::Issue::two_sentences_problem(_p_(PM_PropertyContradiction), + StandardProblems::two_sentences_problem(_p_(PM_PropertyContradiction), list->inferred_from, "this looks like a contradiction", "because the same property seems to be being set in each of these sentences, " @@ -804,14 +804,14 @@ and so clashed are impossible.) } else #ifdef IF_MODULE if (i->inference_type == IS_ROOM_INF) { - Problems::Issue::two_sentences_problem(_p_(PM_WhenIsARoomNotARoom), + StandardProblems::two_sentences_problem(_p_(PM_WhenIsARoomNotARoom), list->inferred_from, "this looks like a contradiction", "because apparently something would have to be both a room and not a " "room at the same time."); } else #endif - Problems::Issue::two_sentences_problem(_p_(PM_Contradiction), + StandardProblems::two_sentences_problem(_p_(PM_Contradiction), list->inferred_from, "this looks like a contradiction", "which might be because I have misunderstood what was meant to be the subject " diff --git a/inform7/core-module/Chapter 17/Responses.w b/inform7/core-module/Chapter 17/Responses.w index ab24ebd28..ae99ab10b 100644 --- a/inform7/core-module/Chapter 17/Responses.w +++ b/inform7/core-module/Chapter 17/Responses.w @@ -518,13 +518,13 @@ so the penultimate word, if it's there, is the letter. int code = <>; if ((rule_being_compiled == NULL) || (Rules::rule_is_named(rule_being_compiled) == FALSE)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ResponseContextWrong), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ResponseContextWrong), "lettered responses can only be used in named rules", "not in any of the other contexts in which quoted text can appear."); return; } if (Rules::rule_defines_response(rule_being_compiled, code)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ResponseDuplicated), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ResponseDuplicated), "this duplicates a response letter", "which is not allowed: if a bracketed letter like (A) is used to mark " "some text as a response, then it can only occur once in its rule."); diff --git a/inform7/core-module/Chapter 17/Text Literals.w b/inform7/core-module/Chapter 17/Text Literals.w index 9d7deceb3..ad72bbc20 100644 --- a/inform7/core-module/Chapter 17/Text Literals.w +++ b/inform7/core-module/Chapter 17/Text Literals.w @@ -236,7 +236,7 @@ void Strings::TextLiterals::compile_quotation(value_holster *VH, wording W) { literal_text *lt = Strings::TextLiterals::compile_literal(VH, TRUE, W); if (lt) lt->as_boxed_quotation = TRUE; else - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_EmptyQuotationBox), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_EmptyQuotationBox), "a boxed quotation can't be empty", "though I suppose you could make it consist of just a few spaces " "to get a similar effect if you really needed to."); diff --git a/inform7/core-module/Chapter 17/Text Substitutions.w b/inform7/core-module/Chapter 17/Text Substitutions.w index 99436a2ca..983005601 100644 --- a/inform7/core-module/Chapter 17/Text Substitutions.w +++ b/inform7/core-module/Chapter 17/Text Substitutions.w @@ -178,9 +178,23 @@ since it often confuses newcomers: = text_substitution *current_ts_being_compiled = NULL; +int it_is_not_worth_adding = FALSE; /* To suppress the "It may be worth adding..." */ +void Strings::TextSubstitutions::it_is_worth_adding(void) { + it_is_not_worth_adding = FALSE; +} +void Strings::TextSubstitutions::it_is_not_worth_adding(void) { + it_is_not_worth_adding = TRUE; +} + +@ + +@d ENDING_MESSAGE_PROBLEMS_CALLBACK Strings::TextSubstitutions::append_text_substitution_proviso + += void Strings::TextSubstitutions::append_text_substitution_proviso(void) { if (it_is_not_worth_adding) return; + if (compiling_text_routines_mode == FALSE) return; if ((current_ts_being_compiled) && (current_ts_being_compiled->local_names_existed_at_usage_time)) { Frames::log(Frames::current_stack_frame()); diff --git a/inform7/core-module/Chapter 18/List Constants.w b/inform7/core-module/Chapter 18/List Constants.w index aef04b55e..64ba2c553 100644 --- a/inform7/core-module/Chapter 18/List Constants.w +++ b/inform7/core-module/Chapter 18/List Constants.w @@ -188,7 +188,7 @@ incomparable, and "thing" being the max of "person" and "door"). @ = Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(spec)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadConstantListEntry)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadConstantListEntry)); Problems::issue_problem_segment( "The constant list %1 contains an entry '%2' which isn't any " "form of constant I'm able to read."); @@ -201,7 +201,7 @@ incomparable, and "thing" being the max of "person" and "door"). Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(spec)); Problems::quote_spec(3, spec); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NonconstantConstantListEntry)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NonconstantConstantListEntry)); Problems::issue_problem_segment( "The constant list %1 contains an entry '%2' which does make sense, " "but isn't a constant (it's %3). Only constants can appear as entries in " @@ -213,7 +213,7 @@ incomparable, and "thing" being the max of "person" and "door"). Problems::quote_wording(2, Node::get_text(spec)); Problems::quote_kind(3, E); Problems::quote_kind(4, previous_K); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_IncompatibleConstantListEntry)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_IncompatibleConstantListEntry)); Problems::issue_problem_segment( "The constant list %1 contains an entry '%2' whose kind is '%3', but " "that's not compatible with the kind I had established from looking at " diff --git a/inform7/core-module/Chapter 19/Table Columns.w b/inform7/core-module/Chapter 19/Table Columns.w index cc0ba06f1..745576a8d 100644 --- a/inform7/core-module/Chapter 19/Table Columns.w +++ b/inform7/core-module/Chapter 19/Table Columns.w @@ -119,7 +119,7 @@ void Tables::Columns::set_kind(table_column *tc, table *t, kind *K) { Problems::quote_kind(4, K); Problems::quote_kind(5, K); Problems::quote_table(6, t); - Problems::Issue::table_problem(_p_(PM_TableColumnDescription), + StandardProblems::table_problem(_p_(PM_TableColumnDescription), t, tc, NULL, "In %1, you've written the heading of the column '%2' to say that each entry " "should be %4. But descriptions aren't allowed as table entries - tables " @@ -192,7 +192,7 @@ table_column_usage Tables::Columns::add_to_table(wording W, table *t) { for (int i=0; ino_columns; i++) if (t->columns[i].column_identity == tc) { Problems::quote_wording(4, W); - Problems::Issue::table_problem(_p_(PM_DuplicateColumnName), + StandardProblems::table_problem(_p_(PM_DuplicateColumnName), t, NULL, NULL, "In %1, the column name %4 cannot be used, because there's already " "a column of the same name. (You can't have two columns with the " @@ -247,7 +247,7 @@ what looks like text into grammar for parsing. @ = *X = NEW_TC_PROBLEM; Problems::quote_wording(4, W); - Problems::Issue::table_problem(_p_(PM_TableColumnArticle), + StandardProblems::table_problem(_p_(PM_TableColumnArticle), table_being_examined, NULL, table_cell_node, "In %1, the column name %3 cannot be used, because there would be too " "much ambiguity arising from its ordinary meaning as an article. (It " @@ -255,14 +255,14 @@ what looks like text into grammar for parsing. @ = *X = NEW_TC_PROBLEM; - Problems::Issue::table_problem(_p_(PM_TableColumnAlready), + StandardProblems::table_problem(_p_(PM_TableColumnAlready), table_being_examined, NULL, table_cell_node, "In %1, the column name %3 cannot be used, because it already means " "something else."); @ = *X = NEW_TC_PROBLEM; - Problems::Issue::table_problem(_p_(PM_TableColumnBracketed), + StandardProblems::table_problem(_p_(PM_TableColumnBracketed), table_being_examined, NULL, table_cell_node, "In %1, the column name %3 cannot be used, because it is in brackets. " "(Perhaps you intended to use the brackets to give the kind of the " @@ -347,7 +347,7 @@ void Tables::Columns::check_explicit_headings(table *t, int i, table_column_usag Problems::quote_kind(4, EK); Problems::quote_kind(5, K); Problems::quote_table(6, tcu->column_identity->table_from_which_kind_inferred); - Problems::Issue::table_problem(_p_(PM_TableColumnInconsistent), + StandardProblems::table_problem(_p_(PM_TableColumnInconsistent), t, tcu->column_identity, tcu->entries, "In %1, you've written the heading of the column %3 to say that each entry " "should be %4. But a column with the same name also appears in %6, and each " @@ -355,7 +355,7 @@ void Tables::Columns::check_explicit_headings(table *t, int i, table_column_usag "has to have the same kind of entry, whichever tables it appears in."); @ = - Problems::Issue::table_problem(_p_(PM_TableColumnBrackets), + StandardProblems::table_problem(_p_(PM_TableColumnBrackets), t, tcu->column_identity, tcu->entries, "In %1, I can't use the column heading %3. Brackets are only allowed in " "table column names when giving the kind of value which will be stored in " @@ -422,7 +422,7 @@ void Tables::Columns::note_kind(table *t, int i, table_column_usage *tcu, Problems::quote_number(4, "ed_col); Problems::quote_number(5, &table_cell_row); Problems::quote_source(6, tcu->observed_constant_cell); - Problems::Issue::table_problem(_p_(PM_TableKindBelowValue), + StandardProblems::table_problem(_p_(PM_TableKindBelowValue), t, tcu->column_identity, cell, "In %1, column %4 (%2), the entry %3 (row %5) is the name of a kind. " "This isn't a specific value. You're allowed to write in the name " @@ -438,7 +438,7 @@ void Tables::Columns::note_kind(table *t, int i, table_column_usage *tcu, Problems::quote_number(4, "ed_col); Problems::quote_number(5, &table_cell_row); Problems::quote_source(6, tcu->observed_kind_cell); - Problems::Issue::table_problem(_p_(PM_TableKindTwice), + StandardProblems::table_problem(_p_(PM_TableKindTwice), t, tcu->column_identity, cell, "In %1, column %4 (%2), the entry %3 (row %5) is the name of a kind. " "This isn't a specific value. You're allowed to write in the name " @@ -451,7 +451,7 @@ void Tables::Columns::note_kind(table *t, int i, table_column_usage *tcu, Problems::quote_number(4, "ed_col); Problems::quote_number(5, &table_cell_row); Problems::quote_source(6, tcu->observed_kind_cell); - Problems::Issue::table_problem(_p_(PM_TableValueBelowKind), + StandardProblems::table_problem(_p_(PM_TableValueBelowKind), t, tcu->column_identity, cell, "In %1, column %4 (%2), the entry %3 (row %5) is a genuine, non-blank " "entry: it's a specific value. That's fine, of course - the whole " @@ -467,7 +467,7 @@ void Tables::Columns::note_kind(table *t, int i, table_column_usage *tcu, int quoted_col = i + 1; /* i.e., counting from 1 */ Problems::quote_number(6, "ed_col); Problems::quote_number(7, &table_cell_row); - Problems::Issue::table_problem(_p_(PM_TableIncompatibleEntry), + StandardProblems::table_problem(_p_(PM_TableIncompatibleEntry), t, tcu->column_identity, cell, "In %1, column %6 (%2), the entry %3 (row %7) doesn't fit what I know " "about '%2' - it's %4, whereas I think every entry ought to be %5."); @@ -478,7 +478,7 @@ void Tables::Columns::note_kind(table *t, int i, table_column_usage *tcu, Problems::quote_wording(7, Nouns::nominative(tcu->column_identity->name)); Problems::quote_number(8, "ed_col); Problems::quote_number(9, &table_cell_row); - Problems::Issue::table_problem(_p_(PM_TableIncompatibleEntry2), + StandardProblems::table_problem(_p_(PM_TableIncompatibleEntry2), t, tcu->column_identity, cell, "In %1, column %8 (%2), the entry %3 (row %9) has the wrong kind to be in " "the '%2' column - it's %4, whereas I think every entry ought to be %5. %P" @@ -495,7 +495,7 @@ happens: Problems::quote_wording(7, Nouns::nominative(tcu->column_identity->name)); Problems::quote_kind(4, K); Problems::quote_kind(5, CK); - Problems::Issue::table_problem(_p_(PM_TableColumnIncompatible), + StandardProblems::table_problem(_p_(PM_TableColumnIncompatible), t, tcu->column_identity, cell, "In %1, the column '%2' is declared as holding %4, but when the same " "column appeared in table %6, the contents were said there to be %5. %P" @@ -512,7 +512,7 @@ void Tables::Columns::approve_kind(table *t, int i, table_column_usage *tcu) { i, Nouns::nominative(tcu->column_identity->name), K, tcu->entries); if ((Kinds::get_construct(K) == CON_list_of) && (Kinds::Compare::eq(Kinds::unary_construction_material(K), K_value))) { - Problems::Issue::table_problem(_p_(PM_TableColumnEmptyLists), + StandardProblems::table_problem(_p_(PM_TableColumnEmptyLists), t, NULL, tcu->entries, "In %1, the column %3 seems to consist only of empty lists. " "This means that I can't tell what kind of value it should hold - " @@ -526,10 +526,10 @@ void Tables::Columns::approve_kind(table *t, int i, table_column_usage *tcu) { if (K == NULL) { int quoted_col = i + 1; /* i.e., counting from 1 */ Problems::quote_number(4, "ed_col); - Problems::Issue::table_problem(_p_(PM_TableKindlessColumn), + StandardProblems::table_problem(_p_(PM_TableKindlessColumn), t, tcu->column_identity, NULL, "Column %4 (%2) of %1 contains no values and doesn't tell me " - "anything about its kind%|, " + "anything about its kind%S.%L, " "which means that I don't know how to deal with it. You should " "either put a value into the column somewhere, or else write " "the kind in as part of the heading: '%2 (a number)', say."); diff --git a/inform7/core-module/Chapter 19/Tables of Definitions.w b/inform7/core-module/Chapter 19/Tables of Definitions.w index fd12c67ba..3a2a521b5 100644 --- a/inform7/core-module/Chapter 19/Tables of Definitions.w +++ b/inform7/core-module/Chapter 19/Tables of Definitions.w @@ -37,7 +37,7 @@ The subject must match: @ (We're going to need this twice.) @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TableDefiningTheImpossible), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TableDefiningTheImpossible), "you can only use 'defined by' to set up values and things", "as created with sentences like 'The tree species are defined by Table 1.' " "or 'Some men are defined by the Table of Eligible Bachelors.'"); @@ -56,7 +56,7 @@ The subject must match: @ = *X = FALSE; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TableUndefined), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TableUndefined), "you can only use 'defined by' in terms of a table", "which lists the value names in the first column."); @@ -169,7 +169,7 @@ void Tables::Defining::kind_defined_by_table(parse_node *pn) { return; } if ((t) && (t->has_been_amended) && (Kinds::Compare::le(K, K_object))) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TableCantDefineAndAmend), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TableCantDefineAndAmend), "you can't use 'defined by' to define objects using a table " "which is amended by another table", "since that could too easily lead to ambiguities about what " @@ -180,7 +180,7 @@ void Tables::Defining::kind_defined_by_table(parse_node *pn) { t->where_used_to_define = pn->next; @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TableDefiningObject), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TableDefiningObject), "you can only use 'defined by' to set up values and things", "as created with sentences like 'The tree species are defined by Table 1.' " "or 'Some men are defined by the Table of Eligible Bachelors.' - trying to " @@ -192,7 +192,7 @@ void Tables::Defining::kind_defined_by_table(parse_node *pn) { LOG("K is $u\n", K); Problems::quote_source(1, current_sentence); Problems::quote_kind(2, K); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TableOfBuiltInKind)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TableOfBuiltInKind)); Problems::issue_problem_segment( "You wrote %1, but this would mean making each of the names in " "the first column %2 that's new. This is a kind which can't have " @@ -204,7 +204,7 @@ void Tables::Defining::kind_defined_by_table(parse_node *pn) { (Kinds::Behaviour::is_uncertainly_defined(K) == FALSE)) { Problems::quote_source(1, current_sentence); Problems::quote_kind(2, K); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TableOfExistingKind)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TableOfExistingKind)); Problems::issue_problem_segment( "You wrote %1, but this would mean making each of the names in " "the first column %2 that's new. That looks reasonable, since this is a " @@ -219,7 +219,7 @@ void Tables::Defining::kind_defined_by_table(parse_node *pn) { @ = if (Calculus::Propositions::contains_quantifier( Specifications::to_proposition(what))) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TableOfQuantifiedKind), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TableOfQuantifiedKind), "you can't use 'defined by' a table while also talking about the " "number of things to be defined", "since that could too easily lead to contradictions. (So 'Six doors are " @@ -271,9 +271,9 @@ have occurred, but if it does then the creation has worked. Assertions::Creator::tabular_definitions(t); NounPhrases::annotate_by_articles(name_entry); - Problems::Buffer::redirect_problem_sentence(current_sentence, name_entry, pn->next); + ProblemBuffer::redirect_problem_sentence(current_sentence, name_entry, pn->next); Assertions::Copular::make_assertion(name_entry, pn->next); - Problems::Buffer::redirect_problem_sentence(NULL, NULL, NULL); + ProblemBuffer::redirect_problem_sentence(NULL, NULL, NULL); Node::set_text(name_entry, NW); evaluation = NULL; if ((NW)) @@ -294,7 +294,7 @@ lots of rows, so we issue the problem just once. @ = if (blank_objections == 0) { Problems::quote_number(4, &row_count); - Problems::Issue::table_problem(_p_(PM_TableWithBlankNames), + StandardProblems::table_problem(_p_(PM_TableWithBlankNames), t, NULL, name_entry, "%1 is being used to create values, so that the first column needs " "to contain names for these new things. It's not allowed to contain " @@ -309,7 +309,7 @@ of the contents.) @ = Problems::quote_number(4, &row_count); - Problems::Issue::table_problem(_p_(PM_TableEntryGeneric), + StandardProblems::table_problem(_p_(PM_TableEntryGeneric), t, NULL, name_entry, "In row %4 of %1, the entry %3 is the name of a kind of value, " "so it can't be the name of a new object."); @@ -322,7 +322,7 @@ of the contents.) Problems::quote_kind_of(3, evaluation); Problems::quote_kind(4, K); Problems::quote_number(5, &row_count); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TableCreatedClash)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TableCreatedClash)); Problems::issue_problem_segment( "You wrote %1, and row %5 of the first column of that table is %2, which " "I ought to create as a new value of %4. But I can't do that: it already " @@ -334,7 +334,7 @@ of the contents.) LOG("Eval is $P\n", evaluation); Problems::quote_source(4, name_entry); Problems::quote_number(5, &row_count); - Problems::Issue::table_problem(_p_(PM_TableDefiningNothing), + StandardProblems::table_problem(_p_(PM_TableDefiningNothing), t, NULL, name_entry, "In row %5 of %1, the entry %4 seems not to have defined " "a thing there, so perhaps the first column did not consist " @@ -397,7 +397,7 @@ some misleading names we don't want to allow for these properties. @ = *X = NEW_TC_PROBLEM; Problems::quote_wording(3, W); - Problems::Issue::table_problem(_p_(PM_TableColumnLocation), + StandardProblems::table_problem(_p_(PM_TableColumnLocation), table_being_examined, NULL, table_cell_node, "In %1, the column name %3 cannot be used, because there would be too " "much ambiguity arising from its ordinary meaning referring to the " @@ -427,10 +427,10 @@ assertion handler, simulating sentences like "The P of X is Y". name_entry && data_entry; name_entry = name_entry->next, data_entry = data_entry->next) { - Problems::Buffer::redirect_problem_sentence(current_sentence, name_entry, data_entry); + ProblemBuffer::redirect_problem_sentence(current_sentence, name_entry, data_entry); @; } - Problems::Buffer::redirect_problem_sentence(current_sentence, NULL, NULL); + ProblemBuffer::redirect_problem_sentence(current_sentence, NULL, NULL); @ Note that a blank means "don't assert this property", it doesn't mean "assert a default value for this property". The difference is very small, diff --git a/inform7/core-module/Chapter 19/Tables.w b/inform7/core-module/Chapter 19/Tables.w index c0ea7dd58..290f02292 100644 --- a/inform7/core-module/Chapter 19/Tables.w +++ b/inform7/core-module/Chapter 19/Tables.w @@ -110,7 +110,7 @@ void Tables::check_tables_for_kind_clashes(void) { (Kinds::Compare::lt(<>, K_object))) { Problems::quote_table(1, t); Problems::quote_wording(2, t->table_name_text); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TableCoincidesWithKind)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TableCoincidesWithKind)); Problems::issue_problem_segment( "The name %1 will have to be disallowed because '%2' is also the " "name of a kind, or of the plural of a kind. (For instance, writing " @@ -261,7 +261,7 @@ two forms in any case. @ = *X = TABLE_HAS_ONLY_NAME; /* for recovery */ - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TableMisnamed), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TableMisnamed), "this isn't allowed as the name of a Table", "since a table is required either to have a number, or to be a table 'of' " "something (or both). For example: 'Table 5', 'Table of Blue Meanies', and " @@ -333,7 +333,7 @@ void Tables::create_table(parse_node *PN) { @ Changes to the lexer mean that this shouldn't happen, but just in case: @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), "this table does not strictly speaking start a paragraph", "and I'm afraid we need to speak strictly here. Even a comment coming before " "the start of the table is too much."); @@ -362,7 +362,7 @@ void Tables::create_table(parse_node *PN) { @ = if ((t->table_name_text)) { Problems::quote_wording_as_source(1, t->table_name_text); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TableNameAmbiguous)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TableNameAmbiguous)); Problems::issue_problem_segment( "The table name %1 will have to be disallowed as it is text which " "already has a meaning to Inform. For instance, creating the 'Table " @@ -414,7 +414,7 @@ number only, that must. Suppose that "Table 2 - Trees" already exists. Then: @ = if (existing_table_with_same_name == NULL) { Problems::quote_table(1, t); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TableNotContinuation)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TableNotContinuation)); Problems::issue_problem_segment( "It looks as if %1 is meant to be related to an existing table, " "but I can't find one if it is. %P" @@ -430,7 +430,7 @@ number only, that must. Suppose that "Table 2 - Trees" already exists. Then: Problems::quote_table(1, t); Problems::quote_table(2, existing_table_with_same_name); Problems::quote_wording(3, HW); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TableNameDuplicate)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TableNameDuplicate)); Problems::issue_problem_segment( "I can't create %1 because its name overlaps with one that already " "exists: %2. %P" @@ -497,7 +497,7 @@ node for each column. row_count++; } if ((row_count < 2) && (t->blank_rows == 0)) { - Problems::Issue::table_problem(_p_(PM_TableWithoutRows), + StandardProblems::table_problem(_p_(PM_TableWithoutRows), t, NULL, PN, "%1 has no rows."); return; } @@ -512,7 +512,7 @@ a node in the parse tree representing the column's use within this table. parse_node *overflow = NounPhrases::new_raw(CW); int limit = MAX_COLUMNS_PER_TABLE; Problems::quote_number(4, &limit); - Problems::Issue::table_problem(_p_(PM_TableTooManyColumns), + StandardProblems::table_problem(_p_(PM_TableTooManyColumns), t, NULL, overflow, "There are %4 columns in %1 already, and that's the absolute limit, " "so the column %3 can't be added."); @@ -535,7 +535,7 @@ a node in the parse tree representing the column's use within this table. int given_col = col_count + 1; /* i.e., counting from 1 rather than 0 */ Problems::quote_number(5, &(given_col)); Problems::quote_number(6, &(t->no_columns)); - Problems::Issue::table_problem(_p_(PM_TableRowFull), + StandardProblems::table_problem(_p_(PM_TableRowFull), t, NULL, cell, "In row %4 of the table %1, the entry %3 won't fit, because its row " "is already full. (This entry would be in column %5 and the table has " @@ -634,7 +634,7 @@ wants a row for each man, and the continuation wants a row for each woman. Problems::quote_table(2, old_t); Problems::quote_wording(3, old_t->blank_rows_for_each_text); Problems::quote_wording(4, t->blank_rows_for_each_text); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TableContinuationContradicts)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TableContinuationContradicts)); Problems::issue_problem_segment( "The table %1 says that it should have a blank row for each " "%4, but the original %2 already says it has a blank for each " @@ -695,7 +695,7 @@ used in continuation rows for columns not mentioned.) Problems::quote_table(2, old_t); if (missing == 1) Problems::quote_text(3, "a column"); else Problems::quote_text(3, "columns"); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TableContinuationAddsCols)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TableContinuationAddsCols)); Problems::issue_problem_segment( "The table %1 won't work as a continuation, because it contains " "%3 not found in the original %2."); @@ -720,7 +720,7 @@ be "wider" than the old one.) Problems::quote_table(2, old_t); if (missing == 1) Problems::quote_text(3, "a column"); else Problems::quote_text(3, "columns"); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TableReplacementMissesCols)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TableReplacementMissesCols)); Problems::issue_problem_segment( "The table %1 won't work as a replacement, because it's missing " "%3 found in the original %2."); @@ -744,7 +744,7 @@ columns and in the same order. current_sentence = t->table_created_at->source_table; Problems::quote_table(1, t); Problems::quote_table(2, old_t); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TableAmendmentMisfit)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TableAmendmentMisfit)); Problems::issue_problem_segment( "Columns in %1 do not exactly match the original %2. I can only " "make changes to rows in an existing table if the amended versions " @@ -900,7 +900,7 @@ us issue more contextual problem messages. Problems::quote_wording(5, Nouns::nominative(table_being_examined->columns[table_cell_col].column_identity->name)); Problems::quote_number(6, &table_cell_row); - Problems::Issue::table_problem(_p_(PM_NonconstantActionInTable), + StandardProblems::table_problem(_p_(PM_NonconstantActionInTable), table_being_examined, NULL, table_cell_node, "In %1, I'm reading the text %3 in column %4 (%5) of row %6, but this is " "an action involving a variable, that is, a value that might vary in play. " @@ -925,7 +925,7 @@ people -- it needs to be "yourself" instead, since "player" is a variable. Nouns::nominative(table_being_examined->columns[table_cell_col].column_identity->name)); Problems::quote_number(6, &table_cell_row); Problems::quote_subject(7, infs); - Problems::Issue::table_problem(_p_(PM_TablePlayerEntry), + StandardProblems::table_problem(_p_(PM_TablePlayerEntry), table_being_examined, NULL, table_cell_node, "In %1, the entry %3 in column %4 (%5) of row %6 is the name of a value " "which varies, not a constant, and can't be stored as a table entry. %P" @@ -937,7 +937,7 @@ people -- it needs to be "yourself" instead, since "player" is a variable. Problems::quote_wording(5, Nouns::nominative(table_being_examined->columns[table_cell_col].column_identity->name)); Problems::quote_number(6, &table_cell_row); - Problems::Issue::table_problem(_p_(PM_TableVariableEntry), + StandardProblems::table_problem(_p_(PM_TableVariableEntry), table_being_examined, NULL, table_cell_node, "In %1, the entry %3 in column %4 (%5) of row %6 is the name of a value " "which varies, not a constant, so it can't be stored as a table entry."); @@ -955,7 +955,7 @@ people -- it needs to be "yourself" instead, since "player" is a variable. Problems::quote_wording(5, Nouns::nominative(table_being_examined->columns[table_cell_col].column_identity->name)); Problems::quote_number(6, &table_cell_row); - Problems::Issue::table_problem(_p_(PM_TableUnknownEntry), + StandardProblems::table_problem(_p_(PM_TableUnknownEntry), table_being_examined, NULL, table_cell_node, "In %1, I'm reading the text %3 in column %4 (%5) of row %6, but I don't " "know what this means. %PThis should usually be a value, like a number " @@ -1024,7 +1024,7 @@ void Tables::stock_table_cell(table *t, parse_node *cell, int row_count, int col Problems::quote_wording(5, Nouns::nominative(table_being_examined->columns[table_cell_col].column_identity->name)); Problems::quote_number(6, &table_cell_row); - Problems::Issue::table_problem(_p_(PM_TableDescriptionEntry), + StandardProblems::table_problem(_p_(PM_TableDescriptionEntry), t, NULL, cell, "In %1, the entry %3 in column %4 (%5) of row %6 is a general description " "of things with no definite value, and can't be stored as a table entry."); @@ -1068,7 +1068,7 @@ void Tables::complete(void) { if (N >= 0) t->blank_rows = N; else { Problems::quote_wording(4, t->blank_rows_text); - Problems::Issue::table_problem(_p_(PM_TableUnknownBlanks), + StandardProblems::table_problem(_p_(PM_TableUnknownBlanks), t, NULL, current_sentence, "%1 asked to have '%4' extra blank rows, but that would " "only make sense for a literal number like '15' or a " @@ -1090,7 +1090,7 @@ void Tables::complete(void) { t->blank_rows += Instances::count(K); } else { Problems::quote_wording(4, t->blank_rows_for_each_text); - Problems::Issue::table_problem(_p_(PM_TableKindlessBlanks), + StandardProblems::table_problem(_p_(PM_TableKindlessBlanks), t, NULL, current_sentence, "%1 asked to have extra blank rows for each '%4', but that " "isn't a kind, so I can't see how many blank rows to make."); @@ -1269,7 +1269,7 @@ time to find a clear wording for: current_sentence = amendments->table_created_at->source_table; Problems::quote_table(1, main_table); Problems::quote_table(2, amendments); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TableAmendmentMismatch)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TableAmendmentMismatch)); Problems::issue_problem_segment( "I'm currently trying to amend rows in %1 according to the instructions " "in %2. To do that, I have to match each amendment row in turn, which " diff --git a/inform7/core-module/Chapter 2/Problems With Source Text.w b/inform7/core-module/Chapter 2/Problems With Source Text.w index 3a256317d..3915a225b 100644 --- a/inform7/core-module/Chapter 2/Problems With Source Text.w +++ b/inform7/core-module/Chapter 2/Problems With Source Text.w @@ -15,7 +15,7 @@ void SourceProblems::issue_problems_arising(inbuild_copy *C) { switch (CE->error_category) { case OPEN_FAILED_CE: Problems::quote_stream(1, Filenames::get_leafname(CE->details_file)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(Untestable)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(Untestable)); Problems::issue_problem_segment( "I can't open the file '%1' of source text. %P" "If you are using the 'Source' subfolder of Materials to " @@ -26,7 +26,7 @@ void SourceProblems::issue_problems_arising(inbuild_copy *C) { case EXT_MISWORDED_CE: Problems::quote_work(1, CE->copy->found_by->work); Problems::quote_stream(2, CE->details); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ExtMiswordedBeginsHere)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ExtMiswordedBeginsHere)); Problems::issue_problem_segment( "The extension %1, which your source text makes use of, seems to be " "damaged or incorrect: its identifying opening line is wrong. " @@ -36,7 +36,7 @@ void SourceProblems::issue_problems_arising(inbuild_copy *C) { case KIT_MISWORDED_CE: Problems::quote_work(1, CE->copy->found_by->work); Problems::quote_stream(2, CE->details); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(Untestable)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(Untestable)); Problems::issue_problem_segment( "The kit %1, which your source text makes use of, seems to be " "damaged or incorrect: its identifying opening line is wrong. " @@ -49,7 +49,7 @@ void SourceProblems::issue_problems_arising(inbuild_copy *C) { Problems::quote_work(1, CE->copy->found_by->work); Problems::quote_number(2, &max); Problems::quote_number(3, &overage); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ExtTitleTooLong)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ExtTitleTooLong)); Problems::issue_problem_segment( "The extension %1, which your source text makes use of, has a " "title which is too long, exceeding the maximum allowed " @@ -63,7 +63,7 @@ void SourceProblems::issue_problems_arising(inbuild_copy *C) { Problems::quote_work(1, CE->copy->found_by->work); Problems::quote_number(2, &max); Problems::quote_number(3, &overage); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ExtAuthorTooLong)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ExtAuthorTooLong)); Problems::issue_problem_segment( "The extension %1, which your source text makes use of, has an " "author name which is too long, exceeding the maximum allowed " @@ -74,14 +74,14 @@ void SourceProblems::issue_problems_arising(inbuild_copy *C) { case LEXER_CE: switch (CE->error_subcategory) { case STRING_TOO_LONG_LEXERERROR: - Problems::Issue::lexical_problem(Task::syntax_tree(), _p_(PM_TooMuchQuotedText), + StandardProblems::lexical_problem(Task::syntax_tree(), _p_(PM_TooMuchQuotedText), "Too much text in quotation marks", CE->details_word, "...\" The maximum length is very high, so this is more " "likely to be because a close quotation mark was " "forgotten."); break; case WORD_TOO_LONG_LEXERERROR: - Problems::Issue::lexical_problem(Task::syntax_tree(), _p_(PM_WordTooLong), + StandardProblems::lexical_problem(Task::syntax_tree(), _p_(PM_WordTooLong), "Word too long", CE->details_word, "(Individual words of unquoted text can run up to " "128 letters long, which ought to be plenty. The longest " @@ -96,7 +96,7 @@ void SourceProblems::issue_problems_arising(inbuild_copy *C) { "words are fine.)"); break; case I6_TOO_LONG_LEXERERROR: - Problems::Issue::lexical_problem(Task::syntax_tree(), _p_(Untestable), /* well, not at all conveniently */ + StandardProblems::lexical_problem(Task::syntax_tree(), _p_(Untestable), /* well, not at all conveniently */ "Verbatim Inform 6 extract too long", CE->details_word, "... -). The maximum length is quite high, so this " "may be because a '-)' was forgotten. Still, if " @@ -104,7 +104,7 @@ void SourceProblems::issue_problems_arising(inbuild_copy *C) { "using several verbatim inclusions in a row."); break; case STRING_NEVER_ENDS_LEXERERROR: - Problems::Issue::lexical_problem_S(Task::syntax_tree(), _p_(PM_UnendingQuote), + StandardProblems::lexical_problem_S(Task::syntax_tree(), _p_(PM_UnendingQuote), "Some source text ended in the middle of quoted text", CE->details, "This probably means that a quotation mark is missing " @@ -116,7 +116,7 @@ void SourceProblems::issue_problems_arising(inbuild_copy *C) { "me to lose track.)"); break; case COMMENT_NEVER_ENDS_LEXERERROR: - Problems::Issue::lexical_problem_S(Task::syntax_tree(), _p_(PM_UnendingComment), + StandardProblems::lexical_problem_S(Task::syntax_tree(), _p_(PM_UnendingComment), "Some source text ended in the middle of a comment", CE->details, "This probably means that a ']' is missing somewhere. " @@ -130,7 +130,7 @@ void SourceProblems::issue_problems_arising(inbuild_copy *C) { "the comment."); break; case I6_NEVER_ENDS_LEXERERROR: - Problems::Issue::lexical_problem_S(Task::syntax_tree(), _p_(PM_UnendingI6), + StandardProblems::lexical_problem_S(Task::syntax_tree(), _p_(PM_UnendingI6), "Some source text ended in the middle of a verbatim passage " "of Inform 6 code", CE->details, @@ -144,7 +144,7 @@ void SourceProblems::issue_problems_arising(inbuild_copy *C) { switch (CE->error_subcategory) { case UnexpectedSemicolon_SYNERROR: Problems::quote_source(1, NounPhrases::new_raw(CE->details_W)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_UnexpectedSemicolon)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_UnexpectedSemicolon)); Problems::issue_problem_segment( "The text %1 is followed by a semicolon ';', which only makes " "sense to me inside a rule or phrase (where there's a heading, " @@ -154,7 +154,7 @@ void SourceProblems::issue_problems_arising(inbuild_copy *C) { break; case ParaEndsInColon_SYNERROR: Problems::quote_source(1, NounPhrases::new_raw(CE->details_W)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ParaEndsInColon)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ParaEndsInColon)); Problems::issue_problem_segment( "The text %1 seems to end a paragraph with a colon. (Rule declarations " "can end a sentence with a colon, so maybe there's accidentally a " @@ -163,7 +163,7 @@ void SourceProblems::issue_problems_arising(inbuild_copy *C) { break; case SentenceEndsInColon_SYNERROR: Problems::quote_source(1, NounPhrases::new_raw(CE->details_W)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_SentenceEndsInColon)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_SentenceEndsInColon)); Problems::issue_problem_segment( "The text %1 seems to have a colon followed by a full stop, which is " "punctuation I don't understand."); @@ -171,7 +171,7 @@ void SourceProblems::issue_problems_arising(inbuild_copy *C) { break; case SentenceEndsInSemicolon_SYNERROR: Problems::quote_source(1, NounPhrases::new_raw(CE->details_W)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_SentenceEndsInSemicolon)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_SentenceEndsInSemicolon)); Problems::issue_problem_segment( "The text %1 seems to have a semicolon followed by a full stop, which is " "punctuation I don't understand."); @@ -179,7 +179,7 @@ void SourceProblems::issue_problems_arising(inbuild_copy *C) { break; case SemicolonAfterColon_SYNERROR: Problems::quote_source(1, NounPhrases::new_raw(CE->details_W)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_SemicolonAfterColon)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_SemicolonAfterColon)); Problems::issue_problem_segment( "The text %1 seems to have a semicolon following a colon, which is " "punctuation I don't understand."); @@ -187,7 +187,7 @@ void SourceProblems::issue_problems_arising(inbuild_copy *C) { break; case SemicolonAfterStop_SYNERROR: Problems::quote_source(1, NounPhrases::new_raw(CE->details_W)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_SemicolonAfterStop)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_SemicolonAfterStop)); Problems::issue_problem_segment( "The text %1 seems to have a semicolon following a full stop, which is " "punctuation I don't understand."); @@ -197,7 +197,7 @@ void SourceProblems::issue_problems_arising(inbuild_copy *C) { Problems::quote_source(1, NounPhrases::new_raw(CE->details_W)); Problems::quote_source(2, NounPhrases::new_raw(Wordings::up_to(CE->details_W, CE->details_N-1))); Problems::quote_source(3, NounPhrases::new_raw(Wordings::from(CE->details_W, CE->details_N))); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_HeadingOverLine)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_HeadingOverLine)); Problems::issue_problem_segment( "The text %1 seems to be a heading, but contains a " "line break, which is not allowed: so I am reading it " @@ -211,7 +211,7 @@ void SourceProblems::issue_problems_arising(inbuild_copy *C) { Problems::quote_source(1, NounPhrases::new_raw(CE->details_W)); Problems::quote_source(2, NounPhrases::new_raw(Wordings::new(Wordings::last_wn(CE->details_W)+1, CE->details_N-1))); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_HeadingStopsBeforeEndOfLine)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_HeadingStopsBeforeEndOfLine)); Problems::issue_problem_segment( "The text %1 seems to be a heading, but does not occupy " "the whole of its line of source text, which continues %2. " @@ -226,49 +226,49 @@ void SourceProblems::issue_problems_arising(inbuild_copy *C) { break; case ExtNoBeginsHere_SYNERROR: - Problems::Issue::extension_problem(_p_(PM_ExtNoBeginsHere), + StandardProblems::extension_problem(_p_(PM_ExtNoBeginsHere), ExtensionManager::from_copy(C), "has no 'begins here' sentence"); break; case ExtNoEndsHere_SYNERROR: - Problems::Issue::extension_problem(_p_(PM_ExtNoEndsHere), + StandardProblems::extension_problem(_p_(PM_ExtNoEndsHere), ExtensionManager::from_copy(C), "has no 'ends here' sentence"); break; case ExtSpuriouslyContinues_SYNERROR: - Problems::Issue::extension_problem(_p_(PM_ExtSpuriouslyContinues), + StandardProblems::extension_problem(_p_(PM_ExtSpuriouslyContinues), ExtensionManager::from_copy(C), "continues after the 'ends here' sentence"); break; case ExtMultipleEndsHere_SYNERROR: - Problems::Issue::extension_problem(_p_(PM_ExtMultipleEndsHere), + StandardProblems::extension_problem(_p_(PM_ExtMultipleEndsHere), ExtensionManager::from_copy(C), "has more than one 'ends here' sentence"); break; case ExtMultipleBeginsHere_SYNERROR: - Problems::Issue::extension_problem(_p_(PM_ExtMultipleBeginsHere), + StandardProblems::extension_problem(_p_(PM_ExtMultipleBeginsHere), ExtensionManager::from_copy(C), "has more than one 'begins here' sentence"); break; case ExtBeginsAfterEndsHere_SYNERROR: - Problems::Issue::extension_problem(_p_(PM_ExtBeginsAfterEndsHere), + StandardProblems::extension_problem(_p_(PM_ExtBeginsAfterEndsHere), ExtensionManager::from_copy(C), "has a further 'begins here' after an 'ends here'"); break; case ExtEndsWithoutBegins_SYNERROR: - Problems::Issue::extension_problem(_p_(BelievedImpossible), + StandardProblems::extension_problem(_p_(BelievedImpossible), ExtensionManager::from_copy(C), "has an 'ends here' with nothing having begun"); break; case BadTitleSentence_SYNERROR: current_sentence = CE->details_node; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadTitleSentence), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadTitleSentence), "the initial bibliographic sentence can only be a title in double-quotes", "possibly followed with 'by' and the name of the author."); break; case UnknownLanguageElement_SYNERROR: current_sentence = CE->details_node; - Problems::Issue::sentence_problem( + StandardProblems::sentence_problem( Task::syntax_tree(), _p_(PM_UnknownLanguageElement), "this heading contains a stipulation about the current " "Inform language definition which I can't understand", @@ -277,7 +277,7 @@ void SourceProblems::issue_problems_arising(inbuild_copy *C) { break; case UnknownVirtualMachine_SYNERROR: current_sentence = CE->details_node; - Problems::Issue::sentence_problem( + StandardProblems::sentence_problem( Task::syntax_tree(), _p_(PM_UnknownVirtualMachine), "this heading contains a stipulation about the Setting " "for story file format which I can't understand", @@ -286,7 +286,7 @@ void SourceProblems::issue_problems_arising(inbuild_copy *C) { break; case UseElementWithdrawn_SYNERROR: current_sentence = CE->details_node; - Problems::Issue::sentence_problem( + StandardProblems::sentence_problem( Task::syntax_tree(), _p_(PM_UseElementWithdrawn), "the ability to activate or deactivate compiler elements " "in source text has been withdrawn", @@ -294,7 +294,7 @@ void SourceProblems::issue_problems_arising(inbuild_copy *C) { break; case IncludeExtQuoted_SYNERROR: current_sentence = CE->details_node; - Problems::Issue::sentence_problem( + StandardProblems::sentence_problem( Task::syntax_tree(), _p_(PM_IncludeExtQuoted), "the name of an included extension should be given without double " "quotes in an Include sentence", @@ -304,7 +304,7 @@ void SourceProblems::issue_problems_arising(inbuild_copy *C) { case BogusExtension_SYNERROR: current_sentence = CE->details_node; Problems::quote_source(1, current_sentence); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BogusExtension)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BogusExtension)); Problems::issue_problem_segment( "I can't find the extension requested by: %1. %P" "You can get hold of extensions which people have made public at " @@ -316,7 +316,7 @@ void SourceProblems::issue_problems_arising(inbuild_copy *C) { current_sentence = CE->details_node; Problems::quote_source(1, current_sentence); Problems::quote_stream(2, CE->details); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ExtVersionTooLow)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ExtVersionTooLow)); Problems::issue_problem_segment( "I can't find the right version of the extension requested by %1 - " "I can only find %2. %P" @@ -327,7 +327,7 @@ void SourceProblems::issue_problems_arising(inbuild_copy *C) { break; case ExtVersionMalformed_SYNERROR: current_sentence = CE->details_node; - Problems::Issue::sentence_problem( + StandardProblems::sentence_problem( Task::syntax_tree(), _p_(PM_ExtVersionMalformed), "a version number must have the form N/DDDDDD", "as in the example '2/040426' for release 2 made on 26 April 2004. " @@ -338,7 +338,7 @@ void SourceProblems::issue_problems_arising(inbuild_copy *C) { current_sentence = CE->details_node; Problems::quote_source(1, current_sentence); Problems::quote_stream(2, CE->details); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ExtInadequateVM)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ExtInadequateVM)); Problems::issue_problem_segment( "You wrote %1: but my copy of that extension stipulates that it " "is '%2'. That means it can only be used with certain of " @@ -351,7 +351,7 @@ void SourceProblems::issue_problems_arising(inbuild_copy *C) { current_sentence = CE->details_node; Problems::quote_extension(1, ExtensionManager::from_copy(C)); Problems::quote_wording(2, CE->details_W); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ExtMisidentifiedEnds)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ExtMisidentifiedEnds)); Problems::issue_problem_segment( "The extension %1, which your source text makes use of, seems to be " "malformed: its 'begins here' sentence correctly identifies it, but " @@ -365,7 +365,7 @@ void SourceProblems::issue_problems_arising(inbuild_copy *C) { current_sentence = CE->details_node; Problems::quote_source(1, current_sentence); Problems::quote_extension_id(2, CE->details_work); - Problems::Issue::handmade_problem( + StandardProblems::handmade_problem( Task::syntax_tree(), _p_(PM_HeadingInPlaceOfUnincluded)); Problems::issue_problem_segment( "In the sentence %1, it looks as if you intend to replace a section " @@ -376,7 +376,7 @@ void SourceProblems::issue_problems_arising(inbuild_copy *C) { break; case UnequalHeadingInPlaceOf_SYNERROR: current_sentence = CE->details_node; - Problems::Issue::sentence_problem( + StandardProblems::sentence_problem( Task::syntax_tree(), _p_(PM_UnequalHeadingInPlaceOf), "these headings are not of the same level", "so it is not possible to make the replacement. (Level here means " @@ -389,7 +389,7 @@ void SourceProblems::issue_problems_arising(inbuild_copy *C) { Problems::quote_extension_id(2, CE->details_work); Problems::quote_source(3, CE->details_node2); Problems::quote_extension_id(4, CE->details_work2); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_HeadingInPlaceOfSubordinate)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_HeadingInPlaceOfSubordinate)); Problems::issue_problem_segment( "In the sentence %1, it looks as if you intend to replace a section " "of source text from the extension '%2', but that doesn't really make " @@ -403,7 +403,7 @@ void SourceProblems::issue_problems_arising(inbuild_copy *C) { Problems::quote_extension_id(2, CE->details_work); Problems::quote_wording(3, CE->details_W); Problems::quote_stream(4, CE->details); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_HeadingInPlaceOfUnknown)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_HeadingInPlaceOfUnknown)); Problems::issue_problem_segment( "In the sentence %1, it looks as if you intend to replace a section " "of source text from the extension '%2', but that extension does " diff --git a/inform7/core-module/Chapter 2/Supplementary Issues.w b/inform7/core-module/Chapter 2/Supplementary Issues.w index 6863957da..947baa7f7 100644 --- a/inform7/core-module/Chapter 2/Supplementary Issues.w +++ b/inform7/core-module/Chapter 2/Supplementary Issues.w @@ -1,4 +1,4 @@ -[Problems::Issue::] Supplementary Issues. +[StandardProblems::] Supplementary Issues. Some supplementary general sorts of problem message. @@ -7,11 +7,11 @@ As soon as we combine information from two sentences, we are at risk of a contradiction of some kind: = -void Problems::Issue::two_sentences_problem(SIGIL_ARGUMENTS, parse_node *other_sentence, +void StandardProblems::two_sentences_problem(SIGIL_ARGUMENTS, parse_node *other_sentence, char *message, char *explanation) { ACT_ON_SIGIL if (current_sentence == other_sentence) { - Problems::Issue::sentence_problem(Task::syntax_tree(), PASS_SIGIL, message, explanation); + StandardProblems::sentence_problem(Task::syntax_tree(), PASS_SIGIL, message, explanation); return; } Problems::quote_source(1, current_sentence); @@ -20,7 +20,7 @@ void Problems::Issue::two_sentences_problem(SIGIL_ARGUMENTS, parse_node *other_s Problems::quote_text(4, explanation); Problems::issue_problem_begin(Task::syntax_tree(), explanation); Problems::issue_problem_segment( - "You wrote %1, but in another sentence %2: %Sagain, %%%Lbut %%%3%|, %4"); + "You wrote %1, but in another sentence %2: %Sagain, %3.%Lbut %3, %4"); Problems::issue_problem_end(); } @@ -28,7 +28,7 @@ void Problems::Issue::two_sentences_problem(SIGIL_ARGUMENTS, parse_node *other_s parse tree, and concerning an instance: = -void Problems::Issue::contradiction_problem(SIGIL_ARGUMENTS, parse_node *A, parse_node *B, +void StandardProblems::contradiction_problem(SIGIL_ARGUMENTS, parse_node *A, parse_node *B, instance *I, char *message, char *explanation) { ACT_ON_SIGIL Problems::quote_source(1, A); @@ -41,11 +41,11 @@ void Problems::Issue::contradiction_problem(SIGIL_ARGUMENTS, parse_node *A, pars Problems::issue_problem_segment("You wrote %1, but in another sentence %2: "); else Problems::issue_problem_segment("You wrote %1: "); - Problems::issue_problem_segment("%Sagain, %%%3 %4%|, %5"); + Problems::issue_problem_segment("%Sagain, %3 %4.%L%3 %4, %5"); Problems::issue_problem_end(); } -void Problems::Issue::infs_contradiction_problem(SIGIL_ARGUMENTS, parse_node *A, parse_node *B, +void StandardProblems::infs_contradiction_problem(SIGIL_ARGUMENTS, parse_node *A, parse_node *B, inference_subject *infs, char *message, char *explanation) { ACT_ON_SIGIL Problems::quote_source(1, A); @@ -57,7 +57,7 @@ void Problems::Issue::infs_contradiction_problem(SIGIL_ARGUMENTS, parse_node *A, if (Wordings::eq(Node::get_text(A), Node::get_text(B)) == FALSE) Problems::issue_problem_segment("You wrote %1, but in another sentence %2: "); else Problems::issue_problem_segment("You wrote %1: "); - Problems::issue_problem_segment("%Sagain, %%%3 %4%|, %5"); + Problems::issue_problem_segment("%Sagain, %3 %4.%L%3 %4, %5"); Problems::issue_problem_end(); } @@ -67,7 +67,7 @@ for a table can be enormous: so we need something which can show which table we are in, yet still only cite a small part of it -- = -void Problems::Issue::table_problem(SIGIL_ARGUMENTS, table *t, table_column *tc, parse_node *data, +void StandardProblems::table_problem(SIGIL_ARGUMENTS, table *t, table_column *tc, parse_node *data, char *message) { ACT_ON_SIGIL current_sentence = t->headline_fragment; @@ -83,7 +83,7 @@ void Problems::Issue::table_problem(SIGIL_ARGUMENTS, table *t, table_column *tc, So this is where hopes are generically dashed about equations: = -void Problems::Issue::equation_problem(SIGIL_ARGUMENTS, equation *eqn, char *p, char *text) { +void StandardProblems::equation_problem(SIGIL_ARGUMENTS, equation *eqn, char *p, char *text) { ACT_ON_SIGIL Problems::quote_source(1, current_sentence); Problems::quote_wording(2, eqn->equation_text); @@ -94,7 +94,7 @@ void Problems::Issue::equation_problem(SIGIL_ARGUMENTS, equation *eqn, char *p, Problems::issue_problem_end(); } -void Problems::Issue::equation_problem_S(SIGIL_ARGUMENTS, equation *eqn, text_stream *p, char *text) { +void StandardProblems::equation_problem_S(SIGIL_ARGUMENTS, equation *eqn, text_stream *p, char *text) { ACT_ON_SIGIL Problems::quote_source(1, current_sentence); Problems::quote_wording(2, eqn->equation_text); @@ -105,7 +105,7 @@ void Problems::Issue::equation_problem_S(SIGIL_ARGUMENTS, equation *eqn, text_st Problems::issue_problem_end(); } -void Problems::Issue::equation_symbol_problem(SIGIL_ARGUMENTS, equation *eqn, wording W, char *text) { +void StandardProblems::equation_symbol_problem(SIGIL_ARGUMENTS, equation *eqn, wording W, char *text) { ACT_ON_SIGIL Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); @@ -119,7 +119,7 @@ void Problems::Issue::equation_symbol_problem(SIGIL_ARGUMENTS, equation *eqn, wo @h Inline definition problems. = -void Problems::Issue::inline_problem(SIGIL_ARGUMENTS, phrase *ph, text_stream *definition, +void StandardProblems::inline_problem(SIGIL_ARGUMENTS, phrase *ph, text_stream *definition, char *message) { ACT_ON_SIGIL Problems::quote_source(1, current_sentence); @@ -140,7 +140,7 @@ void Problems::Issue::inline_problem(SIGIL_ARGUMENTS, phrase *ph, text_stream *d Are mostly issued thus: = -void Problems::Issue::tcp_problem(SIGIL_ARGUMENTS, tc_problem_kit *tck, char *prototype) { +void StandardProblems::tcp_problem(SIGIL_ARGUMENTS, tc_problem_kit *tck, char *prototype) { if (tck->issue_error) { ACT_ON_SIGIL Problems::quote_source(1, current_sentence); @@ -162,18 +162,18 @@ from information in sentences far distant, so we can't always locate these problems at any particular sentence. = -void Problems::Issue::object_problem(SIGIL_ARGUMENTS, instance *I, +void StandardProblems::object_problem(SIGIL_ARGUMENTS, instance *I, char *message, char *explanation) { ACT_ON_SIGIL Problems::quote_object(1, I); Problems::quote_text(2, message); Problems::quote_text(3, explanation); Problems::issue_problem_begin(Task::syntax_tree(), explanation); - Problems::issue_problem_segment("The %1 %2%|, %3"); + Problems::issue_problem_segment("The %1 %2%S.%L, %3"); Problems::issue_problem_end(); } -void Problems::Issue::object_problem_at_sentence(SIGIL_ARGUMENTS, instance *I, +void StandardProblems::object_problem_at_sentence(SIGIL_ARGUMENTS, instance *I, char *message, char *explanation) { ACT_ON_SIGIL Problems::quote_source(1, current_sentence); @@ -181,11 +181,11 @@ void Problems::Issue::object_problem_at_sentence(SIGIL_ARGUMENTS, instance *I, Problems::quote_text(3, explanation); Problems::quote_object(4, I); Problems::issue_problem_begin(Task::syntax_tree(), explanation); - Problems::issue_problem_segment("You wrote %1, but the %4 %2%|, %3"); + Problems::issue_problem_segment("You wrote %1, but the %4 %2%S.%L, %3"); Problems::issue_problem_end(); } -void Problems::Issue::subject_problem_at_sentence(SIGIL_ARGUMENTS, inference_subject *infs, +void StandardProblems::subject_problem_at_sentence(SIGIL_ARGUMENTS, inference_subject *infs, char *message, char *explanation) { ACT_ON_SIGIL Problems::quote_source(1, current_sentence); @@ -193,7 +193,7 @@ void Problems::Issue::subject_problem_at_sentence(SIGIL_ARGUMENTS, inference_sub Problems::quote_text(3, explanation); Problems::quote_subject(4, infs); Problems::issue_problem_begin(Task::syntax_tree(), explanation); - Problems::issue_problem_segment("You wrote %1, but the %4 %2%|, %3"); + Problems::issue_problem_segment("You wrote %1, but the %4 %2%S.%L, %3"); Problems::issue_problem_end(); } @@ -203,7 +203,7 @@ more tact (and in particular, we don't assert very confidently that what we are dealing with is genuinely an object). = -void Problems::Issue::subject_creation_problem(SIGIL_ARGUMENTS, inference_subject *subj, +void StandardProblems::subject_creation_problem(SIGIL_ARGUMENTS, inference_subject *subj, char *message, char *explanation) { ACT_ON_SIGIL Problems::quote_subject(1, subj); @@ -214,12 +214,12 @@ void Problems::Issue::subject_creation_problem(SIGIL_ARGUMENTS, inference_subjec Problems::quote_source(4, NounPhrases::new_raw(W)); Problems::issue_problem_begin(Task::syntax_tree(), explanation); Problems::issue_problem_segment( - "I've made something called %4 but it %2%|, %3"); + "I've made something called %4 but it %2%S.%L, %3"); Problems::issue_problem_end(); } else { Problems::issue_problem_begin(Task::syntax_tree(), explanation); Problems::issue_problem_segment( - "I've made something called '%1' but it %2%|, %3"); + "I've made something called '%1' but it %2%S.%L, %3"); Problems::issue_problem_end(); } } @@ -231,7 +231,7 @@ are implied which necessarily make no sense, rather than merely contingently making no sense. = -void Problems::Issue::inference_problem(SIGIL_ARGUMENTS, inference_subject *infs, inference *inf, +void StandardProblems::inference_problem(SIGIL_ARGUMENTS, inference_subject *infs, inference *inf, char *message, char *explanation) { ACT_ON_SIGIL Problems::quote_subject(1, infs); @@ -241,7 +241,7 @@ void Problems::Issue::inference_problem(SIGIL_ARGUMENTS, inference_subject *infs Problems::quote_property(5, World::Inferences::get_property(inf)); Problems::issue_problem_begin(Task::syntax_tree(), explanation); Problems::issue_problem_segment( - "You wrote %2: but the property %5 for the %1 %3%|, %4"); + "You wrote %2: but the property %5 for the %1 %3%S.%L, %4"); Problems::issue_problem_end(); } @@ -250,13 +250,13 @@ Just occasionally there is a problem with the definition of a property in the abstract, rather than with the actual property of some specific object. = -void Problems::Issue::property_problem(SIGIL_ARGUMENTS, property *prn, char *message, char *explanation) { +void StandardProblems::property_problem(SIGIL_ARGUMENTS, property *prn, char *message, char *explanation) { ACT_ON_SIGIL Problems::quote_property(1, prn); Problems::quote_text(2, message); Problems::quote_text(3, explanation); Problems::issue_problem_begin(Task::syntax_tree(), explanation); - Problems::issue_problem_segment("The %1 %2%|, %3"); + Problems::issue_problem_segment("The %1 %2%S.%L, %3"); Problems::issue_problem_end(); } @@ -264,7 +264,7 @@ void Problems::Issue::property_problem(SIGIL_ARGUMENTS, property *prn, char *mes These are generated when the user tries to employ a malformed extension. = -void Problems::Issue::extension_problem(SIGIL_ARGUMENTS, inform_extension *E, char *message) { +void StandardProblems::extension_problem(SIGIL_ARGUMENTS, inform_extension *E, char *message) { ACT_ON_SIGIL Problems::quote_extension(1, E); Problems::quote_text(2, message); @@ -280,7 +280,7 @@ possible to pin down an exact place where the difficulty occurs, but sometimes not. = -void Problems::Issue::release_problem(SIGIL_ARGUMENTS, char *message, filename *name) { +void StandardProblems::release_problem(SIGIL_ARGUMENTS, char *message, filename *name) { ACT_ON_SIGIL Problems::quote_text(1, message); TEMPORARY_TEXT(fn); @@ -293,7 +293,7 @@ void Problems::Issue::release_problem(SIGIL_ARGUMENTS, char *message, filename * DISCARD_TEXT(fn); } -void Problems::Issue::release_problem_path(SIGIL_ARGUMENTS, char *message, pathname *path) { +void StandardProblems::release_problem_path(SIGIL_ARGUMENTS, char *message, pathname *path) { ACT_ON_SIGIL Problems::quote_text(1, message); TEMPORARY_TEXT(pn); @@ -306,7 +306,7 @@ void Problems::Issue::release_problem_path(SIGIL_ARGUMENTS, char *message, pathn DISCARD_TEXT(pn); } -void Problems::Issue::release_problem_at_sentence(SIGIL_ARGUMENTS, char *message, filename *name) { +void StandardProblems::release_problem_at_sentence(SIGIL_ARGUMENTS, char *message, filename *name) { ACT_ON_SIGIL Problems::quote_text(1, message); TEMPORARY_TEXT(fn); @@ -325,7 +325,7 @@ The map-maker used for the World index and also the EPS-file output has its own quaint syntax, and where there is syntax, there are error messages: = -void Problems::Issue::map_problem(SIGIL_ARGUMENTS, parse_node *q, char *message) { +void StandardProblems::map_problem(SIGIL_ARGUMENTS, parse_node *q, char *message) { ACT_ON_SIGIL Problems::quote_source(1, q); Problems::quote_text(2, message); @@ -334,7 +334,7 @@ void Problems::Issue::map_problem(SIGIL_ARGUMENTS, parse_node *q, char *message) Problems::issue_problem_end(); } -void Problems::Issue::map_problem_wanted_but(SIGIL_ARGUMENTS, parse_node *q, char *i_wanted_a, int vw1) { +void StandardProblems::map_problem_wanted_but(SIGIL_ARGUMENTS, parse_node *q, char *i_wanted_a, int vw1) { ACT_ON_SIGIL Problems::quote_source(1, q); Problems::quote_text(2, i_wanted_a); diff --git a/inform7/core-module/Chapter 2/Using Problems.w b/inform7/core-module/Chapter 2/Using Problems.w index 4e84b4f6d..c3e42225a 100644 --- a/inform7/core-module/Chapter 2/Using Problems.w +++ b/inform7/core-module/Chapter 2/Using Problems.w @@ -9,14 +9,14 @@ Interface to the Problems module. @ Inform tops and tails its output of problem messages, and it also prints non-problem messages when everything was fine. That all happens here: -@d PROBLEMS_INITIAL_REPORTER Problems::Using::start_problems_report -@d PROBLEMS_FINAL_REPORTER Problems::Using::final_report +@d START_PROBLEM_FILE_PROBLEMS_CALLBACK Problems::Using::start_problems_report +@d INFORMATIONAL_ADDENDA_PROBLEMS_CALLBACK Problems::Using::final_report = -void Problems::Using::start_problems_report(filename *F) { - if (STREAM_OPEN_TO_FILE(problems_file, F, UTF8_ENC) == FALSE) - Problems::Fatal::filename_related("Can't open problem log", F); - HTML::header(problems_file, I"Translating the Source", +void Problems::Using::start_problems_report(filename *F, text_stream *P) { + if (STREAM_OPEN_TO_FILE(P, F, UTF8_ENC) == FALSE) + Problems::fatal_on_file("Can't open problem log", F); + HTML::header(P, I"Translating the Source", Supervisor::file_from_installation(CSS_FOR_STANDARD_PAGES_IRES), Supervisor::file_from_installation(JAVASCRIPT_FOR_STANDARD_PAGES_IRES)); } @@ -25,12 +25,12 @@ void Problems::Using::final_report(int disaster_struck, int problems_count) { int total_words = 0; if (problem_count > 0) { - Problems::Buffer::redirect_problem_stream(problems_file); + ProblemBuffer::redirect_problem_stream(problems_file); Problems::issue_problem_begin(Task::syntax_tree(), "*"); if (disaster_struck) @ else @; Problems::issue_problem_end(); - Problems::Buffer::redirect_problem_stream(NULL); + ProblemBuffer::redirect_problem_stream(NULL); } else { int rooms = 0, things = 0; Problems::Using::html_outcome_image(problems_file, "ni_succeeded", "Succeeded"); @@ -102,7 +102,7 @@ might well not be running in the Inform application, but only on the command line -- deserves the truth. @ = - Problems::Buffer::redirect_problem_stream(problems_file); + ProblemBuffer::redirect_problem_stream(problems_file); text_stream *OUT = problems_file; HTML_OPEN("p"); Problems::issue_problem_begin(Task::syntax_tree(), "**"); @@ -115,7 +115,7 @@ command line -- deserves the truth. if (telemetry_recording) { Telemetry::ensure_telemetry_file(); - Problems::Buffer::redirect_problem_stream(telmy); + ProblemBuffer::redirect_problem_stream(telmy); Problems::issue_problem_begin(Task::syntax_tree(), "**"); Problems::issue_problem_segment( "The %5-word source text has successfully been translated " @@ -124,7 +124,7 @@ command line -- deserves the truth. Problems::issue_problem_end(); WRITE_TO(telmy, "\n"); } - Problems::Buffer::redirect_problem_stream(STDOUT); + ProblemBuffer::redirect_problem_stream(STDOUT); WRITE_TO(STDOUT, "\n"); Problems::issue_problem_begin(Task::syntax_tree(), "**"); Problems::issue_problem_segment( @@ -133,7 +133,7 @@ command line -- deserves the truth. "Inform 6 to complete compilation. There were %1 %2 and %3 %4."); Problems::issue_problem_end(); STREAM_FLUSH(STDOUT); - Problems::Buffer::redirect_problem_stream(NULL); + ProblemBuffer::redirect_problem_stream(NULL); ProgressBar::final_state_of_progress_bar(); text_stream *STATUS = ProgressBar::begin_outcome(); @@ -157,11 +157,11 @@ int outcome_image_style = SIDE_OUTCOME_IMAGE_STYLE; @ This callback function is called just as the //problems// module is about to issue its first problem of the run: -@d FIRST_PROBLEM_CALLBACK Problems::Using::html_outcome_failed +@d FIRST_PROBLEMS_CALLBACK Problems::Using::html_outcome_failed = void Problems::Using::html_outcome_failed(OUTPUT_STREAM) { - if (Problems::Issue::internal_errors_have_occurred()) + if (StandardProblems::internal_errors_have_occurred()) Problems::Using::html_outcome_image(problems_file, "ni_failed_badly", "Failed"); else Problems::Using::html_outcome_image(problems_file, "ni_failed", "Failed"); @@ -170,7 +170,7 @@ void Problems::Using::html_outcome_failed(OUTPUT_STREAM) { void Problems::Using::html_outcome_image(OUTPUT_STREAM, char *image, char *verdict) { char *vn = ""; int be_festive = TRUE; - if (Problems::Issue::internal_errors_have_occurred() == FALSE) be_festive = FALSE; + if (StandardProblems::internal_errors_have_occurred() == FALSE) be_festive = FALSE; if (be_festive) { switch (Time::feast()) { case CHRISTMAS_FEAST: vn = "_2"; break; @@ -178,7 +178,7 @@ void Problems::Using::html_outcome_image(OUTPUT_STREAM, char *image, char *verdi } if (vn[0]) outcome_image_style = CENTRED_OUTCOME_IMAGE_STYLE; } - Problems::Issue::issue_problems_banner(OUT, verdict); + StandardProblems::issue_problems_banner(OUT, verdict); switch (outcome_image_style) { case CENTRED_OUTCOME_IMAGE_STYLE: HTML_OPEN("p"); @@ -211,3 +211,77 @@ void Problems::Using::outcome_image_tail(OUTPUT_STREAM) { HTML::comment(OUT, I"FOOTNOTE"); } } + +@ This is a more elaborate form of the standard |StandardProblems::sentence_problem|, +used when an assertion sentence has gone wrong. Experience from the early +builds of the Public Beta showed that many people tried syntaxes which +Inform did not recognise, and which cause Inform to misread the primary +verb of the sentence. It would then issue a Problem -- because the sentence +would be peculiar -- but this problem report would itself be odd, and +make little sense to the user. So we look to see if the current sentence +is an assertion with a primary verb: and if it is, we hunt through it +for alternative verbs which might have been intended, and try to produce +a message which diagnoses the problem rather better. + += +void Problems::Using::assertion_problem(parse_node_tree *T, SIGIL_ARGUMENTS, + char *message, char *explanation) { + wording RTW = EMPTY_WORDING; /* "rather than" text */ + ACT_ON_SIGIL + if ((current_sentence == NULL) || (current_sentence->down == NULL) || + (Node::get_type(current_sentence->down) != VERB_NT)) { + LOG("(Assertion error reverting to sentence error.)\n"); + StandardProblems::sentence_problem(T, PASS_SIGIL, message, explanation); + return; + } + + LOG("(Assertion error: looking for alternative verbs in <%W>.)\n", + Node::get_text(current_sentence)); + wording AW = Wordings::trim_both_ends(Node::get_text(current_sentence)); + LOOP_THROUGH_WORDING(i, AW) + if ((i != Wordings::first_wn(Node::get_text(current_sentence->down))) && + (Word::unexpectedly_upper_case(i) == FALSE)) { + wording W = Wordings::from(Node::get_text(current_sentence), i); + int j = (W); + if (j > 0) RTW = Wordings::new(i, j); + } + Problems::quote_source(1, current_sentence); + Problems::quote_text(2, message); + Problems::quote_text(3, explanation); + Problems::issue_problem_begin(T, explanation); + Problems::issue_problem_segment("You wrote %1: %Sagain, %2.%Lbut %2, %3"); + if (Wordings::nonempty(RTW)) { + Problems::quote_wording(4, Node::get_text(current_sentence->down)); + Problems::quote_wording(5, RTW); + Problems::issue_problem_segment( /* see also PM_AmbiguousVerb */ + " %P(It may help to know that I am reading the primary verb here " + "as '%4', not '%5'.)"); + } + Problems::Using::diagnose_further(); + Problems::issue_problem_end(); +} + +void Problems::Using::diagnose_further(void) { + if (current_sentence == NULL) return; + if (Wordings::empty(Node::get_text(current_sentence))) return; + int sqc = 0; + LOOP_THROUGH_WORDING(i, Node::get_text(current_sentence)) + sqc += Word::singly_quoted(i); + if (sqc >= 2) + Problems::issue_problem_segment( + " %P(I notice what look like single quotation marks in this " + "sentence. If you meant to write some quoted text, it needs to " + "be in double quotes, \"like this\" and not 'like this'.)"); + + control_structure_phrase *csp = + ControlStructures::detect(Node::get_text(current_sentence)); + if (csp) + Problems::issue_problem_segment( + " %P(The way this sentence starts makes me think it might have been " + "intended as part of a rule rather than being a statement about the " + "the way things are at the beginning of play. For example, 'If the " + "player is in the Penalty Zone, say \"An alarm sounds.\" is not " + "allowed: it has to be put in the form of a rule showing Inform " + "what circumstances apply - for example 'Every turn: if the player is " + "in the Penalty Zone, say \"An alarm sounds.\")"); +} diff --git a/inform7/core-module/Chapter 20/Equations.w b/inform7/core-module/Chapter 20/Equations.w index ab8287eea..a77fe0cc2 100644 --- a/inform7/core-module/Chapter 20/Equations.w +++ b/inform7/core-module/Chapter 20/Equations.w @@ -193,7 +193,7 @@ We know that this begins with the word "equation", or we wouldn't be here @ = *X = 0; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_EquationMisnumbered), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_EquationMisnumbered), "the top line of this equation declaration seems not to be a " "legal equation number or name", "and should read something like 'Equation 6', or 'Equation - " @@ -239,7 +239,7 @@ could be referred to elsewhere in the text by any of three names: if (Wordings::nonempty(NA)) { if ((NA)) { Problems::quote_wording_as_source(1, NA); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_EquationMisnamed)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_EquationMisnamed)); Problems::issue_problem_segment( "The equation name %1 will have to be disallowed as it is text " "which already has a meaning to Inform. For instance, creating " @@ -326,7 +326,7 @@ int Equations::eqn_declare_symbols(equation *eqn) { for (equation_symbol *ev = eqn->symbol_list; ev; ev = ev->next) if (ev->var_kind == NULL) { if (ev->next == NULL) { - Problems::Issue::equation_symbol_problem(_p_(BelievedImpossible), + StandardProblems::equation_symbol_problem(_p_(BelievedImpossible), eqn, eqn->where_text, "each symbol in a equation has to be declared with a kind of " "value or else an actual value. So '...where N = 1701.' or " @@ -402,14 +402,14 @@ mass, too. @ = *X = EQW_IDENTIFIES_PROBLEM; if (!preform_lookahead_mode) - Problems::Issue::equation_symbol_problem(_p_(PM_EquationSymbolNonValue), + StandardProblems::equation_symbol_problem(_p_(PM_EquationSymbolNonValue), equation_being_declared, Wordings::one_word(R[1]), "this has neither a kind of value nor an actual value."); @ = *X = EQW_IDENTIFIES_PROBLEM; if (!preform_lookahead_mode) - Problems::Issue::equation_symbol_problem(_p_(PM_EquationSymbolEqualsKOV), + StandardProblems::equation_symbol_problem(_p_(PM_EquationSymbolEqualsKOV), equation_being_declared, Wordings::one_word(R[1]), "'is' should be used, not '=', for a kind of value rather " "than an actual value."); @@ -417,7 +417,7 @@ mass, too. @ = *X = -1; if (!preform_lookahead_mode) - Problems::Issue::equation_symbol_problem(_p_(PM_EquationSymbolMalformed), + StandardProblems::equation_symbol_problem(_p_(PM_EquationSymbolMalformed), equation_being_declared, W, "a symbol in a equation has to be a sequence of one to ten " "letters optionally followed by a number from 0 to 99, so " @@ -427,7 +427,7 @@ mass, too. @ = *X = -1; if (!preform_lookahead_mode) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_EquationSymbolMisdeclared), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_EquationSymbolMisdeclared), "the symbols here are not declared properly", "and should each be declared with a kind of value or else an " "actual value."); @@ -480,7 +480,7 @@ still using it in equations: if (X == EQW_IDENTIFIES_KIND) { K = XP; if (temp) { - Problems::Issue::equation_symbol_problem(_p_(PM_EquationSymbolVague), eqn, W, + StandardProblems::equation_symbol_problem(_p_(PM_EquationSymbolVague), eqn, W, "when an equation is named for use in a 'let' " "phrase, any variables listed under 'where...' have " "to be given definite values, not just vaguely said " @@ -494,7 +494,7 @@ still using it in equations: K = Specifications::to_kind(spec); } if ((K) && (Kinds::Behaviour::is_quasinumerical(K) == FALSE)) { - Problems::Issue::equation_symbol_problem(_p_(PM_EquationSymbolNonNumeric), eqn, W, + StandardProblems::equation_symbol_problem(_p_(PM_EquationSymbolNonNumeric), eqn, W, "this has a kind of value on which arithmetic cannot be done, " "so it can have no place in an equation."); return FALSE; @@ -508,7 +508,7 @@ of the symbols: for (equation_symbol *ev = eqn->symbol_list; ev; ev = ev->next) if (Wordings::match_cs(W, ev->name)) { if (Kinds::Compare::eq(K, ev->var_kind) == FALSE) { - Problems::Issue::equation_symbol_problem(_p_(PM_EquationSymbolBadSub), eqn, W, + StandardProblems::equation_symbol_problem(_p_(PM_EquationSymbolBadSub), eqn, W, "you're using 'where' to substitute something into this " "symbol which has the wrong kind of value."); } @@ -516,7 +516,7 @@ of the symbols: ev->var_const = spec; return TRUE; } - Problems::Issue::equation_symbol_problem(_p_(PM_EquationSymbolSpurious), eqn, W, + StandardProblems::equation_symbol_problem(_p_(PM_EquationSymbolSpurious), eqn, W, "when 'where' is used to supply values to plug into a " "named equation as part of a 'let' phrase, you can only " "supply values for symbols actually used in that equation. " @@ -764,7 +764,7 @@ equation_node *Equations::eqn_parse(equation *eqn) { @; equation_node *result = Equations::enode_sr_result(); if (bl != 0) { - Problems::Issue::equation_problem(_p_(BelievedImpossible), eqn, "", + StandardProblems::equation_problem(_p_(BelievedImpossible), eqn, "", "this seems to use brackets in a mismatched way, since there " "are different numbers of left and right brackets '(' and ')'."); return NULL; @@ -804,7 +804,7 @@ allow implicit multiplication.) @; } if (token == NULL) { - Problems::Issue::equation_problem_S(_p_(PM_EquationTokenUnrecognised), eqn, text_of_symbol, + StandardProblems::equation_problem_S(_p_(PM_EquationTokenUnrecognised), eqn, text_of_symbol, "the symbol '%3' is one that I don't recognise. It doesn't " "seem to be declared after the equation - for instance, " "by adding 'where %3 is a number'."); @@ -825,7 +825,7 @@ capacity; and so is the number 0 itself. @ = if ((p[i] == '0') && (Characters::isdigit(p[i+1]))) { - Problems::Issue::equation_problem(_p_(PM_EquationLeadingZero), eqn, "", + StandardProblems::equation_problem(_p_(PM_EquationLeadingZero), eqn, "", "a number in an equation isn't allowed to begin with a " "'0' digit, so an equation like 'M = 007+Q' is against the rules."); return NULL; @@ -840,7 +840,7 @@ capacity; and so is the number 0 itself. parse_node *spec = NULL; if ((NW)) spec = <>; else { - Problems::Issue::equation_problem(_p_(BelievedImpossible), eqn, "", + StandardProblems::equation_problem(_p_(BelievedImpossible), eqn, "", "there's a literal number in that equation which doesn't make " "sense to me."); return NULL; @@ -885,7 +885,7 @@ capacity; and so is the number 0 itself. default: { TEMPORARY_TEXT(symbol); PUT_TO(symbol, c); - Problems::Issue::equation_problem_S(_p_(PM_EquationOperatorUnrecognised), eqn, symbol, + StandardProblems::equation_problem_S(_p_(PM_EquationOperatorUnrecognised), eqn, symbol, "the symbol '%3' is one that I don't recognise. I was " "expecting an arithmetic sign, '+', '-', '*','/', or '^', " "or else '=' or a bracket '(' or ')'."); @@ -915,7 +915,7 @@ between; and in |log pi| we issue an |IMPLICIT_APPLICATION_OPERATION|. @; enode_count++; if (enode_count >= MAX_ENODES_IN_EXPRESSION - 2) { - Problems::Issue::equation_problem(_p_(PM_EquationTooComplex), eqn, "", + StandardProblems::equation_problem(_p_(PM_EquationTooComplex), eqn, "", "this is too long and complex an equation."); return NULL; } @@ -925,7 +925,7 @@ messages and recover well when an operator-precedence grammar fails to match in a parser like this, so we'll fall back on this: @ = - Problems::Issue::equation_problem(_p_(PM_EquationMispunctuated), eqn, "", + StandardProblems::equation_problem(_p_(PM_EquationMispunctuated), eqn, "", "this seems to be wrongly punctuated, and doesn't make sense as a " "mathematical formula."); return NULL; @@ -1201,13 +1201,13 @@ out first: we want the top node in the tree to be the unique |=| operator. int Equations::eqn_typecheck(equation *eqn) { switch (Equations::enode_count_equals(eqn->parsed_equation)) { case 0: - Problems::Issue::equation_problem(_p_(PM_EquationDoesntEquate), eqn, "", + StandardProblems::equation_problem(_p_(PM_EquationDoesntEquate), eqn, "", "this equation doesn't seem to contain an equals sign, and " "without '=' there is no equating anything with anything."); return FALSE; case 1: if (Equations::enode_is_equals(eqn->parsed_equation) == FALSE) { - Problems::Issue::equation_problem(_p_(PM_EquationEquatesBadly), eqn, "", + StandardProblems::equation_problem(_p_(PM_EquationEquatesBadly), eqn, "", "the equals sign '=' here seems to be buried inside the " "formula, not at the surface. For instance, 'F = ma' is " "fine, but 'F(m=a)' would not make sense - the '=' would " @@ -1216,7 +1216,7 @@ int Equations::eqn_typecheck(equation *eqn) { } break; default: - Problems::Issue::equation_problem(_p_(PM_EquationEquatesMultiply), eqn, "", + StandardProblems::equation_problem(_p_(PM_EquationEquatesMultiply), eqn, "", "this equation seems to contain more than one equals " "sign '='."); return FALSE; @@ -1307,7 +1307,7 @@ integers to reals. if (Kinds::Compare::eq(L, R) == FALSE) { result = FALSE; LOG("Tried to equate $u and $u\n", L, R); - Problems::Issue::equation_problem(_p_(PM_EquationIncomparable), eqn, "", + StandardProblems::equation_problem(_p_(PM_EquationIncomparable), eqn, "", "this equation tries to set two values equal which have " "different kinds from each other."); } @@ -1347,7 +1347,7 @@ we're unable to see what equations $h^n$ can appear in. kind *OPK = Kinds::FloatingPoint::underlying(tok->enode_operands[1]->gK_after); RK = Kinds::Dimensions::arithmetic_on_kinds(OPK, NULL, REALROOT_OPERATION); if (RK == NULL) { - Problems::Issue::equation_problem(_p_(PM_EquationCantRoot-G), eqn, "", + StandardProblems::equation_problem(_p_(PM_EquationCantRoot-G), eqn, "", "the square root function 'root' can only be used on quantities " "whose dimensions are themselves a square - for example, the " "root of the area 100 sq m makes sense (it's 10m), but the root " @@ -1379,7 +1379,7 @@ of dimensions; if $n=0$ then we have a dimensionless value, and choose n = power->rational_n; m = power->rational_m; if ((m > 1) && (real == FALSE)) { result = FALSE; - Problems::Issue::equation_problem(_p_(PM_EquationCantPower2-G), eqn, "", + StandardProblems::equation_problem(_p_(PM_EquationCantPower2-G), eqn, "", "except for the special cases of squaring and cubing, the '^' " "raise-to-power symbol can only be used to power a value using " "real rather than integer arithmetic."); @@ -1387,7 +1387,7 @@ of dimensions; if $n=0$ then we have a dimensionless value, and choose } else if ((Kinds::Compare::eq(Kinds::FloatingPoint::underlying(power->gK_after), K_number) == FALSE) || (power->eqn_type != CONSTANT_EQN)) { result = FALSE; - Problems::Issue::equation_problem(_p_(PM_EquationDimensionPower), eqn, "", + StandardProblems::equation_problem(_p_(PM_EquationDimensionPower), eqn, "", "the '^' raise-to-power symbol can only be used to raise a value " "with dimensions to a specific number. So 'mv^2' is fine, but not " "'mv^n' or 'mv^(1+n)'. (This is because I would need to work out what " @@ -1399,7 +1399,7 @@ of dimensions; if $n=0$ then we have a dimensionless value, and choose if (n >= 1) { kind *K = Kinds::Dimensions::to_rational_power(F, n, m); if (K == NULL) { - Problems::Issue::equation_problem(_p_(BelievedImpossible), eqn, "", + StandardProblems::equation_problem(_p_(BelievedImpossible), eqn, "", "this would involve taking a fractional power of an amount whose " "dimensions are not of that power form - for example, the square " "root of the area 100 sq m makes sense (it's 10m), but the square " @@ -1477,7 +1477,7 @@ section: Problems::quote_text(6, "taking the cube root of"); break; } - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); Problems::issue_problem_segment( "You wrote %1, but that equation seems to involve %6 %4, which is not " "good arithmetic."); @@ -1508,7 +1508,7 @@ section: Problems::quote_text(6, "combining"); Problems::quote_text(7, "with"); break; } - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_EquationBadArithmetic)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_EquationBadArithmetic)); Problems::issue_problem_segment( "You wrote %1, but that equation seems to involve " "%6 %4 %7 %5, which is not good arithmetic."); @@ -1610,7 +1610,7 @@ void Equations::emit_solution_inner(wording W, equation *eqn) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); Problems::quote_wording(3, eqn->equation_text); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_EquationBadTarget)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_EquationBadTarget)); Problems::issue_problem_segment( "In %1, you asked to let %2 be given by the equation '%3', " "but '%2' isn't a symbol in that equation."); @@ -1623,7 +1623,7 @@ void Equations::emit_solution_inner(wording W, equation *eqn) { Problems::quote_wording(2, W); Problems::quote_wording(3, eqn->equation_text); Problems::quote_spec(4, to_solve->var_const); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_EquationConstantTarget)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_EquationConstantTarget)); Problems::issue_problem_segment( "In %1, you asked to let %2 be given by the equation '%3', " "but '%2' isn't something which can vary freely in that equation - " @@ -1645,7 +1645,7 @@ potentially incorrect. Re-typechecking will recalculate these. Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); Problems::quote_wording(3, eqn->equation_text); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_EquationInsoluble)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_EquationInsoluble)); Problems::issue_problem_segment( "In %1, you asked to let %2 be given by the equation '%3', " "but I am unable to rearrange the equation in any simple way " @@ -1690,7 +1690,7 @@ need to exist as local variables in the current stack frame. Problems::quote_wording(2, W); Problems::quote_wording(3, eqn->equation_text); Problems::quote_wording(4, ev->name); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_EquationSymbolMissing)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_EquationSymbolMissing)); Problems::issue_problem_segment( "In %1, you asked to let %2 be given by the equation '%3', " "but I can't see what to use for '%4'. The usual idea is " @@ -1727,7 +1727,7 @@ casting between quasinumerical kinds, we'll have to return to this.) Problems::quote_wording(4, ev->name); Problems::quote_kind(5, K); Problems::quote_kind(6, ev->var_kind); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_EquationSymbolWrongKOV)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_EquationSymbolWrongKOV)); Problems::issue_problem_segment( "In %1, you asked to let %2 be given by the equation '%3', " "but in that equation '%4' is supposedly %6 - whereas right " @@ -1797,7 +1797,7 @@ void Equations::enode_compile_by_emission(equation *eqn, equation_node *tok) { void Equations::enode_compilation_error(equation *eqn, equation_node *tok) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, eqn->equation_text); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_HardIntegerRoot)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_HardIntegerRoot)); Problems::issue_problem_segment( "In %1, you asked me to solve the equation '%2', but that would have " "involved taking a tricky root of a whole number. Using real numbers " diff --git a/inform7/core-module/Chapter 21/Activities.w b/inform7/core-module/Chapter 21/Activities.w index ef1ac19b0..893bdf1f5 100644 --- a/inform7/core-module/Chapter 21/Activities.w +++ b/inform7/core-module/Chapter 21/Activities.w @@ -145,7 +145,7 @@ noun for it; for example, the "announcing activity". @ = *X = FALSE; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ActivityNoteUnknown), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ActivityNoteUnknown), "one of the notes about this activity makes no sense", "and should be either 'documented at SYMBOL' or 'future action'."); @@ -159,7 +159,7 @@ activity *Activities::new(kind *creation_kind, wording W) { if ((Kinds::Behaviour::definite(creation_kind) == FALSE) && (Kinds::Compare::eq(creation_kind, K_nil) == FALSE)) { LOG("I'm reading the kind as: $u\n", creation_kind); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ActivityIndefinite), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ActivityIndefinite), "this is an activity on a kind which isn't definite", "and doesn't tell me enough about what sort of value the activity " "should work on. For example, 'Divining is an activity on numbers' " @@ -177,7 +177,7 @@ activity *Activities::new(kind *creation_kind, wording W) { if (Kinds::Compare::eq(creation_kind, K_nil)) creation_kind = K_object; } else { if (Kinds::Compare::eq(creation_kind, K_nil) == FALSE) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ActivityMisnamed), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ActivityMisnamed), "the name of this activity implies that it acts on nothing", "which doesn't fit with what you say about it. For example, " "'Painting is an activity on brushes' isn't allowed because " @@ -200,7 +200,7 @@ activity *Activities::new(kind *creation_kind, wording W) { else spec = Specifications::new_UNKNOWN(av->name); if (!(Node::is(spec, UNKNOWN_NT)) && (!(Node::is(spec, PROPERTY_VALUE_NT)))) { LOG("%W means $P\n", av->name, spec); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadActivityName), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadActivityName), "this already has a meaning", "and so cannot be the name of a newly created activity."); } else { @@ -268,7 +268,7 @@ Any new activity variable name is vetted by being run through this: *X = NOT_APPLICABLE; Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ActivityVarAnd)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ActivityVarAnd)); Problems::issue_problem_segment( "You wrote %1, which I am reading as a request to make " "a new named variable for an activity - a value associated " @@ -288,7 +288,7 @@ void Activities::add_variable(activity *av, parse_node *cnode) { if (Node::get_type(cnode) == PROPER_NOUN_NT) { Problems::quote_source(1, current_sentence); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ActivityVariableNameless)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ActivityVariableNameless)); Problems::issue_problem_segment( "You wrote %1, which I am reading as a request to make " "a new named variable for an activity - a value associated " @@ -314,7 +314,7 @@ void Activities::add_variable(activity *av, parse_node *cnode) { } else { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(cnode->down)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ActivityVarOverspecific)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ActivityVarOverspecific)); Problems::issue_problem_segment( "You wrote %1, which I am reading as a request to make " "a new named variable for an activity - a value associated " @@ -332,7 +332,7 @@ void Activities::add_variable(activity *av, parse_node *cnode) { LOG("Offending SP: $T", spec); Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(cnode->down)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ActivityVarUnknownKOV)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ActivityVarUnknownKOV)); Problems::issue_problem_segment( "You wrote %1, but '%2' is not the name of a kind of " "value which I know (such as 'number' or 'text')."); @@ -342,7 +342,7 @@ void Activities::add_variable(activity *av, parse_node *cnode) { if (Kinds::Compare::eq(Specifications::to_kind(spec), K_value)) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(cnode->down)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ActivityVarValue)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ActivityVarValue)); Problems::issue_problem_segment( "You wrote %1, but saying that a variable is a 'value' " "does not give me a clear enough idea what it will hold. " diff --git a/inform7/core-module/Chapter 21/Focus and Outcome.w b/inform7/core-module/Chapter 21/Focus and Outcome.w index 671c41e2d..4e05d56eb 100644 --- a/inform7/core-module/Chapter 21/Focus and Outcome.w +++ b/inform7/core-module/Chapter 21/Focus and Outcome.w @@ -107,7 +107,7 @@ can be what rulebook does if it none of its rules cause an outcome. @ = if (outcomes_being_parsed->default_outcome_declared) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_DefaultOutcomeTwice), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DefaultOutcomeTwice), "the default outcome for this rulebook has already been declared", "and this is something which can only be done once."); } else { @@ -116,7 +116,7 @@ can be what rulebook does if it none of its rules cause an outcome. } @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadDefaultOutcome), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadDefaultOutcome), "the default outcome given for the rulebook isn't what I expected", "which would be one of 'default success', 'default failure' or " "'default no outcome'."); @@ -161,7 +161,7 @@ The following parses a declaration of named outcomes. For example: @ = *X = UNRECOGNISED_OUTCOME; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadOutcomeClarification), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadOutcomeClarification), "the bracketed clarification isn't what I expected", "which would be one of '(success)', '(failure)' or '(no outcome)'."); @@ -170,7 +170,7 @@ The following parses a declaration of named outcomes. For example: int def = FALSE; if (default_rbno_flag) { if (outcomes_being_parsed->default_named_outcome) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_DefaultNamedOutcomeTwice), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DefaultNamedOutcomeTwice), "at most one of the named outcomes from a rulebook " "can be the default", "and here we seem to have two."); @@ -178,7 +178,7 @@ The following parses a declaration of named outcomes. For example: } def = TRUE; if (outcomes_being_parsed->default_outcome_declared) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_DefaultOutcomeAlready), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DefaultOutcomeAlready), "the default outcome for this rulebook has already " "been declared", "and this is something which can only be done once."); @@ -196,7 +196,7 @@ The following parses a declaration of named outcomes. For example: last = ro; } if (dup) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_DuplicateOutcome), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DuplicateOutcome), "this duplicates a previous assignment of the same outcome", "and to the same rulebook."); } else { @@ -474,7 +474,7 @@ void Rulebooks::Outcomes::initialise_focus(focus *foc, kind *parameter_kind) { int parametrisation = PARAMETER_FOCUS; if (Kinds::Compare::eq(parameter_kind, K_action_name)) parametrisation = ACTION_FOCUS; else if (Kinds::Behaviour::definite(parameter_kind) == FALSE) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RulebookIndefinite), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RulebookIndefinite), "this is a rulebook for values of a kind which isn't definite", "and doesn't tell me enough about what sort of value the rulebook " "should work on. For example, 'The mystery rules are a number based " diff --git a/inform7/core-module/Chapter 21/Rule Bookings.w b/inform7/core-module/Chapter 21/Rule Bookings.w index 1b31b671e..b8d2f9324 100644 --- a/inform7/core-module/Chapter 21/Rule Bookings.w +++ b/inform7/core-module/Chapter 21/Rule Bookings.w @@ -159,7 +159,7 @@ void Rules::Bookings::place(ph_usage_data *phud, booking *br) { Phrases::Usage::log(phud); Problems::quote_source(1, current_sentence); Problems::quote_wording(2, PW); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_MultipleCCR)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_MultipleCCR)); Problems::issue_problem_segment( "You wrote %1, but the situation this refers to ('%2') is " "not a single action. Rules in the form of 'check', 'carry " diff --git a/inform7/core-module/Chapter 21/Rule Placement Sentences.w b/inform7/core-module/Chapter 21/Rule Placement Sentences.w index e66fbfccf..dc8932295 100644 --- a/inform7/core-module/Chapter 21/Rule Placement Sentences.w +++ b/inform7/core-module/Chapter 21/Rule Placement Sentences.w @@ -150,7 +150,7 @@ subject and object NPs. *X = FALSE; Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NoSuchRuleExists)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NoSuchRuleExists)); Problems::issue_problem_segment( "In %1, you gave '%2' where a rule was required."); Problems::issue_problem_end(); @@ -321,7 +321,7 @@ The subject noun phrase is an articled list, each entry of which must match: @ = *X = BAD_RULE_PLACEMENT; Problems::quote_source(1, current_sentence); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_UnspecifiedRulebookPlacement)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_UnspecifiedRulebookPlacement)); Problems::issue_problem_segment( "In %1, you didn't specify in which rulebook the rule was to " "be listed, only which existing rule it should go before or " @@ -334,7 +334,7 @@ The subject noun phrase is an articled list, each entry of which must match: @ = Problems::quote_source(1, current_sentence); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ImproperRulePlacement)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ImproperRulePlacement)); Problems::issue_problem_segment( "In %1, you used the special verb 'to be listed' - which specifies " "how rules are listed in rulebooks - in a way I didn't recognise. " @@ -345,7 +345,7 @@ The subject noun phrase is an articled list, each entry of which must match: @ = Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NoSuchRulebookPlacement)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NoSuchRulebookPlacement)); Problems::issue_problem_segment( "In %1, you gave '%2' where a rulebook was required."); Problems::issue_problem_end(); @@ -381,7 +381,7 @@ void Rules::Placement::place_in_rulebook(parse_node *p1, parse_node *p2, int sen if ((sense == FALSE) && ((new_rule_placement != MIDDLE_PLACEMENT) || (side != IN_SIDE))) { Problems::quote_source(1, current_sentence); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadRulePlacementNegation)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadRulePlacementNegation)); Problems::issue_problem_segment( "In %1, you used the special verb 'to be listed' - which specifies " "how rules are listed in rulebooks - in a way too complicated to " @@ -417,7 +417,7 @@ void Rules::Placement::place_in_rulebook(parse_node *p1, parse_node *p2, int sen Problems::quote_source(1, current_sentence); Problems::quote_wording(2, the_rulebook->primary_name); Problems::quote_wording(3, relative_to_which->name); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PlaceWithMissingRule)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PlaceWithMissingRule)); Problems::issue_problem_segment( "In %1, you talk about the position of the rule '%3' " "in the rulebook '%2', but in fact that rule isn't in this " diff --git a/inform7/core-module/Chapter 21/Rulebooks.w b/inform7/core-module/Chapter 21/Rulebooks.w index 79a3f93fa..f87475d8f 100644 --- a/inform7/core-module/Chapter 21/Rulebooks.w +++ b/inform7/core-module/Chapter 21/Rulebooks.w @@ -158,7 +158,7 @@ phrase definitions and timed events don't open the rulebook name. ... ==> 0 @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RulebookWithAt), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RulebookWithAt), "this would create a rulebook whose name begins with 'at'", "which is forbidden since it would lead to ambiguities in " "the way people write rules. A rule beginning with 'At' " @@ -168,7 +168,7 @@ phrase definitions and timed events don't open the rulebook name. "a rule inscrutable."); @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RulebookWithTo), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RulebookWithTo), "this would create a rulebook whose name begins with 'to'", "which is forbidden since it would lead to ambiguities in " "the way people write rules. A rule beginning with 'To' " @@ -178,7 +178,7 @@ phrase definitions and timed events don't open the rulebook name. "a rule inscrutable."); @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RulebookWithDefinition), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RulebookWithDefinition), "this would create a rulebook whose name begins with 'definition'", "which is forbidden since it would lead to ambiguities in " "the way people write rules. A rule beginning with 'Definition' " @@ -399,7 +399,7 @@ Any new rulebook variable name is vetted by being run through this: *X = NOT_APPLICABLE; Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RulebookVariableAnd)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RulebookVariableAnd)); Problems::issue_problem_segment( "You wrote %1, which I am reading as a request to make " "a new named variable for a rulebook - a value associated " @@ -412,7 +412,7 @@ Any new rulebook variable name is vetted by being run through this: void Rulebooks::add_variable(rulebook *rb, parse_node *cnode) { if (Node::get_type(cnode) != PROPERTYCALLED_NT) { Problems::quote_source(1, current_sentence); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RulebookVarUncalled)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RulebookVarUncalled)); Problems::issue_problem_segment( "You wrote %1, which I am reading as a request to make " "a new named variable for an rulebook - a value associated " @@ -435,7 +435,7 @@ void Rulebooks::add_variable(rulebook *rb, parse_node *cnode) { (Descriptions::is_qualified(spec))) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(cnode->down)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RulebookVariableTooSpecific)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RulebookVariableTooSpecific)); Problems::issue_problem_segment( "You wrote %1, which I am reading as a request to make " "a new named variable for a rulebook - a value associated " @@ -452,7 +452,7 @@ void Rulebooks::add_variable(rulebook *rb, parse_node *cnode) { LOG("Offending SP: $T", spec); Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(cnode->down)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RulebookVariableBadKind)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RulebookVariableBadKind)); Problems::issue_problem_segment( "You wrote %1, but '%2' is not the name of a kind of " "value which I know (such as 'number' or 'text')."); @@ -464,7 +464,7 @@ void Rulebooks::add_variable(rulebook *rb, parse_node *cnode) { if (K == NULL) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(cnode->down)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RulebookVariableKindless)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RulebookVariableKindless)); Problems::issue_problem_segment( "You wrote %1, but I was expecting to see a kind of value there, " "and '%2' isn't something I recognise as a kind."); @@ -475,7 +475,7 @@ void Rulebooks::add_variable(rulebook *rb, parse_node *cnode) { if (Kinds::Compare::eq(K, K_value)) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(cnode->down)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RulebookVariableVague)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RulebookVariableVague)); Problems::issue_problem_segment( "You wrote %1, but saying that a variable is a 'value' " "does not give me a clear enough idea what it will hold. " @@ -786,7 +786,7 @@ void Rulebooks::attach_rule(rulebook *rb, booking *the_new_rule, if (Rules::Bookings::get_rule(the_new_rule) == ref_rule) { if (side != INSTEAD_SIDE) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BeforeOrAfterSelf), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BeforeOrAfterSelf), "a rule can't be before or after itself", "so this makes no sense to me."); return; @@ -800,7 +800,7 @@ void Rulebooks::attach_rule(rulebook *rb, booking *the_new_rule, if (ph) { action_name *an = Phrases::Context::required_action(&(ph->runtime_context_data)); if ((an) && (PL::Actions::is_out_of_world(an))) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_OOWinIWRulebook), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_OOWinIWRulebook), "this rulebook has no effect on actions which happen out of world", "so I'm not going to let you file this rule in it. ('Check', " "'Carry out' and 'Report' work fine for out of world actions: " @@ -921,7 +921,7 @@ parses the object noun phrase with the following: @ = *X = NOT_APPLICABLE; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NonOutcomeProperty), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NonOutcomeProperty), "the only properties of a rulebook are its outcomes", "for the time being at least."); diff --git a/inform7/core-module/Chapter 21/Rules.w b/inform7/core-module/Chapter 21/Rules.w index c38c9f763..622daea2f 100644 --- a/inform7/core-module/Chapter 21/Rules.w +++ b/inform7/core-module/Chapter 21/Rules.w @@ -173,7 +173,7 @@ int Rules::vet_name(wording W) { if ((W)) { if (PM_RuleWithComma_issued_at != Wordings::first_wn(W)) { PM_RuleWithComma_issued_at = Wordings::first_wn(W); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RuleWithComma), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RuleWithComma), "a rule name is not allowed to contain punctuation, or " "to consist only of an article like 'a' or 'an', or to " "contain double-quoted text", @@ -304,7 +304,7 @@ int Rules::compile_constraint(applicability_condition *acl) { } else { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, acl->text_of_condition); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadRuleConstraint)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadRuleConstraint)); Problems::issue_problem_segment( "In %1, you placed a constraint '%2' on a rule, but this isn't " "a condition I can understand."); @@ -412,7 +412,7 @@ void Rules::set_kind_from(rule *R, rulebook *RB) { Problems::quote_kind(6, P2); Problems::quote_wording_as_source(7, R->kind_of_rule_set_from->primary_name); Problems::quote_wording_as_source(8, RB->primary_name); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RuleInIncompatibleRulebooks)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RuleInIncompatibleRulebooks)); Problems::issue_problem_segment( "You've asked to put the rule '%2' into the rulebook %8, " "which is based on %5 and produces %6; but it was originally " @@ -496,7 +496,7 @@ void Rules::check_placement_safety(void) { Problems::quote_wording(3, R->name); Problems::quote_kind(4, KR); Problems::quote_kind(5, KS); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RulesCantInterchange)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RulesCantInterchange)); Problems::issue_problem_segment( "In the sentence %1 you've asked to use the rule '%2' in " "place of '%3', but one is based on %4 whereas the other " @@ -922,7 +922,7 @@ void Rules::check_response_usages(void) { Problems::quote_stream(3, letter); if (c == 0) Problems::quote_text(4, "no lettered responses at all"); else Problems::quote_stream(4, offers); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NoSuchResponse)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NoSuchResponse)); Problems::issue_problem_segment( "You wrote %1, but the '%2' doesn't have a response " "lettered '%3'. (It has %4.)"); diff --git a/inform7/core-module/Chapter 22/Construction Sequence.w b/inform7/core-module/Chapter 22/Construction Sequence.w index be2ad459b..00c6aca8d 100644 --- a/inform7/core-module/Chapter 22/Construction Sequence.w +++ b/inform7/core-module/Chapter 22/Construction Sequence.w @@ -327,7 +327,7 @@ points", say). This is where we do it: (Phrases::TypeData::arithmetic_operation(ph) == -1)) { current_sentence = Phrases::declaration_node(ph); Problems::quote_source(1, current_sentence); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ReturnKindVague)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ReturnKindVague)); Problems::issue_problem_segment( "The declaration %1 tries to set up a phrase which decides a " "value which is too vaguely described. For example, 'To decide " @@ -344,7 +344,7 @@ points", say). This is where we do it: PUT_TO(var_letter, 'A'+k-1); Problems::quote_source(1, current_sentence); Problems::quote_stream(2, var_letter); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ReturnKindUndetermined)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ReturnKindUndetermined)); Problems::issue_problem_segment( "The declaration %1 tries to set up a phrase which decides a " "value which is too vaguely described, because it involves " @@ -362,7 +362,7 @@ points", say). This is where we do it: (Phrases::Usage::has_name_as_constant(&(ph->usage_data)))) { current_sentence = Phrases::declaration_node(ph); Problems::quote_source(1, current_sentence); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NamedInline)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NamedInline)); Problems::issue_problem_segment( "The declaration %1 tries to give a name to a phrase which is " "defined using inline Inform 6 code in (- markers -). Such " diff --git a/inform7/core-module/Chapter 22/Describing Phrase Type Data.w b/inform7/core-module/Chapter 22/Describing Phrase Type Data.w index 375804c95..896edc65f 100644 --- a/inform7/core-module/Chapter 22/Describing Phrase Type Data.w +++ b/inform7/core-module/Chapter 22/Describing Phrase Type Data.w @@ -404,7 +404,7 @@ To be honest my preferred fix would be to delete phrase options from the language altogether, but there we are; spilt milk. @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_SayWithPhraseOptions), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_SayWithPhraseOptions), "phrase options are not allowed for 'say' phrases", "because the commas would lead to ambiguous sentences, and because the " "content of a substitution is intended to be something conceptually simple " @@ -484,7 +484,7 @@ messages. Problems::quote_source(4, Prepositions::get_where_pu_created(prep)); Problems::quote_wording(2, W); Problems::quote_wording(3, Wordings::new(<>, <>)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_MasksRelation)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_MasksRelation)); Problems::issue_problem_segment( "I don't want you to define a phrase with the wording you've used in " "in %1 because it could be misunderstood. There is already a definition " @@ -539,7 +539,7 @@ haven't yet been parsed, so that we don't yet know it will be meaningful. *XP = K_number; Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_UnknownValueToDecide)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_UnknownValueToDecide)); Problems::issue_problem_segment( "The phrase you describe in %1 seems to be trying to decide a value, " "but '%2' is not a kind that I recognise. (I had expected something " @@ -566,7 +566,7 @@ wording Phrases::TypeData::Textual::phtd_parse_return_data(ph_type_data *phtd, w } else internal_error("to phrase without to"); if (Kinds::Compare::eq(phtd->return_kind, K_truth_state)) { if (no_truth_state_returns++ > 0) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TruthStateToDecide), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TruthStateToDecide), "phrases are not allowed to decide a truth state", "and should be defined with the form 'To decide if ...' rather than " "'To decide what truth state is ...'."); @@ -688,7 +688,7 @@ the hyphen, and this is sorely needed with complicated functional kinds. @ = *X = NOT_APPLICABLE; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TokenWithEmptyBrackets), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TokenWithEmptyBrackets), "nothing is between the opening bracket '(' and its matching close bracket ')'", "so I can't see what is meant to be the fixed text and what is meant to be " "changeable. The idea is to put brackets around whatever varies from one " @@ -696,7 +696,7 @@ the hyphen, and this is sorely needed with complicated functional kinds. @ = *X = NOT_APPLICABLE; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TokenWithoutCloseBracket), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TokenWithoutCloseBracket), "the opening bracket '(' has no matching close bracket ')'", "so I can't see what is meant to be the fixed text and what is meant to be " "changeable. The idea is to put brackets around whatever varies from one " @@ -704,7 +704,7 @@ the hyphen, and this is sorely needed with complicated functional kinds. @ = *X = NOT_APPLICABLE; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TokenWithoutOpenBracket), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TokenWithoutOpenBracket), "a close bracket ')' appears here with no matching open '('", "so I can't see what is meant to be the fixed text and what is meant to " "be changeable. The idea is to put brackets around whatever varies from " @@ -713,7 +713,7 @@ the hyphen, and this is sorely needed with complicated functional kinds. @ = *X = NOT_APPLICABLE; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TokenWithNestedBrackets), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TokenWithNestedBrackets), "the name of the token inside the brackets '(' and ')' and before the " "hyphen '-' itself contains another open bracket '('", "which is not allowed."); @@ -722,7 +722,7 @@ the hyphen, and this is sorely needed with complicated functional kinds. *X = NOT_APPLICABLE; Problems::quote_source(1, current_sentence); Problems::quote_wording(2, GET_RW(, 2)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadTypeIndication)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadTypeIndication)); Problems::issue_problem_segment( "In %1, the text '%2' after the hyphen should tell me what kind of value " "goes here (like 'a number', or 'a vehicle'), but it's not something I " @@ -732,7 +732,7 @@ the hyphen, and this is sorely needed with complicated functional kinds. @ = LOG("On %W\n", W); *X = NOT_APPLICABLE; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TokenMisunderstood), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TokenMisunderstood), "the brackets '(' and ')' here neither say that something varies but has " "a given type, nor specify a called name", "so I can't make sense of them. For a 'To...' phrase, brackets like this " @@ -780,7 +780,7 @@ void Phrases::TypeData::Textual::phtd_parse_word_sequence(ph_type_data *phtd, wo case FALSE: @; break; } if (phtd->no_words >= MAX_WORDS_PER_PHRASE) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PhraseTooLong), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PhraseTooLong), "this phrase has too many words", "and needs to be simplified."); return; @@ -823,7 +823,7 @@ void Phrases::TypeData::Textual::phtd_parse_word_sequence(ph_type_data *phtd, wo Problems::quote_wording(2, Node::get_text(spec)); int n = MAX_TOKENS_PER_PHRASE; Problems::quote_number(3, &n); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TooManyTokens)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TooManyTokens)); Problems::issue_problem_segment( "In %1, I ran out of tokens when I got up to '%2'. " "Phrases are only allowed %3 tokens, that is, they " @@ -841,7 +841,7 @@ void Phrases::TypeData::Textual::phtd_parse_word_sequence(ph_type_data *phtd, wo (phtd->as_inline.invoked_inline_not_as_call == FALSE)) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(spec)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NoninlineUsesNonvalues)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NoninlineUsesNonvalues)); Problems::issue_problem_segment( "In %1, the text '%2' after the hyphen should tell me what kind of " "value goes here (like 'a number', or 'a vehicle'), but this is not " @@ -859,7 +859,7 @@ void Phrases::TypeData::Textual::phtd_parse_word_sequence(ph_type_data *phtd, wo if (Calculus::Variables::number_free(prop) != 1) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(spec)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PhraseTokenQuantified)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PhraseTokenQuantified)); Problems::issue_problem_segment( "In %1, the text '%2' after the hyphen should tell me what kind of " "value goes here (like 'a number', or 'a vehicle'), but it has to " @@ -891,7 +891,7 @@ void Phrases::TypeData::Textual::phtd_parse_word_sequence(ph_type_data *phtd, wo } @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UndeclaredKindVariable), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UndeclaredKindVariable), "this phrase uses a kind variable which is not declared", "which is not allowed."); phtd->token_sequence[i].token_kind = @@ -965,7 +965,7 @@ produces the following problem, because the domain of K has been given twice. kind *dec = Kinds::get_variable_stipulation(K); if (dec) { if (declarations[N]) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_DoublyDeclaredKindVariable), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DoublyDeclaredKindVariable), "this phrase declares the same kind variable more than once", "and ought to declare each variable once each."); } diff --git a/inform7/core-module/Chapter 22/Phrase Options.w b/inform7/core-module/Chapter 22/Phrase Options.w index 19dc0f256..2b5783a51 100644 --- a/inform7/core-module/Chapter 22/Phrase Options.w +++ b/inform7/core-module/Chapter 22/Phrase Options.w @@ -147,7 +147,7 @@ void Phrases::Options::phod_add_phrase_option(ph_options_data *phod, wording W) LOGIF(PHRASE_CREATIONS, "Adding phrase option <%W>\n", W); if (phod->no_options_permitted >= MAX_OPTIONS_PER_PHRASE) { if (too_many_POs_error == FALSE) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TooManyPhraseOptions), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TooManyPhraseOptions), "a phrase is only allowed to have 16 different options", "so either some of these will need to go, or you may want to " "consider breaking up the phrase into simpler ones whose usage " @@ -225,7 +225,7 @@ this residue is zero. Problems::quote_wording(2, W); Problems::quote_phrase(3, ph); Problems::quote_wording(4, phod_being_parsed->options_declaration); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PhraseOptionsExclusive)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PhraseOptionsExclusive)); Problems::issue_problem_segment( "You wrote %1, supplying the options '%2' to the phrase '%3', but " "the options listed for this phrase ('%4') are mutually exclusive."); @@ -258,13 +258,13 @@ by "and": Problems::quote_phrase(3, ph_being_parsed); Problems::quote_wording(4, phod_being_parsed->options_declaration); if (phod_being_parsed->no_options_permitted > 1) { - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NotAPhraseOption)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NotAPhraseOption)); Problems::issue_problem_segment( "You wrote %1, but '%2' is not one of the options allowed on " "the end of the phrase '%3'. (The options allowed are: '%4'.)"); Problems::issue_problem_end(); } else { - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NotTheOnlyPhraseOption)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NotTheOnlyPhraseOption)); Problems::issue_problem_segment( "You wrote %1, but the only option allowed on the end of the " "phrase '%3' is '%4', so '%2' is not something I know how to " diff --git a/inform7/core-module/Chapter 22/Phrase Runtime Context Data.w b/inform7/core-module/Chapter 22/Phrase Runtime Context Data.w index f3f07a2df..6c36bb445 100644 --- a/inform7/core-module/Chapter 22/Phrase Runtime Context Data.w +++ b/inform7/core-module/Chapter 22/Phrase Runtime Context Data.w @@ -442,7 +442,7 @@ void Phrases::Context::compile_test_tail(phrase *ph, applicability_condition *ac if (avl) { Activities::emit_activity_list(avl); } else { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadWhenWhile), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadWhenWhile), "I don't understand the 'when/while' clause", "which should name activities or conditions."); Produce::val(Emit::tree(), K_truth_state, LITERAL_IVAL, 0); diff --git a/inform7/core-module/Chapter 22/Phrase Usage.w b/inform7/core-module/Chapter 22/Phrase Usage.w index 28975784c..f173af614 100644 --- a/inform7/core-module/Chapter 22/Phrase Usage.w +++ b/inform7/core-module/Chapter 22/Phrase Usage.w @@ -102,7 +102,7 @@ rule *Phrases::Usage::to_rule(ph_usage_data *phud, phrase *ph) { if ((ph_found) && (ph_found != ph)) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_DuplicateRuleName)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_DuplicateRuleName)); Problems::issue_problem_segment( "You wrote %1, but this would give a name ('%2') to a " "new rule which already belongs to an existing one."); @@ -151,31 +151,31 @@ just enough from the wording to tell what sort of rule/phrase is to follow. ... ==> RULE_IN_RULEBOOK_EFF; <> = FALSE @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NamelessRule), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NamelessRule), "there are many rules in Inform", "so you need to give a name: 'this is the abolish dancing rule', say, " "not just 'this is the rule'."); @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnarticledRule), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnarticledRule), "a rule must be given a definite name", "which begins with 'the', just to emphasise that it is the only one " "with this name: 'this is the promote dancing rule', say, not just " "'this is promote dancing rule'."); @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PluralisedRule), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PluralisedRule), "a rule must be given a definite name ending in 'rule' not 'rules'", "since the plural is only used for rulebooks, which can of course " "contain many rules at once."); @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BareTo), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BareTo), "'to' what? No name is given", "which means that this would not define a new phrase."); @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_DontCallPhrasesWithCalled), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DontCallPhrasesWithCalled), "phrases aren't named using 'called'", "and instead use 'this is...'. For example, 'To salute (called saluting)' " "isn't allowed, but 'To salute (this is saluting)' is."); @@ -288,7 +288,7 @@ ph_usage_data Phrases::Usage::new(wording W, int coarse_mode) { if (<>) @; if ((W)) { if ((coarse_mode) && (no_now_phrases++ == 1)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RedefinedNow), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RedefinedNow), "creating new variants on 'now' is not allowed", "because 'now' plays a special role in the language. " "It has a wide-ranging ability to make a condition " @@ -310,7 +310,7 @@ mode, we can get that value back again if we look it up by name. if (coarse_mode) { if ((NW)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PhraseNameDuplicated), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PhraseNameDuplicated), "that name for this new phrase is not allowed", "because it already has a meaning."); } @@ -325,7 +325,7 @@ mode, we can get that value back again if we look it up by name. if (ph) current_sentence = Phrases::declaration_node(ph); Problems::quote_source(1, NounPhrases::new_raw(Nouns::nominative(cphr->name))); Problems::quote_wording(2, Nouns::nominative(cphr->name)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NamedGeneric)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NamedGeneric)); Problems::issue_problem_segment( "I can't allow %1, because the phrase it gives a name to " "is generic, that is, it has a kind which is too vague. " @@ -455,7 +455,7 @@ of the stem, so we have to be very careful: @ = Problems::quote_source(1, current_sentence); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadRulePreambleWhen)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadRulePreambleWhen)); Problems::issue_problem_segment( "The punctuation makes me think %1 should be a definition " "of a phrase or a rule, but it doesn't begin as it should, " @@ -477,7 +477,7 @@ of the stem, so we have to be very careful: Problems::issue_problem_end(); @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadRulePreamble), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadRulePreamble), "the punctuation here ':' makes me think this should be a definition " "of a phrase and it doesn't begin as it should", "with either 'To' (e.g. 'To flood the riverplain:'), 'Definition:', " @@ -490,7 +490,7 @@ of the stem, so we have to be very careful: @ = if ((parsed_rm.article_used == DEF_ART) && (parsed_rm.placement_requested == MIDDLE_PLACEMENT)) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RuleWithDefiniteArticle), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RuleWithDefiniteArticle), "a rulebook can contain any number of rules", "so (e.g.) 'the before rule: ...' is disallowed; you should " "write 'a before rule: ...' instead."); @@ -753,7 +753,7 @@ parser, recording how it most recently failed. } @ = - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_APWithDisjunction)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_APWithDisjunction)); Problems::issue_problem_segment( "You wrote %1, which seems to introduce a rule, but the " "circumstances ('%2') seem to be too general for me to " @@ -768,7 +768,7 @@ parser, recording how it most recently failed. Problems::issue_problem_end(); @ = - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_APWithNoParticiple)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_APWithNoParticiple)); Problems::issue_problem_segment( "You wrote %1, which seems to introduce a rule taking effect " "only '%2'. But this does not look like an action, since " @@ -778,7 +778,7 @@ parser, recording how it most recently failed. Problems::issue_problem_end(); @ = - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_APWithImmiscible)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_APWithImmiscible)); Problems::issue_problem_segment( "You wrote %1, which seems to introduce a rule taking effect " "only '%2'. But this is a combination of actions which cannot " @@ -791,7 +791,7 @@ parser, recording how it most recently failed. Problems::issue_problem_end(); @ = - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_APWithBadWhen)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_APWithBadWhen)); wording Q = phud->rule_parameter; int diagnosis = 0; if ((Q)) { @@ -831,7 +831,7 @@ parser, recording how it most recently failed. Problems::quote_text(3, "The part after 'when' (or 'while') was fine, but the earlier words"); else Problems::quote_text(3, "But that"); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_APUnknown)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_APUnknown)); Problems::issue_problem_segment( "You wrote %1, which seems to introduce a rule taking effect only if the " "action is '%2'. %3 did not make sense as a description of an action."); @@ -918,14 +918,14 @@ is used to choose a problem message if the value makes no sense. ... ==> @ @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_WhenThePlay), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_WhenThePlay), "there's no scene called 'the play'", "so I think you need to remove 'the' - Inform has two " "special rulebooks, 'When play begins' and 'When play ends', " "and I think you probably mean to refer to one of those."); @ = - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadParameter)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadParameter)); Problems::issue_problem_segment( "You wrote %1, but the description of the thing(s) to which the rule " "applies ('%2') did not make sense. This is %3 based rulebook, so " @@ -942,7 +942,7 @@ but the action isn't one we recognise. @ = - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NonActionInPresenceOf)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NonActionInPresenceOf)); Problems::issue_problem_segment( "You wrote %1, but 'in the presence of...' is a clause which can " "only be used to talk about an action: so, for instance, 'waiting " @@ -956,7 +956,7 @@ but the action isn't one we recognise. Problems::issue_problem_end(); @ = - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NonActionIn)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NonActionIn)); Problems::issue_problem_segment( "You wrote %1, but 'in...' used in this way should really belong " "to an action: for instance, 'Before waiting in the Library'. " diff --git a/inform7/core-module/Chapter 22/Phrases.w b/inform7/core-module/Chapter 22/Phrases.w index 4c0a25f2e..88386006c 100644 --- a/inform7/core-module/Chapter 22/Phrases.w +++ b/inform7/core-module/Chapter 22/Phrases.w @@ -244,7 +244,7 @@ of it: new_ph->ph_documentation_symbol = documentation_W; @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_Undefined), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_Undefined), "there doesn't seem to be any definition here", "so I can't see what this rule or phrase would do."); @@ -252,7 +252,7 @@ of it: @ = LOG("Inline definition: <%s>\n", inline_defn); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_InlineTooLong), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_InlineTooLong), "the inline definition of this 'to...' phrase is too long", "using a quantity of Inform 6 code which exceeds the fairly small limit " "allowed. You will need either to write the phrase definition in Inform 7, " @@ -260,7 +260,7 @@ of it: inline_defn[MAX_INLINE_DEFN_LENGTH-1] = 0; @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_InlineRule), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_InlineRule), "only 'to...' phrases can be given inline Inform 6 definitions", "and in particular rules and adjective definitions can't."); @@ -282,7 +282,7 @@ what number is...", for instance. @ = *X = DONT_KNOW_MOR; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TailAfterInline), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TailAfterInline), "some unexpected text appears after the tail of an inline definition", "placed within '(-' and '-)' markers to indicate that it is written in " "Inform 6. Here, there seems to be something extra after the '-)'."); @@ -410,13 +410,13 @@ void Phrases::invoke_to_begin(void) { if (ph->to_begin) { n++; if (n > 1) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(...), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(...), "there seem to be multiple 'to begin' phrases", "and in Basic mode, Inform expects to see exactly one of " "these, specifying where execution should begin."); } else { if (Phrases::compiled_inline(ph)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(...), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(...), "the 'to begin' phrase seems to be defined inline", "which in Basic mode is not allowed."); } else { @@ -431,7 +431,7 @@ void Phrases::invoke_to_begin(void) { } } if (n == 0) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(...), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(...), "there seems not to be a 'to begin' phrase", "and in Basic mode, Inform expects to see exactly one of " "these, specifying where execution should begin."); diff --git a/inform7/core-module/Chapter 22/Timed Phrases.w b/inform7/core-module/Chapter 22/Timed Phrases.w index ba0933f78..e587b449d 100644 --- a/inform7/core-module/Chapter 22/Timed Phrases.w +++ b/inform7/core-module/Chapter 22/Timed Phrases.w @@ -95,7 +95,7 @@ void Phrases::Timed::check_for_unused(void) { if (Phrases::Usage::get_timing_of_event(&(ph->usage_data)) == NO_FIXED_TIME) { if (ph->usage_data.uses_as_event == NULL) { current_sentence = ph->declaration_node; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnusedTimedEvent), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnusedTimedEvent), "this sets up a timed event which is never used", "since you never use any of the phrases which could cause it. " "(A timed event is just a name, and it needs other instructions " diff --git a/inform7/core-module/Chapter 22/To Phrases.w b/inform7/core-module/Chapter 22/To Phrases.w index 8ed1609fc..754eb759f 100644 --- a/inform7/core-module/Chapter 22/To Phrases.w +++ b/inform7/core-module/Chapter 22/To Phrases.w @@ -70,7 +70,7 @@ int Routines::ToPhrases::compare(phrase *ph1, phrase *ph2) { if (r == CONFLICTED_PH) { Problems::quote_source(1, Phrases::declaration_node(ph1)); Problems::quote_source(2, Phrases::declaration_node(ph2)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ConflictedReturnKinds)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ConflictedReturnKinds)); Problems::issue_problem_segment( "The two phrase definitions %1 and %2 make the same wording " "produce two different kinds of value, which is not allowed."); @@ -188,7 +188,7 @@ list is a list of. The result would be: @ = Problems::quote_source(1, Phrases::declaration_node(ph)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_UndeterminedKind)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_UndeterminedKind)); if (Wordings::empty(W)) { Problems::issue_problem_segment( "The phrase %1 needs to be used in such a way that I know " @@ -224,7 +224,7 @@ inter_name *Routines::ToPhrases::make_iname(phrase *ph, kind *req_kind) { current_sentence = Phrases::declaration_node(ph); Problems::quote_source(1, current_sentence); Problems::quote_phrase(2, ph); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PhraseNamedI6Failed)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PhraseNamedI6Failed)); Problems::issue_problem_segment( "You wrote %1, defining the phrase '%2' with a piece of Inform 6 " "code, but also giving it a name as a function to be used in an " diff --git a/inform7/core-module/Chapter 23/Adjectival Definitions.w b/inform7/core-module/Chapter 23/Adjectival Definitions.w index cc21319c2..12954fbfe 100644 --- a/inform7/core-module/Chapter 23/Adjectival Definitions.w +++ b/inform7/core-module/Chapter 23/Adjectival Definitions.w @@ -132,7 +132,7 @@ is defined by routine or not. @ = if ((p->next == NULL) || (Node::get_type(p->next) != RULE_NT)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), "don't leave me in suspense", "write a definition after 'Definition:'!"); return; @@ -154,7 +154,7 @@ is defined by routine or not. if ((the_format == DEFINED_IN_SOME_WAY_NOT_YET_KNOWN) || ((the_format == DEFINED_PHRASALLY) && (q->down == NULL))) { LOG("Definition tree (%d):\n$T\n", the_format, q); - Problems::Issue::definition_problem(Task::syntax_tree(), _p_(PM_DefinitionWithoutCondition), + StandardProblems::definition_problem(Task::syntax_tree(), _p_(PM_DefinitionWithoutCondition), q, "a definition must take the form 'Definition: a ... is ... if/unless " "...' or else 'Definition: a ... is ...: ...'", "but I can't make this fit either shape."); @@ -163,7 +163,7 @@ is defined by routine or not. if ((Wordings::mismatched_brackets(AW)) || ((Wordings::nonempty(NW)) && (Wordings::mismatched_brackets(NW)))) { LOG("Definition tree:\n$T\n", p); - Problems::Issue::definition_problem(Task::syntax_tree(), _p_(PM_BracketedAdjective), + StandardProblems::definition_problem(Task::syntax_tree(), _p_(PM_BracketedAdjective), q, "this definition seems to involve unexpected brackets in the name of " "the adjective being defined", "so I think I must be misreading it."); @@ -189,7 +189,7 @@ offer the new adjective around and see if anybody claims it. = int Phrases::Adjectives::vet_name(wording W) { if (

(W)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ArticleAsAdjective), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ArticleAsAdjective), "a defined adjective cannot consist only of an article such as " "'a' or 'the'", "since this will lead to parsing ambiguities."); @@ -199,7 +199,7 @@ int Phrases::Adjectives::vet_name(wording W) { if (problem_count == 0) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_AdjectivePunctuated)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_AdjectivePunctuated)); Problems::issue_problem_segment( "The sentence %1 seems to create an adjective with the name " "'%2', but adjectives have to be contain only unpunctuated " diff --git a/inform7/core-module/Chapter 23/Adjectives by Condition.w b/inform7/core-module/Chapter 23/Adjectives by Condition.w index 260b02913..078c95f09 100644 --- a/inform7/core-module/Chapter 23/Adjectives by Condition.w +++ b/inform7/core-module/Chapter 23/Adjectives by Condition.w @@ -39,7 +39,7 @@ int Phrases::Condition::ADJ_compile(definition *def, int T, if ((spec == NULL) || (Dash::validate_conditional_clause(spec) == FALSE)) { LOG("Error on: %W = $T", def->condition_to_match, spec); - Problems::Issue::definition_problem(Task::syntax_tree(), _p_(PM_DefinitionBadCondition), + StandardProblems::definition_problem(Task::syntax_tree(), _p_(PM_DefinitionBadCondition), def->node, "that condition makes no sense to me", "although the preamble to the definition was properly " diff --git a/inform7/core-module/Chapter 24/Chronology.w b/inform7/core-module/Chapter 24/Chronology.w index 31042aadd..c56516a55 100644 --- a/inform7/core-module/Chapter 24/Chronology.w +++ b/inform7/core-module/Chapter 24/Chronology.w @@ -50,7 +50,7 @@ void Chronology::compile_past_action_pattern(value_holster *VH, time_period dura LOGIF(TIME_PERIODS, "Chronology::compile_past_action_pattern on: $A\nat: $t\n", &ap, &duration); if (PL::Actions::Patterns::makes_callings(&ap)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PTAPMakesCallings), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PTAPMakesCallings), "a description of an action cannot both refer to past history " "and also use '(called ...)'", "because that would require Inform in general to remember " @@ -187,7 +187,7 @@ void Chronology::compile_past_tense_condition(value_holster *VH, parse_node *spe if (Node::is(spec, TEST_VALUE_NT)) ap = Rvalues::to_action_pattern(spec->down); if ((ap) && (duration.tense != IS_TENSE)) { if ((duration.units == TIMES_UNIT) && (duration.length >= 2)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NoMoreRonNewcombMoment), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NoMoreRonNewcombMoment), "a condition like 'we have X', where X is an action, has either " "happened for one spell or never happened at all", "so it can't make sense to ask if it has happened two or more " @@ -244,7 +244,7 @@ void Chronology::compile_past_tense_condition(value_holster *VH, parse_node *spe } if (no_past_tenses >= 1024) { /* limit imposed by the Z-machine implementation */ - Problems::Issue::limit_problem(Task::syntax_tree(), _p_(Untestable), /* well, not conveniently */ + StandardProblems::limit_problem(Task::syntax_tree(), _p_(Untestable), /* well, not conveniently */ "conditions written in the past tense", 1024); return; } @@ -322,7 +322,7 @@ void Chronology::past_actions_i6_routines(void) { if ((LocalVariables::are_we_using_table_lookup()) && (once_only)) { once_only = FALSE; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PastTableLookup), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PastTableLookup), "it's not safe to look up table entries in a way referring " "to past history", "because it leads to dangerous ambiguities. For instance, " @@ -531,7 +531,7 @@ void Chronology::past_tenses_i6_escape(void) { END_COMPILATION_MODE; if ((LocalVariables::are_we_using_table_lookup()) && (once_only)) { once_only = FALSE; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PastTableEntries), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PastTableEntries), "it's not safe to look up table entries in a way referring " "to past history", "because it leads to dangerous ambiguities. For instance, " @@ -647,7 +647,7 @@ a file stream, thus allowing rewinding: LOGIF(TIME_PERIODS, "Number %d: proposition $D\n", ptc->allocation_id, Specifications::to_proposition(spec)); if (Calculus::Propositions::contains_callings(Specifications::to_proposition(spec))) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PastCallings), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PastCallings), "it's not safe to use '(called ...)' in a way referring " "to past history", "because this would make a temporary value to hold the " diff --git a/inform7/core-module/Chapter 24/Local Variables.w b/inform7/core-module/Chapter 24/Local Variables.w index dadc3f105..447d8c73e 100644 --- a/inform7/core-module/Chapter 24/Local Variables.w +++ b/inform7/core-module/Chapter 24/Local Variables.w @@ -198,7 +198,7 @@ local_variable *LocalVariables::add_to_locals_slate(locals_slate *slate, int pur @ = Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_CalledThe)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_CalledThe)); Problems::issue_problem_segment( "In %1, you seem to be giving a temporary value a pretty " "odd name - '%2', which I won't allow because it would lead to too " @@ -764,7 +764,7 @@ name or a description. *X = 0; *XP = NULL; if (!(Wordings::eq(PM_CalledWithDash_wording, W))) { PM_CalledWithDash_wording = W; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CalledWithDash), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CalledWithDash), "a '(called ...)' name is not allowed to include a hyphen", "since this would look misleadingly like a declaration of kind of value it has."); } @@ -779,7 +779,7 @@ name or a description. Problems::quote_text(3, "a kind"); else Problems::quote_kind_of(3, already); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_CalledOverloaded)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_CalledOverloaded)); Problems::issue_problem_segment( "In %1, it looks as if '%2' is going to be a temporary name which something " "will be called. But I can't allow that, because it already has a meaning " @@ -901,7 +901,7 @@ int LocalVariables::protected(local_variable *lvar) { if ((lvar->lv_purpose == LET_VALUE_LV) && (lvar->protected)) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, lvar->varname); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ProtectedFromLet)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ProtectedFromLet)); Problems::issue_problem_segment( "In %1, it looks as if you want to use 'let' to change the value of " "the temporary variable '%2'. Ordinarily that would be fine, but it's " @@ -997,7 +997,7 @@ local_variable *callings_in_condition[MAX_CALLINGS_IN_MATCH]; void LocalVariables::add_calling_to_condition(local_variable *lvar) { if (current_session_number < 0) internal_error("no PM session"); if (callings_in_condition_sp + 1 == MAX_CALLINGS_IN_MATCH) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), /* or very hard, anyway */ + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), /* or very hard, anyway */ "that makes too complicated a condition to test", "with all of those clauses involving 'called' values."); else { diff --git a/inform7/core-module/Chapter 25/Compile Invocations Inline.w b/inform7/core-module/Chapter 25/Compile Invocations Inline.w index 551a976c0..9d80a4dd0 100644 --- a/inform7/core-module/Chapter 25/Compile Invocations Inline.w +++ b/inform7/core-module/Chapter 25/Compile Invocations Inline.w @@ -218,7 +218,7 @@ charlatans" and what they "deserve". I'm a better person now. *X = PROBLEM_INSUB; Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadInlineExpansion)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadInlineExpansion)); Problems::issue_problem_segment( "You wrote %1, but when I looked that phrase up I found that its inline " "definition included the bracing {%2}. Text written in braces like this, " @@ -292,7 +292,7 @@ the presence of annotations can change what we do. Problems::quote_source(1, current_sentence); if (nlv) Problems::quote_wording(2, nlv->name); else Problems::quote_spec(2, supplied); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NotAnLvalue)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NotAnLvalue)); Problems::issue_problem_segment( "You wrote %1, but that seems to mean changing '%2', which " "is a constant and can't be altered."); @@ -381,7 +381,7 @@ its own when kind variables are in play. @ = Problems::quote_source(1, current_sentence); Problems::quote_kind(2, K); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NoNaturalDefault2)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NoNaturalDefault2)); Problems::issue_problem_segment( "To achieve %1, we'd need to be able to store a default value of " "the kind '%2', but there's no natural choice for this."); @@ -441,7 +441,7 @@ proposition. return; @ = - Problems::Issue::inline_problem(_p_(PM_InlineNew), ph, sche->owner->parent_schema->converted_from, + StandardProblems::inline_problem(_p_(PM_InlineNew), ph, sche->owner->parent_schema->converted_from, "I don't know any kind called '%4'."); @h Typographic commands. @@ -460,7 +460,7 @@ character: @ = Problems::quote_source(1, current_sentence); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BackspaceWithdrawn)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BackspaceWithdrawn)); Problems::issue_problem_segment( "I attempted to compile %1 using its inline definition, " "but this contained the invalid annotation '{backspace}', " @@ -662,7 +662,7 @@ having this annotation seems the smaller of the two warts. if (Rvalues::is_CONSTANT_of_kind(supplied, K_text) == FALSE) { Problems::quote_source(1, current_sentence); Problems::quote_spec(2, supplied); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_Misboxed)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_Misboxed)); Problems::issue_problem_segment( "I attempted to compile %1, but the text '%2' supplied to be a " "boxed quotation wasn't a constant piece of text in double-quotes. " @@ -742,14 +742,14 @@ the problem messages are phrased differently if something goes wrong. Problems::quote_source(1, current_sentence); Problems::quote_kind_of(2, supplied); if (returning_from_rule) { - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RuleNotAllowedOutcome)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RuleNotAllowedOutcome)); Problems::issue_problem_segment( "You wrote %1 as something to be a successful outcome of a rule, which " "has the kind %2; but this is not a rule which is allowed to have a value " "as its outcome."); Problems::issue_problem_end(); } else { - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RedundantReturnKOV)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RedundantReturnKOV)); Problems::issue_problem_segment( "You wrote %1 as the outcome of a phrase, %2, but in the definition of " "something which was not a phrase to decide a value."); @@ -761,13 +761,13 @@ the problem messages are phrased differently if something goes wrong. Problems::quote_kind(2, kind_supplied); Problems::quote_kind(3, kind_needed); if (returning_from_rule) { - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RuleOutcomeWrongKind)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RuleOutcomeWrongKind)); Problems::issue_problem_segment( "You wrote %1 as the outcome of a rule which produces a value, but this " "was the wrong kind of value: %2 rather than %3."); Problems::issue_problem_end(); } else { - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ReturnWrongKind)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ReturnWrongKind)); Problems::issue_problem_segment( "You wrote %1 as the outcome of a phrase to decide a value, but this was " "the wrong kind of value: %2 rather than %3."); @@ -874,7 +874,7 @@ rule), and also makes a note for indexing purposes. } else { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(supplied)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NonconstantEvent)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NonconstantEvent)); Problems::issue_problem_segment( "You wrote %1, but '%2' isn't the name of any timed event that " "I know of. (These need to be set up in a special way, like so - " @@ -887,7 +887,7 @@ rule), and also makes a note for indexing purposes. @ = Problems::quote_source(1, current_sentence); Problems::quote_stream(2, sche->command); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadInlineTag)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadInlineTag)); Problems::issue_problem_segment( "I attempted to compile %1 using its inline definition, " "but this contained the invalid annotation '%2'."); @@ -1076,7 +1076,7 @@ default values when created, so they are always typesafe anyway. if (rv == FALSE) { Problems::quote_source(1, current_sentence); Problems::quote_kind(2, K); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NoNaturalDefault)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NoNaturalDefault)); Problems::issue_problem_segment( "To achieve %1, we'd need to be able to store a default value of " "the kind '%2', but there's no natural choice for this."); @@ -1165,7 +1165,7 @@ of the variable {-my:1} to S. if ((to == NULL) || (from == NULL)) { Problems::quote_stream(4, sche->operand); Problems::quote_stream(5, sche->operand2); - Problems::Issue::inline_problem(_p_(PM_InlineCopy), ph, sche->owner->parent_schema->converted_from, + StandardProblems::inline_problem(_p_(PM_InlineCopy), ph, sche->owner->parent_schema->converted_from, "The command to {-copy:...}, which asks to copy '%5' into '%4', has " "gone wrong: I couldn't work those out."); return; @@ -1190,7 +1190,7 @@ story title). if (Kinds::Behaviour::is_quasinumerical(K1) == FALSE) { Problems::quote_source(1, current_sentence); Problems::quote_kind(2, K1); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_CantIncrementKind)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_CantIncrementKind)); Problems::issue_problem_segment( "To achieve %1, we'd need to be able to add or subtract 1 from " "a value of the kind '%2', but there's no good way to do this."); @@ -1228,7 +1228,7 @@ variable.) if ((to_test == NULL) || (to_match == NULL)) { Problems::quote_stream(4, sche->operand); Problems::quote_stream(5, sche->operand2); - Problems::Issue::inline_problem(_p_(PM_InlineMatchesDescription), ph, sche->owner->parent_schema->converted_from, + StandardProblems::inline_problem(_p_(PM_InlineMatchesDescription), ph, sche->owner->parent_schema->converted_from, "The command {-matches-description:...}, which asks to test whether " "'%5' is a valid description for '%4', has gone wrong: I couldn't " "work those out."); @@ -1248,7 +1248,7 @@ variable matches the given description. if ((to_test == NULL) || (to_match == NULL)) { Problems::quote_stream(4, sche->operand); Problems::quote_stream(5, sche->operand2); - Problems::Issue::inline_problem(_p_(PM_InlineNowMatchesDescription), + StandardProblems::inline_problem(_p_(PM_InlineNowMatchesDescription), ph, sche->owner->parent_schema->converted_from, "The command {-now-matches-description:...}, which asks to change " "'%4' so that '%5' becomes a valid description of it, has gone " @@ -1430,7 +1430,7 @@ the "group... together" phrases. } else if (sche->inline_subcommand == articled_ISINSC) { inter_name *iname = ListTogether::new(TRUE); Produce::val_iname(Emit::tree(), K_value, iname); - } else Problems::Issue::inline_problem(_p_(PM_InlineListTogether), + } else StandardProblems::inline_problem(_p_(PM_InlineListTogether), ph, sche->owner->parent_schema->converted_from, "The only legal forms here are {-list-together:articled} and " "{-list-together:unarticled}."); @@ -1441,7 +1441,7 @@ mathematical definitions in the Standard Rules. @ = Problems::quote_source(1, current_sentence); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RescaleWithdrawn)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RescaleWithdrawn)); Problems::issue_problem_segment( "I attempted to compile %1 using its inline definition, " "but this contained the invalid annotation '{-rescale:...}', " @@ -1489,7 +1489,7 @@ has the inline definition: Calculus::Deferrals::emit_extremal_of_S(tokens->args[0], sche->extremal_property, sche->extremal_property_sign); } else - Problems::Issue::inline_problem(_p_(PM_InlineExtremal), + StandardProblems::inline_problem(_p_(PM_InlineExtremal), ph, sche->owner->parent_schema->converted_from, "In the '{-primitive-definition:extremal...}' command, there " "should be a '<' or '>' sign then the name of a property."); @@ -1518,7 +1518,7 @@ has the inline definition: } else { Problems::quote_stream(4, sche->operand); - Problems::Issue::inline_problem(_p_(PM_InlinePrimitive), ph, sche->owner->parent_schema->converted_from, + StandardProblems::inline_problem(_p_(PM_InlinePrimitive), ph, sche->owner->parent_schema->converted_from, "I don't know any primitive definition called '%4'."); } return; @@ -1529,7 +1529,7 @@ has the inline definition: kind *X = NULL, *Y = NULL; if (Kinds::get_construct(fn_kind) != CON_phrase) { Problems::quote_spec(4, fn); - Problems::Issue::inline_problem(_p_(PM_InlineFunctionApplication), + StandardProblems::inline_problem(_p_(PM_InlineFunctionApplication), ph, sche->owner->parent_schema->converted_from, "A function application only makes sense if the first token, " "'%4', is a phrase: here it isn't."); @@ -1561,7 +1561,7 @@ has the inline definition: Equations::emit_solution(Node::get_text(tokens->args[0]), Rvalues::to_equation(tokens->args[1])); } else { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_SolvedNameless), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_SolvedNameless), "only specific named equations can be solved", "not equations arrived at by further calculations or choices. (Sorry: " "but there would be no safe way to determine when an equation could " @@ -1570,7 +1570,7 @@ has the inline definition: @ = Problems::quote_stream(4, sche->operand); - Problems::Issue::inline_problem(_p_(PM_InlineNoSuch), ph, sche->owner->parent_schema->converted_from, + StandardProblems::inline_problem(_p_(PM_InlineNoSuch), ph, sche->owner->parent_schema->converted_from, "I don't know any local variable called '%4'."); @h Parsing the invocation operands. @@ -1692,7 +1692,7 @@ void Invocations::Inline::compile_I7_expression_from_text_inner(value_holster *V adjectival_phrase *aph = Adjectives::parse(LW); if (aph) { if (Adjectives::Meanings::write_adjective_test_routine(VH, aph)) return; - Problems::Issue::unlocated_problem(Task::syntax_tree(), _p_(BelievedImpossible), + StandardProblems::unlocated_problem(Task::syntax_tree(), _p_(BelievedImpossible), "You tried to use '(+' and '+)' to expand to the Inform 6 routine " "address of an adjective, but it was an adjective with no meaning."); return; diff --git a/inform7/core-module/Chapter 25/Compile Invocations.w b/inform7/core-module/Chapter 25/Compile Invocations.w index e822d0d24..ae2cd59af 100644 --- a/inform7/core-module/Chapter 25/Compile Invocations.w +++ b/inform7/core-module/Chapter 25/Compile Invocations.w @@ -130,7 +130,7 @@ since it isn't a phrase to decide anything. This is where that's checked: Phrases::TypeData::describe_manner_of_return(manner_expected, &(phrase_being_compiled->type_data), &K)); if (K) Problems::quote_kind(4, K); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_WrongEndToPhrase)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_WrongEndToPhrase)); if (K) Problems::issue_problem_segment( "The line %1 seems to be a way that the phrase you're defining can come " diff --git a/inform7/core-module/Chapter 25/Compile Phrases.w b/inform7/core-module/Chapter 25/Compile Phrases.w index b1bf708b1..4b844f9c0 100644 --- a/inform7/core-module/Chapter 25/Compile Phrases.w +++ b/inform7/core-module/Chapter 25/Compile Phrases.w @@ -101,7 +101,7 @@ to us, so we end our routine with code which certainly performs a return. if (K) { if (Kinds::RunTime::emit_default_value_as_val(K, EMPTY_WORDING, "value decided by this phrase") != TRUE) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_DefaultDecideFails), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DefaultDecideFails), "it's not possible to decide such a value", "so this can't be allowed."); Produce::val(Emit::tree(), K_number, LITERAL_IVAL, 0); @@ -251,7 +251,7 @@ henceforth to be true, so we simply compile empty code in that case. Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(cs)); if (Node::is(cs, TEST_VALUE_NT)) { - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadNow1)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadNow1)); Problems::issue_problem_segment( "You wrote %1, but although '%2' is a condition which it is legal " "to test with 'if', 'when', and so forth, it is not something I " @@ -260,14 +260,14 @@ henceforth to be true, so we simply compile empty code in that case. "need to adjust those circumstances."); Problems::issue_problem_end(); } else if (Node::is(cs, LOGICAL_AND_NT)) { - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadNow2)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadNow2)); Problems::issue_problem_segment( "You wrote %1, but 'now' does not work with the condition '%2' " "because it can only make one wish come true at a time: so it " "doesn't like the 'and'. Try rewriting as two 'now's in a row?"); Problems::issue_problem_end(); } else { - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadNow3)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadNow3)); Problems::issue_problem_segment( "You wrote %1, but '%2' isn't the sort of condition which can be " "made to be true, in the way that 'the ball is on the table' can be " @@ -279,7 +279,7 @@ henceforth to be true, so we simply compile empty code in that case. LOG("$T\n", current_sentence); Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(cs)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(...)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(...)); Problems::issue_problem_segment( "You wrote %1, but '%2' isn't a condition, so I can't see how to " "make it true from here on."); @@ -288,7 +288,7 @@ henceforth to be true, so we simply compile empty code in that case. @ = Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(cs)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(...)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(...)); Problems::issue_problem_segment( "You wrote %1, but '%2' isn't an action, so I can't see how to try it."); Problems::issue_problem_end(); @@ -302,7 +302,7 @@ henceforth to be true, so we simply compile empty code in that case. (ram != RULE_NOT_IN_RULEBOOK_EFF)) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(to_compile)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_MisplacedRulebookOutcome2)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_MisplacedRulebookOutcome2)); Problems::issue_problem_segment( "You wrote %1, but this is a rulebook outcome which can only be used " "within rulebooks which recognise it. You've used it in a definition " @@ -315,7 +315,7 @@ henceforth to be true, so we simply compile empty code in that case. Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(to_compile)); Problems::quote_wording(3, rb->primary_name); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_MisplacedRulebookOutcome)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_MisplacedRulebookOutcome)); Problems::issue_problem_segment( "You wrote %1, but this is a rulebook outcome which can only be used " "within rulebooks which recognise it. You've used it in a rule which " @@ -402,7 +402,7 @@ henceforth to be true, so we simply compile empty code in that case. if ((Node::get_kind_of_value(case_spec) == NULL) && (I == NULL)) { Problems::quote_source(1, current_sentence); Problems::quote_kind(2, switch_kind); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_CaseValueNonConstant)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_CaseValueNonConstant)); Problems::issue_problem_segment( "The case %1 is required to be a constant value, rather than " "something which has different values at different times: " @@ -413,7 +413,7 @@ henceforth to be true, so we simply compile empty code in that case. Problems::quote_source(1, current_sentence); Problems::quote_kind(2, case_kind); Problems::quote_kind(3, switch_kind); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_CaseValueMismatch)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_CaseValueMismatch)); Problems::issue_problem_segment( "The case %1 has the wrong kind of value for the possibilities " "being chosen from: %2 instead of %3."); @@ -448,7 +448,7 @@ henceforth to be true, so we simply compile empty code in that case. current_sentence = A; Problems::quote_source(1, A); Problems::quote_spec(2, Node::get_evaluation(A)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_CaseValueDuplicated)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_CaseValueDuplicated)); Problems::issue_problem_segment( "The case %1 occurs more than once in this 'if' switch."); Problems::issue_problem_end(); @@ -522,7 +522,7 @@ the ceaseless repetition of the keyword "case". Thus, |15:| does what ; @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CaseValueUnknown), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CaseValueUnknown), "I don't recognise this case value", "that is, the value written after the '--'."); @@ -659,7 +659,7 @@ It doesn't quite do nothing, though, because it also counts the say phrases foun @ = int it_was_not_worth_adding = it_is_not_worth_adding; - it_is_not_worth_adding = TRUE; + Strings::TextSubstitutions::it_is_not_worth_adding(); int SSP_sp = 0; int SSP_stack[MAX_COMPLEX_SAY_DEPTH]; @@ -763,7 +763,7 @@ It doesn't quite do nothing, though, because it also counts the say phrases foun if (problem_issued == FALSE) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(inv)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ComplicatedSayStructure)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ComplicatedSayStructure)); Problems::issue_problem_segment( "In the text at %1, the text substitution '[%2]' ought to occur as the " "middle part of its construction, but it appears to be on its own."); @@ -776,7 +776,7 @@ It doesn't quite do nothing, though, because it also counts the say phrases foun if (problem_issued == FALSE) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(inv)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ComplicatedSayStructure2)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ComplicatedSayStructure2)); Problems::issue_problem_segment( "In the text at %1, the text substitution '[%2]' ought to occur as the " "ending part of its construction, but it appears to be on its own."); @@ -787,7 +787,7 @@ It doesn't quite do nothing, though, because it also counts the say phrases foun @ = if (problem_issued == FALSE) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_SayIfNested), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_SayIfNested), "a second '[if ...]' text substitution occurs inside an existing one", "which makes this text too complicated. While a single text can contain " "more than one '[if ...]', this can only happen if the old if is finished " @@ -800,7 +800,7 @@ It doesn't quite do nothing, though, because it also counts the say phrases foun @ = if (problem_issued == FALSE) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_SayOverComplex), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_SayOverComplex), "this is too complex a text substitution", "and needs to be simplified. You might find it helful to define " "a new text substitution of your own ('To say fiddly details: " @@ -810,7 +810,7 @@ It doesn't quite do nothing, though, because it also counts the say phrases foun @ = if (problem_issued == FALSE) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_SayOtherwiseWithoutIf), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_SayOtherwiseWithoutIf), "an '[otherwise]' text substitution occurs where there appears to be no " "[if ...]", "which doesn't make sense - there is nothing for it to be otherwise to."); @@ -821,7 +821,7 @@ It doesn't quite do nothing, though, because it also counts the say phrases foun if (problem_issued == FALSE) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(inv)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ComplicatedSayStructure5)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ComplicatedSayStructure5)); Problems::issue_problem_segment( "In the text at %1, the '[%2]' ought to occur inside an [if ...], but " "is cut off because it has been interleaved with a complicated say " @@ -833,7 +833,7 @@ It doesn't quite do nothing, though, because it also counts the say phrases foun @ = if (problem_issued == FALSE) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TwoSayOtherwises), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TwoSayOtherwises), "there's already an (unconditional) \"[otherwise]\" or \"[else]\" " "in this text substitution", "so it doesn't make sense to follow that with a further one."); @@ -842,7 +842,7 @@ It doesn't quite do nothing, though, because it also counts the say phrases foun @ = if (problem_issued == FALSE) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_SayEndIfWithoutSayIf), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_SayEndIfWithoutSayIf), "an '[end if]' text substitution occurs where there appears to be no " "[if ...]", "which doesn't make sense - there is nothing for it to end."); @@ -853,7 +853,7 @@ It doesn't quite do nothing, though, because it also counts the say phrases foun if (problem_issued == FALSE) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(inv)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ComplicatedSayStructure4)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ComplicatedSayStructure4)); Problems::issue_problem_segment( "In the text at %1, the '[%2]' is cut off from its [if ...], because " "it has been interleaved with a complicated say construction."); @@ -874,7 +874,7 @@ It doesn't quite do nothing, though, because it also counts the say phrases foun if (stinv) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(stinv)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ComplicatedSayStructure3)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ComplicatedSayStructure3)); Problems::issue_problem_segment( "In the text at %1, the text substitution '[%2]' seems to start a " "complicated say construction, but it doesn't have a matching end."); diff --git a/inform7/core-module/Chapter 25/Parse Invocations.w b/inform7/core-module/Chapter 25/Parse Invocations.w index c1676c1e2..d0f1c47f4 100644 --- a/inform7/core-module/Chapter 25/Parse Invocations.w +++ b/inform7/core-module/Chapter 25/Parse Invocations.w @@ -82,7 +82,7 @@ void Phrases::Parser::register_phrasal(unsigned int phrase_mc, phrase *ph, wordi @ = if (ph != last_phrase_where_rp_problemed) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_QuotedInPhrase), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_QuotedInPhrase), "phrases can't be defined with quoted text as part of the fixed wording", "so something like 'To go \"voluntarily\" to jail: ...' is not allowed."); last_phrase_where_rp_problemed = ph; @@ -91,7 +91,7 @@ void Phrases::Parser::register_phrasal(unsigned int phrase_mc, phrase *ph, wordi @ = if (ph != last_phrase_where_rp_problemed) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_AdjacentTokens), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_AdjacentTokens), "phrases can't be defined so that they have two bracketed varying elements " "immediately next to each other", "but instead need at least one fixed word in between. Thus 'To combine " @@ -104,7 +104,7 @@ void Phrases::Parser::register_phrasal(unsigned int phrase_mc, phrase *ph, wordi @ = if (ph != last_phrase_where_rp_problemed) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_MustBeOneWord), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_MustBeOneWord), "a 'To...' phrase must contain at least one fixed word", "that is, one word other than the bracketed variables. So a declaration " "like 'To (N - number): ...' is not allowed."); @@ -184,7 +184,7 @@ word, though.) if ((Str::eq_wide_string(a_form, L"say")) && (i == Wordings::first_wn(W)) && (phrase_mc != SAY_PHRASE_MC)) if (ph != last_phrase_where_rp_problemed) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_SaySlashed), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_SaySlashed), "'say' is not allowed as the first word of a phrase", "even when presented as one of a number of slashed alternatives. " "(This is because 'say' is reserved for creating text substitutions.)"); @@ -273,7 +273,7 @@ register phrases with more than that number of tokens anyway. else internal_error("Unexpected production in phrase args"); } if (no_tokens > MAX_TOKENS_PER_PHRASE) - Problems::Fatal::issue("MAX_TOKENS_PER_PHRASE exceeded"); + Problems::fatal("MAX_TOKENS_PER_PHRASE exceeded"); @ As can be seen, the way we parse the token text depends on the context, that is, depends on what we're expecting to find. (This is why the excerpt diff --git a/inform7/core-module/Chapter 26/Fundamental Constants.w b/inform7/core-module/Chapter 26/Fundamental Constants.w index 5148b30b2..e325a1c1d 100644 --- a/inform7/core-module/Chapter 26/Fundamental Constants.w +++ b/inform7/core-module/Chapter 26/Fundamental Constants.w @@ -123,7 +123,7 @@ void FundamentalConstants::emit_build_number(void) { int FundamentalConstants::veto_number(int X) { if (((X > 32767) || (X < -32768)) && (TargetVMs::is_16_bit(Task::vm()))) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LiteralOverflow), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LiteralOverflow), "you use a number which is too large", "at least with the Settings for this project as they currently " "are. (Change to Glulx to be allowed to use much larger numbers.)"); diff --git a/inform7/core-module/Chapter 26/I6 Template Interpreter.w b/inform7/core-module/Chapter 26/I6 Template Interpreter.w index 06072bb4c..f830e15f8 100644 --- a/inform7/core-module/Chapter 26/I6 Template Interpreter.w +++ b/inform7/core-module/Chapter 26/I6 Template Interpreter.w @@ -130,14 +130,14 @@ file. if (Str::len(segment_name) > 0) { Input_File = NULL; WRITE_TO(STDERR, "inform: Unable to open segment <%S>\n", segment_name); - Problems::Issue::unlocated_problem(Task::syntax_tree(), _p_(BelievedImpossible), /* or anyway not usefully testable */ + StandardProblems::unlocated_problem(Task::syntax_tree(), _p_(BelievedImpossible), /* or anyway not usefully testable */ "I couldn't open a requested I6T segment: see the console " "output for details."); } else if (index_structure) { Input_File = Filenames::fopen(index_structure, "r"); if (Input_File == NULL) { LOG("Filename was %f\n", index_structure); - Problems::Issue::unlocated_problem(Task::syntax_tree(), _p_(BelievedImpossible), /* or anyway not usefully testable */ + StandardProblems::unlocated_problem(Task::syntax_tree(), _p_(BelievedImpossible), /* or anyway not usefully testable */ "I couldn't open the template file for the index."); } } @@ -223,7 +223,7 @@ At one time there were very many commands avalable here, but no longer. LOG("command: <%S> argument: <%S>\n", command, argument); Problems::quote_stream(1, command); - Problems::Issue::unlocated_problem(Task::syntax_tree(), _p_(PM_TemplateError), + StandardProblems::unlocated_problem(Task::syntax_tree(), _p_(PM_TemplateError), "In an explicit Inform 6 code insertion, I recognise a few special " "notations in the form '{-command}'. This time, though, the unknown notation " "{-%1} has been used, and this is an error. (It seems very unlikely indeed " @@ -292,7 +292,7 @@ using template-hacking there are a handful of cases that can't be avoided, so... = void I6T::error(char *message) { Problems::quote_text(1, message); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(...)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(...)); Problems::issue_problem_segment( "I ran into a mistake in a template file command: %1. The I6 " "template files (or .i6t files) are a very low-level part of Inform, " diff --git a/inform7/core-module/Chapter 26/Inform 6 Inclusions.w b/inform7/core-module/Chapter 26/Inform 6 Inclusions.w index 8b56c14c0..3ffbd80b6 100644 --- a/inform7/core-module/Chapter 26/Inform 6 Inclusions.w +++ b/inform7/core-module/Chapter 26/Inform 6 Inclusions.w @@ -66,12 +66,12 @@ and the following grammar defines the "when defining a thing" end. inclusion_side = R[1]; section_inclusion_wn = R[2]; segment_inclusion_wn = R[3]; @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_WhenDefiningUnknown), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_WhenDefiningUnknown), "I do not understand what definition you're referring to", "so I can't make an Inform 6 inclusion there."); @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BeforeTheLibrary), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BeforeTheLibrary), "this syntax was withdrawn in January 2008", "in favour of a more finely controlled I6 inclusion command. The effect " "you want can probably be achieved by writing 'after \"Definitions.i6t\".' " @@ -157,7 +157,7 @@ code instructions; we remember what's needed ourselves: } else problem = TRUE; @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadI6Inclusion), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadI6Inclusion), "this is not a form of I6 code inclusion I recognise", "because the clause at the end telling me where to put the code " "excerpt is not one of the possibilities I know. The clause can " diff --git a/inform7/core-module/Chapter 26/Jump Labels.w b/inform7/core-module/Chapter 26/Jump Labels.w index 6a69d160b..8ed716c2f 100644 --- a/inform7/core-module/Chapter 26/Jump Labels.w +++ b/inform7/core-module/Chapter 26/Jump Labels.w @@ -37,7 +37,7 @@ reserves no memory. label_namespace *JumpLabels::new_namespace(text_stream *name, compilation_module *cm) { if (Str::len(name) > MAX_NAMESPACE_PREFIX_LENGTH) { #ifdef CORE_MODULE - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LabelNamespaceTooLong), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LabelNamespaceTooLong), "a label namespace prefix is too long", "and should be shortened to a few alphabetic characters."); #endif diff --git a/inform7/core-module/Chapter 26/Plugins.w b/inform7/core-module/Chapter 26/Plugins.w index 0856a1cde..e36febc41 100644 --- a/inform7/core-module/Chapter 26/Plugins.w +++ b/inform7/core-module/Chapter 26/Plugins.w @@ -263,7 +263,7 @@ void Plugins::Manage::deactivate(int N) { } @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(Untestable), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(Untestable), "the core of the Inform language cannot be removed", "because then what should we do? What should we ever do?"); return; diff --git a/inform7/core-module/Chapter 26/Routines.w b/inform7/core-module/Chapter 26/Routines.w index f24201189..bf1a99ab5 100644 --- a/inform7/core-module/Chapter 26/Routines.w +++ b/inform7/core-module/Chapter 26/Routines.w @@ -182,7 +182,7 @@ after the call parameters, and is used only as a scratch variable. Produce::up(Emit::tree()); @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TooManyLocals), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TooManyLocals), "there are too many temporarily-named values in this phrase", "which may be a sign that it is complicated enough to need breaking up " "into smaller phrases making use of each other. " diff --git a/inform7/core-module/Chapter 26/Test Scripts.w b/inform7/core-module/Chapter 26/Test Scripts.w index 9b09bb82b..87b0caa50 100644 --- a/inform7/core-module/Chapter 26/Test Scripts.w +++ b/inform7/core-module/Chapter 26/Test Scripts.w @@ -155,31 +155,31 @@ test_scenario *ts_being_parsed = NULL; ts_being_parsed->possessions[ts_being_parsed->no_possessions++] = RP[1]; @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TestBadRequirements), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TestBadRequirements), "I didn't recognise the requirements for this test scenario", "which should be 'test ... with ... in ...' or '... " "holding ...'"); @ = *X = FALSE; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TestQuoted), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TestQuoted), "test scenarios must have unquoted names", "so 'test garden with ...' is allowed but not 'test \"garden\" with...'"); @ = *X = FALSE; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TestMultiWord), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TestMultiWord), "test scenarios must have single-word names", "so 'test garden with ...' is allowed but not 'test garden gate with...'"); @ = *X = NO_INTT; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnknownInternalTest), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnknownInternalTest), "that's an internal test case which I don't know", "so I am taking no action."); @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TestDoubleWith), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TestDoubleWith), "the second 'with' should be 'holding'", "as in 'test frogs with \"get frogs\" holding net' rather than " "'test frogs with \"get frogs\" with net'."); @@ -222,7 +222,7 @@ void PL::Parsing::TestScripts::new_test_text(parse_node *PN) { if (Wordings::match(XW, test->name)) { Problems::quote_source(1, test->sentence_test_declared_at); Problems::quote_source(2, current_sentence); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TestDuplicate)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TestDuplicate)); Problems::issue_problem_segment( "Two test scripts have been set up with the same name: " "%1 and %2."); @@ -247,7 +247,7 @@ void PL::Parsing::TestScripts::new_test_text(parse_node *PN) { @ = void PL::Parsing::TestScripts::check_test_command(text_stream *p) { if (Str::eq_wide_string(p, L"undo")) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TestContainsUndo), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TestContainsUndo), "this test script contains an UNDO command", "which the story file has no way to automate the running of. " "(An UNDO is such a complete reversion to the previous state " @@ -256,7 +256,7 @@ void PL::Parsing::TestScripts::check_test_command(text_stream *p) { return; } if (Str::len(p) > MAX_LENGTH_OF_COMMAND) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TestCommandTooLong), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TestCommandTooLong), "this test script contains a command which is too long", "and cannot be fed into Inform for automatic testing. " "(The format for a test script is a sequence of commands, " diff --git a/inform7/core-module/Chapter 26/Translate to Identifiers.w b/inform7/core-module/Chapter 26/Translate to Identifiers.w index 2bf61f241..e04e9938f 100644 --- a/inform7/core-module/Chapter 26/Translate to Identifiers.w +++ b/inform7/core-module/Chapter 26/Translate to Identifiers.w @@ -38,7 +38,7 @@ such as "The yourself object" in @ = *X = INVALID_I6TR; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TranslatedUnknownCategory), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TranslatedUnknownCategory), "that isn't one of the things which can be translated to I6", "and should be '... variable', '... property', '... object', " "'... kind', '... rule', or '... action'. For instance, 'The yourself " @@ -102,7 +102,7 @@ traversing the parse tree to look for translation sentences of the right sort. else responses_list = <>; if (valid) @; if (valid == FALSE) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TranslatedToNonIdentifier), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TranslatedToNonIdentifier), "Inform 7 constructions can only translate into quoted I6 identifiers", "which must be strings of 1 to 31 characters drawn from 1, 2, ..., 9, " "a or A, b or B, ..., z or Z, or underscore '_', except that the " @@ -136,7 +136,7 @@ void IdentifierTranslations::plus_responses(parse_node *p, rule *R) { code, Node::get_text(p), NULL, TRUE); Rules::now_rule_defines_response(R, code, resp); } else { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_I6ResponsesAwry), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_I6ResponsesAwry), "additional information about I6 translation of a rule can " "only take the form of a list of responses", "each quoted and followed by a bracketed letter."); diff --git a/inform7/core-module/Chapter 26/Use Options.w b/inform7/core-module/Chapter 26/Use Options.w index c6c952df6..7ffbfdd82 100644 --- a/inform7/core-module/Chapter 26/Use Options.w +++ b/inform7/core-module/Chapter 26/Use Options.w @@ -117,7 +117,7 @@ void UseOptions::new_use_option(parse_node *p) { @ = *X = FALSE; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UseTranslatesNotI6), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UseTranslatesNotI6), "that translates into something which isn't a simple I6 inclusion", "placed in '(-' and '-)' markers."); @@ -236,7 +236,7 @@ void UseOptions::set_use_options(parse_node *p) { else if ((Node::get_text(p))) @; if (traverse == 1) return; LOG("Used: %W\n", Node::get_text(p)); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnknownUseOption), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnknownUseOption), "that isn't a 'Use' option known to me", "and needs to be one of the ones listed in the documentation."); } @@ -279,7 +279,7 @@ void UseOptions::set_use_options(parse_node *p) { @ = if (uo->minimum_setting_value == -1) { if (min_setting != -1) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UONotNumerical), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UONotNumerical), "that 'Use' option does not have a numerical setting", "but is either used or not used."); } else { @@ -292,7 +292,7 @@ void UseOptions::set_use_options(parse_node *p) { TEMPORARY_TEXT(new_identifier); WRITE_TO(new_identifier, "%+W", Wordings::one_word(w1)); if (Str::len(new_identifier) > 63) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadICLIdentifier), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadICLIdentifier), "that is too long to be an ICL identifier", "so can't be the name of any I6 memory setting."); } diff --git a/inform7/core-module/Chapter 3/Natural Languages.w b/inform7/core-module/Chapter 3/Natural Languages.w index eeb9693f3..61c616884 100644 --- a/inform7/core-module/Chapter 3/Natural Languages.w +++ b/inform7/core-module/Chapter 3/Natural Languages.w @@ -108,7 +108,7 @@ void NaturalLanguages::preform_error(word_assemblage base_text, nonterminal *nt, else Problems::quote_wide_text(1, Vocabulary::get_exemplar(nt->nonterminal_id, FALSE)); Problems::quote_text(2, message); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(Untestable)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(Untestable)); if (WordAssemblages::nonempty(base_text)) { Problems::quote_wa(5, &base_text); Problems::issue_problem_segment( diff --git a/inform7/core-module/Chapter 3/Plural Dictionary.w b/inform7/core-module/Chapter 3/Plural Dictionary.w index ac566025f..8d982a3cf 100644 --- a/inform7/core-module/Chapter 3/Plural Dictionary.w +++ b/inform7/core-module/Chapter 3/Plural Dictionary.w @@ -47,7 +47,7 @@ text anyway, so the following problem messages are not too gratuitous. @ = LOOP_THROUGH_WORDING(i, S) if (Vocabulary::test_flags(i, TEXT_MC+TEXTWITHSUBS_MC)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PluralOfQuoted), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PluralOfQuoted), "declares a plural for a phrase containing quoted text", "which is forbidden. Sentences like this are supposed to " "declare plurals without quotation marks: for instance, " @@ -56,7 +56,7 @@ text anyway, so the following problem messages are not too gratuitous. } LOOP_THROUGH_WORDING(i, P) if (Vocabulary::test_flags(i, TEXT_MC+TEXTWITHSUBS_MC)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PluralIsQuoted), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PluralIsQuoted), "declares a plural for a phrase using quoted text", "which is forbidden. Sentences like this are supposed to " "declare plurals without quotation marks: for instance, " diff --git a/inform7/core-module/Chapter 4/Adjective Meanings.w b/inform7/core-module/Chapter 4/Adjective Meanings.w index 101e27968..d29dd0f80 100644 --- a/inform7/core-module/Chapter 4/Adjective Meanings.w +++ b/inform7/core-module/Chapter 4/Adjective Meanings.w @@ -258,7 +258,7 @@ int Adjectives::Meanings::applicable_to(adjectival_phrase *aph, if (problem_count == 0) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Clusters::get_name(aph->adjective_names, FALSE)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_AdjectiveCircular)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_AdjectiveCircular)); Problems::issue_problem_segment( "In the sentence %1, it looks as if the definition of the adjective " "'%2' may be circular."); @@ -613,7 +613,7 @@ can't be avoided. @ = if ((early) || (am->problems_thrown++ > 0)) return; current_sentence = am->defined_at; - Problems::Issue::adjective_problem(Task::syntax_tree(), _p_(PM_AdjDomainUnknown), + StandardProblems::adjective_problem(Task::syntax_tree(), _p_(PM_AdjDomainUnknown), am->adjective_index_text, am->domain_text, "this isn't a thing, a kind of thing or a kind of value", "and indeed doesn't have any meaning I can make sense of."); @@ -622,7 +622,7 @@ can't be avoided. @ = if ((early) || (am->problems_thrown++ > 0)) return; current_sentence = am->defined_at; - Problems::Issue::adjective_problem(Task::syntax_tree(), _p_(PM_AdjDomainVague), + StandardProblems::adjective_problem(Task::syntax_tree(), _p_(PM_AdjDomainVague), am->adjective_index_text, am->domain_text, "this isn't allowed as the domain of a definition", "since it potentially describes many different kinds, not just one."); @@ -631,7 +631,7 @@ can't be avoided. @ = if ((early) || (am->problems_thrown++ > 0)) return; current_sentence = am->defined_at; - Problems::Issue::adjective_problem(Task::syntax_tree(), _p_(PM_AdjDomainTopic), + StandardProblems::adjective_problem(Task::syntax_tree(), _p_(PM_AdjDomainTopic), am->adjective_index_text, am->domain_text, "this isn't allowed as the domain of a definition", "because 'topic' doesn't behave the way other kinds of value do when " @@ -646,7 +646,7 @@ can't be avoided. (Rvalues::to_instance(supplied) == NULL)) { if ((early) || (am->problems_thrown++ > 0)) return; current_sentence = am->defined_at; - Problems::Issue::adjective_problem(Task::syntax_tree(), _p_(PM_AdjDomainSurreal), + StandardProblems::adjective_problem(Task::syntax_tree(), _p_(PM_AdjDomainSurreal), am->adjective_index_text, am->domain_text, "this isn't allowed as the domain of a definition", "since adjectives like this can be applied only to specific things, " @@ -663,7 +663,7 @@ can't be avoided. if (Descriptions::is_qualified(supplied)) { if (am->problems_thrown++ > 0) return; current_sentence = am->defined_at; - Problems::Issue::adjective_problem(Task::syntax_tree(), _p_(PM_AdjDomainSlippery), + StandardProblems::adjective_problem(Task::syntax_tree(), _p_(PM_AdjDomainSlippery), am->adjective_index_text, am->domain_text, "this is slippery", "because it can change during play. Definitions can only be " @@ -750,7 +750,7 @@ author's source text.) current_sentence = am1->defined_at; Problems::quote_wording_as_source(1, am1->adjective_index_text); Problems::quote_wording_as_source(2, am2->adjective_index_text); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_AdjDomainDuplicated)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_AdjDomainDuplicated)); Problems::issue_problem_segment( "The definitions %1 and %2 both try to cover the same situation: " "the same adjective applied to the exact same range. %P" diff --git a/inform7/core-module/Chapter 5/Instances.w b/inform7/core-module/Chapter 5/Instances.w index d9b2c39a5..c7c5fc57c 100644 --- a/inform7/core-module/Chapter 5/Instances.w +++ b/inform7/core-module/Chapter 5/Instances.w @@ -452,7 +452,7 @@ void Instances::set_kind(instance *I, kind *new) { Problems::quote_source(2, I->instance_of_set_at); Problems::quote_kind(3, new); Problems::quote_kind(4, existing); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_KindsIncompatible)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_KindsIncompatible)); Problems::issue_problem_segment( "You wrote %1, but that seems to contradict %2, as %3 and %4 " "are incompatible. (If %3 were a kind of %4 or vice versa " @@ -463,7 +463,7 @@ void Instances::set_kind(instance *I, kind *new) { Problems::quote_object(2, I); Problems::quote_kind(3, new); Problems::quote_kind(4, existing); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); Problems::issue_problem_segment( "You wrote %1, which made me think the kind of %2 was %4, " "but for other reasons I now think it ought to be %3, and those " diff --git a/inform7/core-module/Chapter 5/Literal Patterns.w b/inform7/core-module/Chapter 5/Literal Patterns.w index 6fea062e0..ae5067a89 100644 --- a/inform7/core-module/Chapter 5/Literal Patterns.w +++ b/inform7/core-module/Chapter 5/Literal Patterns.w @@ -261,7 +261,7 @@ equivalent to an exact value. if ((TargetVMs::is_16_bit(Task::vm())) && (PM_ZMachineOverflow2_issued == FALSE)) for (lp = list_head; lp; lp = lp->next_for_this_kind) if (Kinds::Scalings::quantum(lp->scaling) > 32767) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ZMachineOverflow2), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ZMachineOverflow2), "you've set up literal specifications needing a range of " "values too broad to be stored at run-time", "at least with the Settings for this project as they currently are. " @@ -572,7 +572,7 @@ which is annoying. So we have a mechanism to suppress duplicates: if (Kinds::FloatingPoint::uses_floating_point(lp->kind_specified) == FALSE) { if (sign_used_at->element_index != 0) { ISSUING_LP_PROBLEM; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NegationInternal), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NegationInternal), "a negative number can't be used in the middle of a constant", "and the minus sign makes it look as if that's what you are " "trying here."); @@ -580,7 +580,7 @@ which is annoying. So we have a mechanism to suppress duplicates: } if (lp->number_signed == FALSE) { ISSUING_LP_PROBLEM; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NegationForbidden), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NegationForbidden), "the minus sign is not allowed here", "since this is a kind of value which only allows positive " "values to be written."); @@ -593,7 +593,7 @@ which is annoying. So we have a mechanism to suppress duplicates: @ = if (overflow_32_bit_flag) { ISSUING_LP_PROBLEM; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_EvenOverflow-G), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_EvenOverflow-G), "you use a literal specification to make a value which is too large", "even for a story file compiled with the Glulx setting. (You can " "see the size limits for each way of writing a value on the Kinds " @@ -602,7 +602,7 @@ which is annoying. So we have a mechanism to suppress duplicates: } if ((overflow_16_bit_flag) && (TargetVMs::is_16_bit(Task::vm()))) { ISSUING_LP_PROBLEM; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ZMachineOverflow), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ZMachineOverflow), "you use a literal specification to make a value which is too large", "at least with the Settings for this project as they currently are. " "(Change to Glulx to be allowed to use much larger numbers; " @@ -632,7 +632,7 @@ which is annoying. So we have a mechanism to suppress duplicates: case 9: Problems::quote_text(5, "tenth"); break; default: Problems::quote_text(5, "eventual"); break; } - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ElementOverflow)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ElementOverflow)); Problems::issue_problem_segment( "In the sentence %1, you use the notation '%2' to write a constant value. " "But the notation was specified as '%3', which means that the %5 numerical " @@ -644,7 +644,7 @@ which is annoying. So we have a mechanism to suppress duplicates: Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); Problems::quote_wording(3, lp->prototype_text); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_LPTooLittleAccuracy)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_LPTooLittleAccuracy)); Problems::issue_problem_segment( "In the sentence %1, you use the notation '%2' to write a constant value. " "But to store that, I would need greater accuracy than this kind of " @@ -2523,7 +2523,7 @@ of alternatives each of which matches the following: @ = *X = ABANDON_LPN; *XP = NULL; if (preform_lookahead_mode == FALSE) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_MultiplyingNonKOVs), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_MultiplyingNonKOVs), "only kinds of value can be multiplied here", "and only in a sentence like 'A length times a length specifies an area.'"); } @@ -2533,7 +2533,7 @@ of alternatives each of which matches the following: if (preform_lookahead_mode == FALSE) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadLPNameOption)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadLPNameOption)); Problems::issue_problem_segment( "In the specification %1, I was expecting that '%2' would be an optional " "note about one of the notations: it should have been one of 'singular', " @@ -2581,7 +2581,7 @@ can't set both scaling and an equivalent, for instance. @ = if (preform_lookahead_mode == FALSE) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LPNotKOV), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LPNotKOV), "you can only specify ways to write kinds of value", "as created with sentences like 'A weight is a kind of value.'"); } @@ -2624,7 +2624,7 @@ by a bracketed list of up to three options in any order. if (preform_lookahead_mode == FALSE) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadLPPartOption)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadLPPartOption)); Problems::issue_problem_segment( "In the specification %1, I was expecting that '%2' would be an optional " "note about one of the parts: it should have been one of 'optional', " @@ -2639,7 +2639,7 @@ by a bracketed list of up to three options in any order. if (Rvalues::is_CONSTANT_of_kind(LP_equivalent_value, K)) { scaled_dir = LP_SCALED_UP; scaled = Rvalues::to_encoded_notation(LP_equivalent_value); } else { - Problems::Issue::sentence_problem_with_note(Task::syntax_tree(), _p_(PM_BadLPEquivalent), + StandardProblems::sentence_problem_with_note(Task::syntax_tree(), _p_(PM_BadLPEquivalent), "the equivalent value needs to be a constant of the same kind " "of value as you are specifying", "and this seems not to be.", @@ -2652,7 +2652,7 @@ by a bracketed list of up to three options in any order. if (Rvalues::is_CONSTANT_of_kind(LP_offset_value, K)) { offset = Rvalues::to_encoded_notation(LP_offset_value); } else { - Problems::Issue::sentence_problem_with_note(Task::syntax_tree(), _p_(PM_BadLPOffset), + StandardProblems::sentence_problem_with_note(Task::syntax_tree(), _p_(PM_BadLPOffset), "the offset value needs to be a constant of the same kind " "of value as you are specifying", "and this seems not to be.", @@ -2681,7 +2681,7 @@ does not throw a problem message as being a bar which is out of range Problems::quote_source(1, current_sentence); Problems::quote_kind(2, K); Problems::quote_wording(3, SPW); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_DuplicateUnitSpec)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_DuplicateUnitSpec)); Problems::issue_problem_segment( "In the sentence %1, it looks as if you intend to give a new meaning " "to expressions like '%3', but this is already something I " @@ -2694,7 +2694,7 @@ does not throw a problem message as being a bar which is out of range @ = Problems::quote_source(1, current_sentence); Problems::quote_kind(2, K); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_LPNeedsReal)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_LPNeedsReal)); Problems::issue_problem_segment( "In the sentence %1, it looks as if you intend to give a real " "number as a scale factor for values of %2. However, as you've " @@ -2719,21 +2719,21 @@ after itself. @ = if (Kinds::Behaviour::is_built_in(K)) { if (Kinds::Behaviour::get_index_priority(K) == 0) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LPBuiltInKOVHidden), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LPBuiltInKOVHidden), "you can only specify ways to write new kinds of value", "as created with sentences like 'A weight is a kind of value.', " "and not the built-in ones like 'number' or 'time'. (This one is " "a kind used behind the scenes by Inform, so it's reserved " "for Inform's own use, and you can't do much else with it.)"); else - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LPBuiltInKOV), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LPBuiltInKOV), "you can only specify ways to write new kinds of value", "as created with sentences like 'A weight is a kind of value.', " "and not the built-in ones like 'number' or 'time'."); return owner; } if (Kinds::Behaviour::convert_to_unit(Task::syntax_tree(), K) == FALSE) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LPEnumeration), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LPEnumeration), "this is a kind of value which already has named values", "so it can't have a basically numerical form as well."); return owner; @@ -2745,7 +2745,7 @@ after itself. lp = LiteralPatterns::lp_new(K, SPW); if (LP_equivalent_value) LP_real_scaling_amount = LP_real_equivalent; if (scaled <= 0) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LPNonpositiveScaling), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LPNonpositiveScaling), "you can only scale by a positive multiple", "so something like 'scaled up by -1' is not allowed."); scaled = 1; @@ -2784,7 +2784,7 @@ alphabetic vs numeric pieces of a word: lp->no_lp_tokens = tc; lp->no_lp_elements = ec; if (lp->no_lp_elements == 0) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LPWithoutElement), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LPWithoutElement), "a way to specify a kind of value must involve numbers", "so '10kg specifies a weight' is allowed, but not 'tonne " "specifies a weight'."); @@ -2805,7 +2805,7 @@ hold -- so we need not fool around with long long ints. while (Characters::isdigit(text_of_word[j++])) { digit_found = TRUE; if (tot > 999999999) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LPElementTooLarge), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LPElementTooLarge), "that specification contains numbers that are too large", "and would construct values which could not sensibly " "be stored at run-time."); @@ -2820,7 +2820,7 @@ hold -- so we need not fool around with long long ints. if (digit_found) { literal_pattern_element new_element = LiteralPatterns::lpe_new(ec, tot+1, sgn); if (ec >= MAX_ELEMENTS_PER_LITERAL) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LPTooManyElements), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LPTooManyElements), "that specification contains too many numerical elements", "and is too complicated for Inform to handle."); return owner; @@ -2848,7 +2848,7 @@ not really distort matters. @ = if (tc >= MAX_TOKENS_PER_LITERAL) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LPTooComplicated), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LPTooComplicated), "that specification is too complicated", "and will have to be shortened."); return owner; @@ -2888,20 +2888,20 @@ this is deferred until all elements exist, at which point we -- } if (O & WITHOUT_LEADING_ZEROS_LSO) lpe->without_leading_zeros = TRUE; if ((i == lp->no_lp_elements - 1) && (p->next)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LPTooManyPartNames), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LPTooManyPartNames), "this gives names for too many parts", "that is, for more parts than there are in the pattern."); return owner; } for (int j = 0; jlp_elements[i].element_name, lp->lp_elements[j].element_name)) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LPRepeatedPartNames), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LPRepeatedPartNames), "this repeats a part name", "that is, it uses the same name for two different parts " "of the pattern."); } if ((i > 0) && (i != lp->no_lp_elements)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LPNotAllNamed), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LPNotAllNamed), "you must supply names for all the parts", "if for any"); return owner; @@ -2915,14 +2915,14 @@ optional, and it must not be the first. for (i=0; ino_lp_elements; i++) if (lp->lp_elements[i].element_optional) { opt_count++; if (i == 0) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LPFirstOptional), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LPFirstOptional), "the first part is not allowed to be optional", "since it is needed to identify the value."); return owner; } } if (opt_count >= 2) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LPMultipleOptional), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LPMultipleOptional), "only one part can be called optional", "since if any part is omitted then so are all subsequent parts."); return owner; @@ -3131,7 +3131,7 @@ For instance, the dollars-and-cents example compiles: } @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LPPartNamesTooLong), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LPPartNamesTooLong), "the names for these parts are too long", "and will have to be cut down."); diff --git a/inform7/core-module/Chapter 5/Nonlocal Variables.w b/inform7/core-module/Chapter 5/Nonlocal Variables.w index 59a8cba98..8cd440dcf 100644 --- a/inform7/core-module/Chapter 5/Nonlocal Variables.w +++ b/inform7/core-module/Chapter 5/Nonlocal Variables.w @@ -110,7 +110,7 @@ nonlocal_variable *NonlocalVariables::new(wording W, kind *K, stacked_variable * @ = Problems::quote_wording(1, W); Problems::quote_kind(2, K); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_IndefiniteVariable)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_IndefiniteVariable)); Problems::issue_problem_segment( "I am unable to create the variable '%1', because its kind (%2) is too " "vague. I need to know exactly what kind of value goes into each " @@ -196,13 +196,13 @@ void NonlocalVariables::translates(wording W, parse_node *p2) { nonlocal_variable *nlv = NonlocalVariables::parse(W); if ((nlv == NULL) || (nlv->scope)) { LOG("Tried %W\n", W); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NonQuantityTranslated), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NonQuantityTranslated), "this is not the name of a variable", "or at any rate not one global in scope."); return; } if (nlv->nlv_name_translated) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_QuantityTranslatedAlready), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_QuantityTranslatedAlready), "this variable has already been translated", "so there must be some duplication somewhere."); return; @@ -318,7 +318,7 @@ void NonlocalVariables::emit_lvalue(nonlocal_variable *nlv) { @ = Problems::quote_source(1, current_sentence); Problems::quote_wording(2, nlv->name); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); Problems::issue_problem_segment( "The sentence %1 seems to need the value '%2', but that currently " "has no definition."); @@ -362,7 +362,7 @@ void NonlocalVariables::warn_about_change(nonlocal_variable *nlv) { #ifdef IF_MODULE if ((score_VAR) && (nlv == score_VAR)) { if ((scoring_option_set == FALSE) || (scoring_option_set == NOT_APPLICABLE)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantChangeScore), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantChangeScore), "this is a story with no scoring", "so it makes no sense to change the 'score' value. You can add " "scoring to the story by including the sentence 'Use scoring.', " @@ -482,7 +482,7 @@ that faraway I6 code said it was. Problems::quote_source(1, current_sentence); Problems::quote_wording(2, nlv->name); Problems::quote_stream(3, nlv->lvalue_nve.textual_form); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_InaccessibleVariable)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_InaccessibleVariable)); Problems::issue_problem_segment( "The sentence %1 tells me that '%2' has a specific initial value, " "but this is a variable which has been translated into an I6 'Global' " @@ -630,7 +630,7 @@ int NonlocalVariables::is_constant(nonlocal_variable *nlv) { int NonlocalVariables::must_be_constant(nonlocal_variable *nlv) { if (nlv->constant_at_run_time) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantChangeConstants), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantChangeConstants), "this is a name for a value which never changes during the story", "so it can't be altered with 'now'."); return TRUE; @@ -654,7 +654,7 @@ parse_node *NonlocalVariables::substitute_constants(parse_node *spec) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, nlv->name); Problems::quote_kind(3, nlv->nlv_kind); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_MeaningRecursive)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_MeaningRecursive)); Problems::issue_problem_segment( "The sentence %1 tells me that '%2', which should be %3 " "that varies, is to have an initial value which can't " @@ -747,7 +747,7 @@ void NonlocalVariables::compile_initial_value_vh(value_holster *VH, nonlocal_var wording W = Kinds::Behaviour::get_name(nlv->nlv_kind, FALSE); Problems::quote_wording(1, nlv->name); Problems::quote_wording(2, W); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_EmptyDataType)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_EmptyDataType)); Problems::issue_problem_segment( "I am unable to put any value into the variable '%1', because " "%2 is a kind of value with no actual values."); @@ -763,7 +763,7 @@ void NonlocalVariables::compile_initial_value_vh(value_holster *VH, nonlocal_var Problems::quote_source(1, current_sentence); Problems::quote_wording(2, nlv->name); Problems::quote_kind(3, nlv->nlv_kind); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_InitialiseQ2)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_InitialiseQ2)); Problems::issue_problem_segment( "The sentence %1 tells me that '%2', which should be %3 " "that varies, is to have an initial value equal to itself - " @@ -776,7 +776,7 @@ void NonlocalVariables::compile_initial_value_vh(value_holster *VH, nonlocal_var Problems::quote_kind(3, nlv->nlv_kind); Problems::quote_wording(4, the_other->name); Problems::quote_kind(5, the_other->nlv_kind); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_InitialiseQ1)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_InitialiseQ1)); Problems::issue_problem_segment( "The sentence %1 tells me that '%2', which should be %3 " "that varies, is to have an initial value equal to '%4', " diff --git a/inform7/core-module/Chapter 5/Times of Day.w b/inform7/core-module/Chapter 5/Times of Day.w index 7e2e856e0..4618c83b6 100644 --- a/inform7/core-module/Chapter 5/Times of Day.w +++ b/inform7/core-module/Chapter 5/Times of Day.w @@ -163,7 +163,7 @@ a specific time of day, or when a named event occurs. at ... ==> @ @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_AtTimeThat), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_AtTimeThat), "this seems to use 'that' where it should use 'when'", "assuming it's trying to apply a rule to an event. (The convention is " "that any rule beginning 'At' is a timed one. The time can either be a " @@ -171,7 +171,7 @@ a specific time of day, or when a named event occurs. "event takes place, as in 'At the time when the clock chimes: ...'.)"); @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_AtWithoutTime), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_AtWithoutTime), "'at' what time? No description of a time is given", "which means that this rule can never have effect. (The convention is " "that any rule beginning 'At' is a timed one. The time can either be a " diff --git a/inform7/core-module/Chapter 5/Unicode Translations.w b/inform7/core-module/Chapter 5/Unicode Translations.w index afc84adea..7005fa5e2 100644 --- a/inform7/core-module/Chapter 5/Unicode Translations.w +++ b/inform7/core-module/Chapter 5/Unicode Translations.w @@ -14,7 +14,7 @@ void UnicodeTranslations::unicode_translates(parse_node *pn) { (Node::get_text(pn->next)); if ((<> != -1) && (<> != cc)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnicodeAlready), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnicodeAlready), "this Unicode character name has already been translated", "so there must be some duplication somewhere."); return; @@ -51,7 +51,7 @@ the built-in extensions anyway; Inform authors never type them. ... ==> @ @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnicodeNonLiteral), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnicodeNonLiteral), "a Unicode character name must be translated into a literal decimal " "number written out in digits", "which this seems not to be."); @@ -85,7 +85,7 @@ the player types either of these: = int UnicodeTranslations::char_in_range(int cc) { if ((cc < 0) || (cc >= 0x10000)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnicodeOutOfRange), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnicodeOutOfRange), "Inform can only handle Unicode characters in the 16-bit range", "from 0 to 65535."); return FALSE; diff --git a/inform7/core-module/Chapter 5/Using Excerpt Meanings.w b/inform7/core-module/Chapter 5/Using Excerpt Meanings.w index 7c20d548f..d25b95047 100644 --- a/inform7/core-module/Chapter 5/Using Excerpt Meanings.w +++ b/inform7/core-module/Chapter 5/Using Excerpt Meanings.w @@ -78,7 +78,7 @@ int UseExcerptMeanings::ignore_definite_article(unsigned int mc) { void UseExcerptMeanings::linguistics_problem_handler(int err_no, wording W, void *ref, int k) { switch (err_no) { case TooLongName_LINERROR: - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TooLongName), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TooLongName), "that seems to involve far too long a name", "since in general names are limited to a maximum of 32 words."); break; diff --git a/inform7/core-module/Chapter 5/Using Nametags.w b/inform7/core-module/Chapter 5/Using Nametags.w index 6f4d5a199..b9ee1263f 100644 --- a/inform7/core-module/Chapter 5/Using Nametags.w +++ b/inform7/core-module/Chapter 5/Using Nametags.w @@ -81,7 +81,7 @@ void UseNouns::visit_to_name(parse_node *p) { DISCARD_TEXT(i6r); } } else { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadObjectTranslation), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadObjectTranslation), "there is no such object or kind of object", "so its name will never be translated into an I6 Object or Class identifier " "in any event."); @@ -109,14 +109,14 @@ void UseNouns::nl_translates(parse_node *pn) { int g = Annotations::read_int(pn->next->next, gender_reference_ANNOT); if (nl == NULL) internal_error("No such NL"); if (nl == English_language) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantTranslateIntoEnglish), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantTranslateIntoEnglish), "you can't translate into English", "only out of it."); return; } if (((Node::get_text(pn->next))) == FALSE) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantTranslateValue), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantTranslateValue), "this isn't something which can be translated", "that is, it isn't a kind."); return; diff --git a/inform7/core-module/Chapter 6/Explicit Relations.w b/inform7/core-module/Chapter 6/Explicit Relations.w index ebce9e7f6..bce210a0d 100644 --- a/inform7/core-module/Chapter 6/Explicit Relations.w +++ b/inform7/core-module/Chapter 6/Explicit Relations.w @@ -57,7 +57,7 @@ int Relations::Explicit::REL_assert(binary_predicate *bp, @ = if (BinaryPredicates::can_be_made_true_at_runtime(bp) == FALSE) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_Unassertable2), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_Unassertable2), "the relationship you describe is not exact enough", "so that I do not know how to make this assertion come true. " "For instance, saying 'The Study is adjacent to the Hallway.' " @@ -67,7 +67,7 @@ int Relations::Explicit::REL_assert(binary_predicate *bp, } @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantRelateNothing), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantRelateNothing), "the relationship you describe seems to be with nothing", "which does not really make sense. 'Nothing' looks like a noun, " "but really Inform uses it to mean the absence of one, so it's " diff --git a/inform7/core-module/Chapter 6/New Verbs.w b/inform7/core-module/Chapter 6/New Verbs.w index c85b96921..dc9c68abc 100644 --- a/inform7/core-module/Chapter 6/New Verbs.w +++ b/inform7/core-module/Chapter 6/New Verbs.w @@ -147,7 +147,7 @@ now absolutely any non-empty word range is accepted as the property name. @ = *X = NONE_VERBM; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_VerbRelationUnknown), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_VerbRelationUnknown), "new verbs can only be defined in terms of existing relations", "all of which have names ending 'relation': thus '...implies the " "possession relation' is an example of a valid definition, this " @@ -155,14 +155,14 @@ now absolutely any non-empty word range is accepted as the property name. @ = *X = NONE_VERBM; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_VerbRelationVague), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_VerbRelationVague), "that's too vague", "calling a relation simply 'relation'."); @ = *X = NONE_VERBM; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_VerbUnknownMeaning), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_VerbUnknownMeaning), "I don't see what the meaning of this verb ought to be", "because it doesn't take any of the three forms I know: a relation " "name ('...means the wearing relation'), a property name ('...means " @@ -176,7 +176,7 @@ now absolutely any non-empty word range is accepted as the property name. *XP = vm; } else { *X = NONE_VERBM; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), "that's another verb which has no meaning at present", "so this doesn't help me."); } @@ -285,7 +285,7 @@ void NewVerbs::parse_new(parse_node *PN, int imperative) { } if ((Wordings::length(P) > MAX_WORDS_IN_PREPOSITION) || (Wordings::length(SP) > MAX_WORDS_IN_PREPOSITION)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PrepositionLong), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PrepositionLong), "prepositions can be very long indeed in today's Inform", "but not as long as this."); return; @@ -344,7 +344,7 @@ void NewVerbs::parse_new(parse_node *PN, int imperative) { inform_extension *loc = Extensions::corresponding_to(pos); if (Extensions::is_standard(loc)) return; #endif - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NoSuchBuiltInMeaning), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NoSuchBuiltInMeaning), "that's not one of the built-in meanings I know", "and should be one of the ones used in the Preamble to the " "Standard Rules."); @@ -491,7 +491,7 @@ infinitive for that -- the two are the same in most regular English verbs } else { if (number == 2) { if (WordAssemblages::nonempty(present_plural)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PresentPluralTwice), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PresentPluralTwice), "the present plural has been given twice", "since two of the principal parts of this verb begin " "with 'they'."); @@ -509,7 +509,7 @@ infinitive for that -- the two are the same in most regular English verbs @ A catch-all problem message: @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_VerbMalformed), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_VerbMalformed), "this verb's definition is malformed", "and should have its principal parts supplied like so: 'The verb " "to sport (he sports, they sport, he sported, it is sported, " @@ -524,7 +524,7 @@ perfectly valid if a verb were being defined. @ = if (Wordings::nonempty(PW)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PrepositionConjugated), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PrepositionConjugated), "the principal parts of 'to be' are known already", "so should not be spelled out again as part of the instructions " "for this new preposition."); @@ -533,12 +533,12 @@ perfectly valid if a verb were being defined. @ = if (where) - Problems::Issue::two_sentences_problem(_p_(PM_DuplicateVerbs1), + StandardProblems::two_sentences_problem(_p_(PM_DuplicateVerbs1), where, "this gives us two definitions of what appears to be the same verb", "or at least has the same infinitive form."); else - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), "this verb definition appears to clash with a built-in verb", "a table of which can be seen on the Phrasebook index."); diff --git a/inform7/core-module/Chapter 6/Relations.w b/inform7/core-module/Chapter 6/Relations.w index a550ef149..329287f9f 100644 --- a/inform7/core-module/Chapter 6/Relations.w +++ b/inform7/core-module/Chapter 6/Relations.w @@ -139,7 +139,7 @@ text of the subject mustn't be an existing relation name. @ = *X = FALSE; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RelationExists), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RelationExists), "that relation already exists", "and cannot have its definition amended now."); @@ -196,7 +196,7 @@ void Relations::parse_new_relation_further(parse_node *PN) { if (bp == NULL) internal_error("BP in relation not initially parsed"); if (Wordings::length(RW) > MAX_WORDS_IN_ASSEMBLAGE-4) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RelationNameTooLong), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RelationNameTooLong), "this is too long a name for a single relation to have", "and would become unwieldy."); RW = Wordings::truncate(RW, MAX_WORDS_IN_ASSEMBLAGE-4); @@ -416,7 +416,7 @@ these are clipped away, and also look at the multiplicities. if (right_bitmap & FRF_RBIT) frf = TRUE; if (frf && (left_unique != FALSE) && (right_unique != FALSE)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_FRFUnavailable), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_FRFUnavailable), "fast route-finding is only possible with various-to-various " "relations", "though this doesn't matter because with other relations the " @@ -433,7 +433,7 @@ change. So we reject any such misleading syntax. @ = if (right_bitmap & WHEN_RBIT) { if ((left_unique != NOT_APPLICABLE) || (right_unique != NOT_APPLICABLE)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_OneOrVariousWithWhen), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_OneOrVariousWithWhen), "this relation is a mixture of different syntaxes", "and must be simplified. If it is going to specify 'one' or " "'various' then it cannot also say 'when' the relation holds."); @@ -467,7 +467,7 @@ that $R(x, y)$ is true if and only if $R(y, x)$ is true. symmetric = TRUE; left_unique = FALSE; right_unique = FALSE; equivalence = TRUE; } if ((specified_one == TRUE) && (left_unique == FALSE)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BothOneAndMany), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BothOneAndMany), "the left-hand term in this relation seems to be both 'one' thing " "and also many things", "given the mention of 'each other'. Try removing the 'one'."); @@ -493,19 +493,19 @@ at this moment, and have no currency beyond that context. @ = if (Wordings::empty(CONW)) { if ((left_unique == FALSE) && (Wordings::nonempty(LCALLW))) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantCallLeft), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantCallLeft), "the left-hand term of this relation is not unique", "so you cannot assign a name to it using 'called'."); return; } if ((right_unique == FALSE) && (Wordings::nonempty(RCALLW))) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantCallRight), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantCallRight), "the right-hand term of this relation is not unique", "so you cannot assign a name to it using 'called'."); return; } if ((Wordings::nonempty(LCALLW)) && (Wordings::nonempty(RCALLW))) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantCallBoth), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantCallBoth), "the terms of the relation can't be named on both sides at once", "and because of that it's best to use a single even-handed name: " "for instance, 'Marriage relates one person to another (called " @@ -514,7 +514,7 @@ at this moment, and have no currency beyond that context. return; } if ((symmetric == FALSE) && (left_unique) && (right_unique) && (Wordings::nonempty(RCALLW))) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_OneToOneMiscalled), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_OneToOneMiscalled), "with a one-to-one relation which is not symmetrical " "only the left-hand item can be given a name using 'called'", "so this needs rephrasing to name the left in terms of the right " @@ -594,7 +594,7 @@ omitted from the index. Properties::Valued::now_used_for_non_typesafe_relation(prn); @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RelNotStoredInProperty), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RelNotStoredInProperty), "a '(called ...)' name can't be used for this relation", "because of the kinds involved in it. (Names for terms in a relation " "only work if it's possible to store the relation using properties, " @@ -795,7 +795,7 @@ int Relations::parse_relation_term_type(wording W, kind **set_K, char *side) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); Problems::quote_text(3, side); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RelatedKindsUnknown)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RelatedKindsUnknown)); Problems::issue_problem_segment( "In the relation definition %1, I am unable to understand the %3-hand " "side -- I was expecting that %2 would be either the name of a kind, " @@ -812,7 +812,7 @@ int Relations::check_finite_range(kind *K) { if (Kinds::Behaviour::is_an_enumeration(K)) return TRUE; if (K == NULL) return TRUE; /* to recover from earlier problems */ if ((Kinds::Compare::le(K, K_object)) || (Kinds::Behaviour::definite(K) == FALSE)) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RangeOverlyBroad), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RangeOverlyBroad), "relations aren't allowed to range over all 'objects' or all 'values'", "as these are too broad. A relation has to be between two kinds of " "object, or kinds of value. So 'Taming relates various people to " @@ -2194,7 +2194,7 @@ void Relations::check_OtoO_relation(binary_predicate *bp) { } if (leftc == 1) inf1 = inf; if (leftc == 2) { - Problems::Issue::infs_contradiction_problem(_p_(BelievedImpossible), + StandardProblems::infs_contradiction_problem(_p_(BelievedImpossible), World::Inferences::where_inferred(inf1), World::Inferences::where_inferred(inf), infs, "can only relate to one other thing in this way", "since the relation in question is one-to-one."); @@ -2204,7 +2204,7 @@ void Relations::check_OtoO_relation(binary_predicate *bp) { } LOOP_OVER(infs, inference_subject) { if (right_counts[infs->allocation_id] >= 2) { - Problems::Issue::infs_contradiction_problem(_p_(PM_Relation1to1Right), + StandardProblems::infs_contradiction_problem(_p_(PM_Relation1to1Right), World::Inferences::where_inferred(right_first[infs->allocation_id]), World::Inferences::where_inferred(right_second[infs->allocation_id]), infs, "can only relate to one other thing in this way", @@ -2261,7 +2261,7 @@ void Relations::check_OtoV_relation(binary_predicate *bp) { if (bp->form_of_relation == Relation_VtoO) { LOOP_OVER(infs, inference_subject) { if (left_counts[infs->allocation_id] >= 2) { - Problems::Issue::infs_contradiction_problem(_p_(PM_RelationVtoOContradiction), + StandardProblems::infs_contradiction_problem(_p_(PM_RelationVtoOContradiction), World::Inferences::where_inferred(left_first[infs->allocation_id]), World::Inferences::where_inferred(left_second[infs->allocation_id]), infs, "can only relate to one other thing in this way", @@ -2271,7 +2271,7 @@ void Relations::check_OtoV_relation(binary_predicate *bp) { } else { LOOP_OVER(infs, inference_subject) { if (right_counts[infs->allocation_id] >= 2) { - Problems::Issue::infs_contradiction_problem(_p_(PM_RelationOtoVContradiction), + StandardProblems::infs_contradiction_problem(_p_(PM_RelationOtoVContradiction), World::Inferences::where_inferred(right_first[infs->allocation_id]), World::Inferences::where_inferred(right_second[infs->allocation_id]), infs, "can only be related to by one other thing in this way", @@ -2602,7 +2602,7 @@ void Relations::compile_routine_to_decide(inter_name *rname, parse_node *spec = NULL; if ((W)) spec = <>; if ((spec == NULL) || (Dash::validate_conditional_clause(spec) == FALSE)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadRelationCondition), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadRelationCondition), "the condition defining this relation makes no sense to me", "although the definition was properly formed - it is only " "the part after 'when' which I can't follow."); diff --git a/inform7/core-module/Chapter 6/The Universal Relation.w b/inform7/core-module/Chapter 6/The Universal Relation.w index c31442082..7ad6e0f35 100644 --- a/inform7/core-module/Chapter 6/The Universal Relation.w +++ b/inform7/core-module/Chapter 6/The Universal Relation.w @@ -44,7 +44,7 @@ int Relations::Universal::REL_typecheck(binary_predicate *bp, if (bp == R_meaning) { if (Kinds::Compare::eq(kinds_of_terms[0], K_verb) == FALSE) { Problems::quote_kind(4, kinds_of_terms[0]); - Problems::Issue::tcp_problem(_p_(...), tck, + StandardProblems::tcp_problem(_p_(...), tck, "that asks whether something means something, and in Inform 'to mean' " "means that a particular relation is the meaning of a given verb. " "Here, though, we have %4 rather than the name of a verb."); @@ -52,7 +52,7 @@ int Relations::Universal::REL_typecheck(binary_predicate *bp, } if (Kinds::get_construct(kinds_of_terms[1]) != CON_relation) { Problems::quote_kind(4, kinds_of_terms[1]); - Problems::Issue::tcp_problem(_p_(...), tck, + StandardProblems::tcp_problem(_p_(...), tck, "that asks whether something means something, and in Inform 'to mean' " "means that a particular relation is the meaning of a given verb. " "Here, though, we have %4 rather than the name of a relation."); @@ -61,7 +61,7 @@ int Relations::Universal::REL_typecheck(binary_predicate *bp, } else { if (Kinds::get_construct(kinds_of_terms[0]) != CON_relation) { Problems::quote_kind(4, kinds_of_terms[0]); - Problems::Issue::tcp_problem(_p_(BelievedImpossible), tck, + StandardProblems::tcp_problem(_p_(BelievedImpossible), tck, "that asks whether something relates something, and in Inform 'to relate' " "means that a particular relation applies between two things. Here, though, " "we have %4 rather than the name of a relation."); @@ -69,7 +69,7 @@ int Relations::Universal::REL_typecheck(binary_predicate *bp, } if (Kinds::get_construct(kinds_of_terms[1]) != CON_combination) { Problems::quote_kind(4, kinds_of_terms[1]); - Problems::Issue::tcp_problem(_p_(BelievedImpossible), tck, + StandardProblems::tcp_problem(_p_(BelievedImpossible), tck, "that asks whether something relates something, and in Inform 'to relate' " "means that a particular relation applies between two things. Here, though, " "we have %4 rather than the combination of the two things."); @@ -82,7 +82,7 @@ int Relations::Universal::REL_typecheck(binary_predicate *bp, if (Kinds::Compare::compatible(cleft, rleft) == NEVER_MATCH) { Problems::quote_kind(5, kinds_of_terms[0]); Problems::quote_kind(4, cleft); - Problems::Issue::tcp_problem(_p_(BelievedImpossible), tck, + StandardProblems::tcp_problem(_p_(BelievedImpossible), tck, "that applies a relation to values of the wrong kinds: we have %5, but " "the left-hand value here is %4."); return NEVER_MATCH; @@ -90,7 +90,7 @@ int Relations::Universal::REL_typecheck(binary_predicate *bp, if (Kinds::Compare::compatible(cright, rright) == NEVER_MATCH) { Problems::quote_kind(5, kinds_of_terms[0]); Problems::quote_kind(4, cright); - Problems::Issue::tcp_problem(_p_(BelievedImpossible), tck, + StandardProblems::tcp_problem(_p_(BelievedImpossible), tck, "that applies a relation to values of the wrong kinds: we have %5, but " "the right-hand value here is %4."); return NEVER_MATCH; diff --git a/inform7/core-module/Chapter 7/Headings.w b/inform7/core-module/Chapter 7/Headings.w index bca5b17ef..b2ba4ca2e 100644 --- a/inform7/core-module/Chapter 7/Headings.w +++ b/inform7/core-module/Chapter 7/Headings.w @@ -509,7 +509,7 @@ void Sentences::Headings::write_as_xml(void) { text_stream xf_struct; text_stream *xf = &xf_struct; filename *F = Task::xml_headings_file(); if (STREAM_OPEN_TO_FILE(xf, F, UTF8_ENC) == FALSE) - Problems::Fatal::filename_related("Can't open headings file", F); + Problems::fatal_on_file("Can't open headings file", F); Sentences::Headings::write_headings_as_xml_inner(xf); STREAM_CLOSE(xf); } diff --git a/inform7/core-module/Chapter 7/Nonstructural Sentences.w b/inform7/core-module/Chapter 7/Nonstructural Sentences.w index 7ba86e152..89c53b0a3 100644 --- a/inform7/core-module/Chapter 7/Nonstructural Sentences.w +++ b/inform7/core-module/Chapter 7/Nonstructural Sentences.w @@ -124,7 +124,7 @@ void Sentences::VPs::visit(parse_node *p) { if (soa == PL::Bibliographic::Release::release_along_with_SMF) err = FALSE; #endif if (err) - Problems::Issue::unlocated_problem(Task::syntax_tree(), _p_(BelievedImpossible), /* not usefully testable, anyway */ + StandardProblems::unlocated_problem(Task::syntax_tree(), _p_(BelievedImpossible), /* not usefully testable, anyway */ "The options file placed in this installation of Inform's folder " "is incorrect, making use of a sentence form which isn't allowed " "in that situation. The options file is only allowed to contain " @@ -223,7 +223,7 @@ void Sentences::VPs::set_aspect_from_text(wording W, int new_state) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_UnknownDA)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_UnknownDA)); Problems::issue_problem_segment( "In the sentence %1, you asked to include '%2' in the " "debugging log, but there is no such debugging log topic."); @@ -337,7 +337,7 @@ action declarations continue with usually extensive further text: *X = 0; @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TwoLikelihoods), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TwoLikelihoods), "this sentence seems to have a likelihood qualification on both " "sides of the verb", "which is not allowed. 'The black door certainly is usually open' " @@ -519,7 +519,7 @@ Problem message than the one they will otherwise receive later on. @ = if (Annotations::read_int(current_sentence, verb_problem_issued_ANNOT) == FALSE) { Annotations::write_int(current_sentence, verb_problem_issued_ANNOT, TRUE); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NonPresentTense), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NonPresentTense), "assertions about the initial state of play must be given in the " "present tense", "so 'The cat is in the basket' is fine but not 'The cat has been in " @@ -532,7 +532,7 @@ Problem message than the one they will otherwise receive later on. @ = if (Annotations::read_int(current_sentence, verb_problem_issued_ANNOT) == FALSE) { Annotations::write_int(current_sentence, verb_problem_issued_ANNOT, TRUE); - Problems::Issue::negative_sentence_problem(Task::syntax_tree(), _p_(PM_NegatedVerb1)); + StandardProblems::negative_sentence_problem(Task::syntax_tree(), _p_(PM_NegatedVerb1)); } @h Logging verb numbers. diff --git a/inform7/core-module/Chapter 7/Of and From.w b/inform7/core-module/Chapter 7/Of and From.w index 6ba8c5541..0bf4c5c00 100644 --- a/inform7/core-module/Chapter 7/Of and From.w +++ b/inform7/core-module/Chapter 7/Of and From.w @@ -105,7 +105,7 @@ void Sentences::Rearrangement::check_sentence_for_direction_creation(parse_node if (!(((Node::get_text(pn->next))) && (<> == 0))) return; if (no_directions_noticed >= MAX_DIRECTIONS) { - Problems::Issue::limit_problem(Task::syntax_tree(), _p_(PM_TooManyDirections), + StandardProblems::limit_problem(Task::syntax_tree(), _p_(PM_TooManyDirections), "different directions", MAX_DIRECTIONS); return; } @@ -227,13 +227,13 @@ property names before they can do any damage.) *** *** ==> @ @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PropertyCalledArticle), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PropertyCalledArticle), "a property name cannot consist only of an article", "which this one seems to. It would lead to awful ambiguities. " "More likely, the end of the sentence has been lost somehow?"); @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PropertyCalledPresence), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PropertyCalledPresence), "a property name cannot consist only of the word 'presence'", "because this would lead to ambiguities with the rule clause " "'...in the presence of...' (For instance, when writing something " @@ -242,7 +242,7 @@ property names before they can do any damage.) "two to the property name: 'stage presence', say, would be fine."); @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PropertyNameForbidden), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PropertyNameForbidden), "a property name cannot contain quoted text or a comma", "which this one seems to. I think I must be misunderstanding: " "possibly you've added a subordinate clause which I can't " diff --git a/inform7/core-module/Chapter 7/Rule Subtrees.w b/inform7/core-module/Chapter 7/Rule Subtrees.w index 311c715dc..90ceba8b0 100644 --- a/inform7/core-module/Chapter 7/Rule Subtrees.w +++ b/inform7/core-module/Chapter 7/Rule Subtrees.w @@ -155,7 +155,7 @@ void Sentences::RuleSubtrees::parse_routine_structure(parse_node *routine_node) current_sentence = routine_node; Problems::quote_source(1, current_sentence); Problems::quote_source(2, mispunctuates_begin_end_syntax); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadOldSyntax)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadOldSyntax)); Problems::issue_problem_segment( "The rule or phrase definition %1 seems to use indentation and " "colons to group phrases together into 'if', 'repeat' or 'while' " @@ -170,7 +170,7 @@ void Sentences::RuleSubtrees::parse_routine_structure(parse_node *routine_node) Problems::quote_source(1, current_sentence); Problems::quote_source(2, uses_colon_syntax); Problems::quote_source(3, uses_begin_end_syntax); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BothBlockSyntaxes)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BothBlockSyntaxes)); Problems::issue_problem_segment( "The rule or phrase definition %1 seems to use both ways of grouping " "phrases together into 'if', 'repeat' and 'while' blocks at once. " @@ -192,7 +192,7 @@ void Sentences::RuleSubtrees::parse_routine_structure(parse_node *routine_node) current_sentence = routine_node; Problems::quote_source(1, current_sentence); Problems::quote_source(2, requires_colon_syntax); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NotInOldSyntax)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NotInOldSyntax)); Problems::issue_problem_segment( "The construction %2, in the rule or phrase definition %1, " "is only allowed if the rule is written in the 'new' format, " @@ -377,7 +377,7 @@ report more or less helpfully. @ = current_sentence = routine_node; Problems::quote_source_eliding_begin(1, current_sentence); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NonflushRule)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NonflushRule)); Problems::issue_problem_segment( "The phrase or rule definition %1 is written using tab indentations " "to show how its phrases are to be grouped together. But in that " @@ -542,7 +542,7 @@ indentation implicitly requires it. current_sentence = routine_node; Problems::quote_source_eliding_begin(1, current_sentence); Problems::quote_source_eliding_begin(2, first_misaligned_phrase); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_MisalignedIndentation)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_MisalignedIndentation)); Problems::issue_problem_segment( "The phrase or rule definition %1 is written using the 'colon " "and indentation' syntax for its 'if's, 'repeat's and 'while's, " @@ -553,7 +553,7 @@ indentation implicitly requires it. "definition seems to be %2, in case that helps. %PThis sometimes " "happens even when the code looks about right, to the eye, if rows " "of spaces have been used to indent phrases instead of tabs."); - Problems::Issue::diagnose_further(); + Problems::Using::diagnose_further(); Problems::issue_problem_end(); } @@ -570,7 +570,7 @@ indentation implicitly requires it. current_sentence = routine_node; Problems::quote_source_eliding_begin(1, current_sentence); Problems::quote_source_eliding_begin(2, first_overindented_phrase); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TooMuchIndentation)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TooMuchIndentation)); Problems::issue_problem_segment( "The phrase or rule definition %1 is written using tab indentations " "to show how its phrases are to be grouped together. But the level " @@ -584,7 +584,7 @@ indentation implicitly requires it. current_sentence = routine_node; Problems::quote_source_eliding_begin(1, current_sentence); Problems::quote_source_eliding_begin(2, run_on_at); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RunOnsInTabbedRoutine)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RunOnsInTabbedRoutine)); Problems::issue_problem_segment( "The phrase or rule definition %1 is written using the 'colon " "and indentation' syntax for its 'if's, 'repeat's and 'while's, " @@ -605,7 +605,7 @@ think of a sensible use. Problems::quote_source_eliding_begin(1, current_sentence); Problems::quote_source_eliding_begin(2, prev); Problems::quote_source_eliding_begin(3, p); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_EmptyIndentedBlock)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_EmptyIndentedBlock)); Problems::issue_problem_segment( "The phrase or rule definition %1 is written using the 'colon " "and indentation' syntax for its 'if's, 'repeat's and 'while's, " @@ -623,7 +623,7 @@ think of a sensible use. current_sentence = routine_node; Problems::quote_source_eliding_begin(1, current_sentence); Problems::quote_source_eliding_begin(2, p); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NonCaseInIf)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NonCaseInIf)); Problems::issue_problem_segment( "In the phrase or rule definition %1, the phrase %2 came as a " "surprise since it was not a case in an 'if X is...' but was " @@ -636,7 +636,7 @@ think of a sensible use. current_sentence = p; if (csp->subordinate_to == if_CSP) { LOG("$T\n", routine_node); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_MisalignedOtherwise), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_MisalignedOtherwise), "this doesn't match a corresponding 'if'", "as it must. An 'otherwise' must be vertically underneath the " "'if' to which it corresponds, at the same indentation, and " @@ -644,7 +644,7 @@ think of a sensible use. "'if' must do the same."); } if (csp->subordinate_to == switch_CSP) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_MisalignedCase), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_MisalignedCase), "this seems to be misplaced since it is not a case within an " "'if X is...'", "as it must be. Each case must be placed one tab stop in from " @@ -657,12 +657,12 @@ think of a sensible use. if ((indent_misalign == FALSE) && (suppress_further_problems == FALSE)) { current_sentence = p; if ((csp == default_case_CSP) || (csp == case_CSP)) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_DefaultCaseNotLast), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DefaultCaseNotLast), "'otherwise' must be the last clause if an 'if ... is:'", "and in particular it has to come after all the '-- V:' " "case values supplied."); else - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_MisarrangedOtherwise), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_MisarrangedOtherwise), "this seems to be misplaced since it is out of sequence within its 'if'", "with an 'otherwise if...' coming after the more general 'otherwise' " "rather than before. (Note that an 'otherwise' or 'otherwise if' must " @@ -698,7 +698,7 @@ whichever syntax is used. We finally make a meaningful tree out of it. } if (overflow_point) { current_sentence = overflow_point; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BlockNestingTooDeep), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BlockNestingTooDeep), "compound phrases have gone too deep", "perhaps because many have begun but not been properly ended?"); } @@ -812,7 +812,7 @@ and always passing these checks. But the problem messages are kept for the sake of old-format source text, and for refuseniks. @ = - Problems::Issue::sentence_problem_with_note(Task::syntax_tree(), _p_(PM_EndWithoutBegin), + StandardProblems::sentence_problem_with_note(Task::syntax_tree(), _p_(PM_EndWithoutBegin), "this is an 'end' with no matching 'begin'", "which should not happen: every phrase like 'if ... begin;' " "should eventually be followed by its bookend 'end if'. " @@ -825,14 +825,14 @@ of old-format source text, and for refuseniks. Problems::quote_source(1, current_sentence); Problems::quote_wide_text(2, prior->keyword); Problems::quote_source(3, prev_p); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_WrongEnd)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_WrongEnd)); Problems::issue_problem_segment( "You wrote %1, but the end I was expecting next was 'end %2', " "finishing the block you began with %3."); Problems::issue_problem_end(); @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BeginWithoutEnd), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BeginWithoutEnd), "the definition of the phrase ended with no matching 'end' for " "this 'begin'", "bearing in mind that every begin must have a matching end, and " @@ -841,11 +841,11 @@ of old-format source text, and for refuseniks. @ = if (csp == otherwise_CSP) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_OtherwiseWithoutIf), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_OtherwiseWithoutIf), "this is an 'else' or 'otherwise' with no matching 'if' (or 'unless')", "which must be wrong."); else if (csp == otherwise_if_CSP) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_OtherwiseIfMisplaced), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_OtherwiseIfMisplaced), "the 'otherwise if' clause here seems not to be occurring inside " "a large 'if'", "and seems to be freestanding instead. (Though 'otherwise ...' can " @@ -853,7 +853,7 @@ of old-format source text, and for refuseniks. "course of action, 'otherwise if...' is a different matter, and is " "used to divide up larger-scale instructions.)"); else - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), "this clause can't occur outside of a control phrase", "which suggests that the structure of this routine is wrong."); @@ -861,13 +861,13 @@ of old-format source text, and for refuseniks. if ((csp == otherwise_CSP) || (csp == otherwise_if_CSP)) { Problems::quote_source(1, current_sentence); Problems::quote_wide_text(2, context->keyword); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_OtherwiseInNonIf)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_OtherwiseInNonIf)); Problems::issue_problem_segment( "The %1 here did not make sense inside a " "'%2' structure: it's provided for 'if' (or 'unless')."); Problems::issue_problem_end(); } else - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), "this clause is wrong for the phrase containing it", "which suggests that the structure of this routine is wrong."); @@ -882,19 +882,19 @@ of old-format source text, and for refuseniks. oi = TRUE; } if (doubled) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_DoubleOtherwise), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DoubleOtherwise), "that makes two unconditional 'otherwise' or 'else' clauses " "for this 'if'", "which is forbidden since 'otherwise' is meant to be a single " "(optional) catch-all clause at the end."); else if (oi) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_OtherwiseIfAfterOtherwise), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_OtherwiseIfAfterOtherwise), "this seems to be misplaced since it is out of sequence within its 'if'", "with an 'otherwise if...' coming after the more general 'otherwise' " "rather than before. (If there's an 'otherwise' clause, it has to be " "the last clause of the 'if'.)"); else - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), "'otherwise' must be the last clause", "but it seems not to be."); @@ -902,7 +902,7 @@ of old-format source text, and for refuseniks. and the structure of that was checked at indentation time, but just in case. @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), "'otherwise' must be the last clause", "which must be wrong."); @@ -1121,8 +1121,8 @@ void Sentences::RuleSubtrees::unroll_says(parse_node *cb_node, wording W, int de @ And the more specialised: @ = - it_is_not_worth_adding = TRUE; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TSWithComma), + Strings::TextSubstitutions::it_is_not_worth_adding(); + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TSWithComma), "a substitution contains a comma ','", "which is against the rules, because 'say' is a special phrase in " "which the comma divides items in a list of things to say, and so it " @@ -1132,14 +1132,14 @@ void Sentences::RuleSubtrees::unroll_says(parse_node *cb_node, wording W, int de "option - say 'the best route from A to B, using even locked doors' - " "you'll need to put this in a 'let' variable first and then say that, " "or else define a better text substitution to do the job for you.)"); - it_is_not_worth_adding = FALSE; + Strings::TextSubstitutions::it_is_worth_adding(); return; @ = - it_is_not_worth_adding = TRUE; + Strings::TextSubstitutions::it_is_not_worth_adding(); if ((p[k+1] == 'u') && (p[k+2] == 'n') && (p[k+3] == 'i') && (p[k+4] == 'c') && (p[k+5] == 'o') && (p[k+6] == 'd') && (p[k+7] == 'e') && (p[k+8] == ' ')) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NestedUSubstitution), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NestedUSubstitution), "the text here contains one substitution '[...]' inside another", "which is not allowed. Actually, it looks as if you might have got " "into this by typing an exotic character as part of the name of a " @@ -1147,32 +1147,32 @@ void Sentences::RuleSubtrees::unroll_says(parse_node *cb_node, wording W, int de "for the appropriate Unicode character code number N. Either way - " "this isn't allowed."); } else { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NestedSubstitution), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NestedSubstitution), "the text here contains one substitution '[...]' inside another", "which is not allowed. (If you just wanted a literal open and closed " "square bracket, use '[bracket]' and '[close bracket]'.)"); } - it_is_not_worth_adding = FALSE; + Strings::TextSubstitutions::it_is_worth_adding(); return; @ = - it_is_not_worth_adding = TRUE; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnclosedSubstitution), + Strings::TextSubstitutions::it_is_not_worth_adding(); + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnclosedSubstitution), "the text here uses an open square bracket '[', which opens a substitution " "in the text, but doesn't close it again", "so that the result is malformed. (If you just wanted a literal open " "square bracket, use '[bracket]'.)"); - it_is_not_worth_adding = FALSE; + Strings::TextSubstitutions::it_is_worth_adding(); return; @ = - it_is_not_worth_adding = TRUE; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnopenedSubstitution), + Strings::TextSubstitutions::it_is_not_worth_adding(); + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnopenedSubstitution), "the text here uses a close square bracket ']', which closes a substitution " "in the text, but never actually opened it", "with a matching '['. (If you just wanted a literal close square bracket, " "use '[close bracket]'.)"); - it_is_not_worth_adding = FALSE; + Strings::TextSubstitutions::it_is_worth_adding(); return; @ Something devious happens when production (b) of is matched. @@ -1201,20 +1201,20 @@ to parse the list. @ So now just the problem messages: @ = - it_is_not_worth_adding = TRUE; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TSWithPunctuation), + Strings::TextSubstitutions::it_is_not_worth_adding(); + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TSWithPunctuation), "a substitution contains a '.', ':' or ';'", "which suggests that a close square bracket ']' may have gone astray."); - it_is_not_worth_adding = FALSE; + Strings::TextSubstitutions::it_is_worth_adding(); @ And: @ = - it_is_not_worth_adding = TRUE; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_EmptySubstitution), + Strings::TextSubstitutions::it_is_not_worth_adding(); + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_EmptySubstitution), "the text here contains an empty substitution '[]'", "which is not allowed. To say nothing - well, say nothing."); - it_is_not_worth_adding = FALSE; + Strings::TextSubstitutions::it_is_worth_adding(); @ That just leaves one utility routine, for manufacturing end nodes which match a given begin node. diff --git a/inform7/core-module/Chapter 9/Assemblies.w b/inform7/core-module/Chapter 9/Assemblies.w index 68836b785..7ab04cec5 100644 --- a/inform7/core-module/Chapter 9/Assemblies.w +++ b/inform7/core-module/Chapter 9/Assemblies.w @@ -148,7 +148,7 @@ void Assertions::Assemblies::make_generalisation(parse_node *look_for, parse_nod (Kinds::Behaviour::has_named_constant_values(instance_kind) == FALSE)) { LOG("$T", look_for); LOG("$T", what_to_make); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_AssemblyOnFixedKind), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_AssemblyOnFixedKind), "this generalisation can't be made", "because I only use generalisations to talk about values which can be " "created as needed, like things or scenes - not about those always " @@ -160,7 +160,7 @@ void Assertions::Assemblies::make_generalisation(parse_node *look_for, parse_nod if ((what_to_make) && (Node::get_type(what_to_make->down) == EVERY_NT)) { LOG("$T", look_for); LOG("$T", what_to_make); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_AssemblyOnBothSides), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_AssemblyOnBothSides), "this generalisation can't be made", "because it uses 'every' or some similar generalisation on both sides, " "which is too rich for my taste."); @@ -188,7 +188,7 @@ void Assertions::Assemblies::make_generalisation(parse_node *look_for, parse_nod LOG("Generalisation:\n"); LOG("$T", look_for); LOG("$T", what_to_make); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_AssemblyRegress), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_AssemblyRegress), "this generalisation would be too dangerous", "because it would lead to infinite regress in the assembly process. Sometimes " "this happens if you have set up matters with text like 'A container is in every " @@ -355,7 +355,7 @@ $L$ but each $L$ must contain a $K$. Problems::quote_subject(2, infs_k); int max = MAX_ASSEMBLY_SIZE; Problems::quote_number(3, &max); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_AssemblyLoop)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_AssemblyLoop)); Problems::issue_problem_segment( "Making a new %2 seems to result in an assembly which can never end, " "or which at any rate led to some %3 further constructions " diff --git a/inform7/core-module/Chapter 9/Implications.w b/inform7/core-module/Chapter 9/Implications.w index 777f933cd..7f362ec08 100644 --- a/inform7/core-module/Chapter 9/Implications.w +++ b/inform7/core-module/Chapter 9/Implications.w @@ -45,7 +45,7 @@ void Assertions::Implications::new(parse_node *px, parse_node *py) { } @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ImplicationCertain), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ImplicationCertain), "that's an implication which is too certain for me", "since a sentence like this talks about a generality of things in terms of " "one either/or property implying another, and I can only handle those as " @@ -86,7 +86,7 @@ void Assertions::Implications::new(parse_node *px, parse_node *py) { @ = if (Calculus::Propositions::Assert::testable_at_compile_time(premiss) == FALSE) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadImplicationDomain), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadImplicationDomain), "that's an implication where the condition to qualify is not " "one that I can determine in advance of the start of play", "since it involves more than simple either/or properties " @@ -98,7 +98,7 @@ void Assertions::Implications::new(parse_node *px, parse_node *py) { @ = property *prn = Adjectives::Meanings::has_EORP_meaning(Node::get_aph(py), NULL); if (prn == NULL) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ImplicationValueProperty), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ImplicationValueProperty), "that's an implication where the outcome is an adjective other than " "a simple either/or property", "which is the only form of implication I can handle."); diff --git a/inform7/core-module/Chapter 9/Make Assertions.w b/inform7/core-module/Chapter 9/Make Assertions.w index 88ea2945e..b50fd2bba 100644 --- a/inform7/core-module/Chapter 9/Make Assertions.w +++ b/inform7/core-module/Chapter 9/Make Assertions.w @@ -116,7 +116,7 @@ void Assertions::Maker::make_assertion_recursive_inner(parse_node *px, parse_nod if ((prevailing_mood == INITIALLY_CE) && ((Node::get_type(px) != PROPER_NOUN_NT) || (Node::get_type(py) != PROPER_NOUN_NT))) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_MisplacedInitially), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_MisplacedInitially), "you can only say 'initially' when creating variables using 'is'", "so 'The squirrel population is initially 0' is fine, but not " "'The acorn is initially carried by Mr Hedges.' - probably you " @@ -127,7 +127,7 @@ void Assertions::Maker::make_assertion_recursive_inner(parse_node *px, parse_nod (Rvalues::is_CONSTANT_construction(Node::get_evaluation(px), CON_property) == FALSE) && (Lvalues::is_actual_NONLOCAL_VARIABLE(Node::get_evaluation(px)) == FALSE) && (Node::get_type(px) == PROPER_NOUN_NT)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_VagueAboutSpecific), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_VagueAboutSpecific), "you can only equivocate with 'usually', 'rarely', " "'always' and the like when talking about kinds of thing", "because when a specific thing is involved you should say " @@ -141,7 +141,7 @@ void Assertions::Maker::make_assertion_recursive_inner(parse_node *px, parse_nod ((Node::get_type(py) == COMMON_NOUN_NT) && (Node::get_evaluation(py)) && (Annotations::read_int(py, multiplicity_ANNOT) > 1) && (Node::get_type(px) != RELATIONSHIP_NT))) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_MultiplyVague), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_MultiplyVague), "multiple objects can only be put into relationships", "by saying something like 'In the Drawing Room are two women.', " "and all other assertions with multiple objects are disallowed: " @@ -288,7 +288,7 @@ at which point it becomes a |PROPER_NOUN_NT| node.) >> A container with description "White" is a container with description "Black". @ = - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_WithIsWith), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_WithIsWith), "you can't say that one general description is another ", "for instance by writing 'A container with carrying capacity 10 is a " "container with description \"Handy.\"'."); @@ -307,7 +307,7 @@ at which point it becomes a |PROPER_NOUN_NT| node.) like properties. @ = - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_XofYisZofW), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_XofYisZofW), "this seems to say two different properties are not simply equal " "but somehow the same thing", "like saying that 'the printed name of the millpond is the " @@ -318,7 +318,7 @@ like properties. @h Case 7. @ = - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_BadXofY), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_BadXofY), "this is the wrong way around if you want to specify a property", "like saying that '10 is the score of the platinum pyramid', " "which is poor style. (Though sweet are the uses of adversity.)"); @@ -372,7 +372,7 @@ specifying its edibility. Problems::quote_subject(1, inst); Problems::quote_source(2, current_sentence); Problems::quote_source(3, InferenceSubjects::where_created(inst)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_InstanceNowKind)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_InstanceNowKind)); Problems::issue_problem_segment( "You wrote '%2', but that seems to say that some " "room or thing already created ('%1', created by '%3') is now to " @@ -395,7 +395,7 @@ specifying its edibility. Problems::quote_source(1, current_sentence); Problems::quote_property(2, prn); Problems::quote_wording_as_source(3, prn->name); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_KindAsProperty)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_KindAsProperty)); Problems::issue_problem_segment( "You wrote '%1', but that seems to say that a property " "(%3) has to be a kind as well. It is sometimes okay for a " @@ -415,7 +415,7 @@ specifying its edibility. Problems::quote_source(1, current_sentence); Problems::quote_kind_of(2, val); Problems::quote_wording_as_source(3, Node::get_text(px)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_KindAsActualValue)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_KindAsActualValue)); Problems::issue_problem_segment( "You wrote '%1', but that seems to say that a value already " "in existence (%3) has to be a kind as well. (It's %2.)"); @@ -425,14 +425,14 @@ specifying its edibility. } @ = - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_KindOfKindDisallowed), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_KindOfKindDisallowed), "you aren't allowed to make new kinds of kinds", "only kinds of things which already exist. So 'A fox is a kind of animal' " "is fine, but 'A tricky kind is a kind of kind' isn't allowed."); return; @ = - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_KindOfEveryDisallowed), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_KindOfEveryDisallowed), "you aren't allowed to make a kind of everything", "or of everything matching a description. 'A badger is a kind of animal' " "is fine, but 'A gene is a kind of every animal' isn't allowed. (Probably " @@ -440,7 +440,7 @@ specifying its edibility. return; @ = - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_KindUncertainDisallowed), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_KindUncertainDisallowed), "you aren't allowed to make a kind in a way expressing certainty or doubt", "so 'A badger is a kind of animal' is fine, but 'A fungus is usually a " "kind of every animal' isn't allowed, and nor is 'A fern is never a kind " @@ -475,7 +475,7 @@ further sub-cases later. Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(py)); Problems::quote_kind_of(3, Node::get_evaluation(py)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyObj2)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyObj2)); Problems::issue_problem_segment( "In %1 you give a value of a property as '%2', but it " "seems to be a general description of a value (%3) rather than " @@ -495,14 +495,14 @@ further sub-cases later. } } #endif - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_PeculiarProperty), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_PeculiarProperty), "that is a very peculiar property value", "and ought to be something more definite and explicit."); @h Case 12. @ = - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_KindOfIs), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_KindOfIs), "that seems to say that a new kind is the same as something else", "like saying 'A kind of container is a canister': which ought to be put the " "other way round, 'A canister is a kind of container'."); @@ -514,7 +514,7 @@ further sub-cases later. if (Adjectives::Meanings::has_ENUMERATIVE_meaning(Node::get_aph(py))) { property *prn = Properties::Valued::obtain(Node::get_text(px->down->next)); if (Node::get_type(px->down) == WITH_NT) { - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_EOOwnerMutable), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_EOOwnerMutable), "either/or properties have to be given to clearly identifiable " "owners", "rather than to a collection of owners which might vary during " @@ -526,7 +526,7 @@ further sub-cases later. Node::get_subject(px->down), py); } } else { - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_NonAdjectivalProperty), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_NonAdjectivalProperty), "that property can't be used adjectivally as a value", "since it is an adjective applying to a thing but is " "not a name from a range of possibilities."); @@ -550,7 +550,7 @@ further sub-cases later. @h Case 16. "Every K is Y" and other oddities. @ = - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_BadEvery), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_BadEvery), "'every' (or 'always') can't be used in that way", "and should be reserved for sentences like 'A coin is in every room'."); @@ -560,7 +560,7 @@ Even then, of course, "everywhere" implicitly means "in every room", not "every room". @ = - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_BadEvery2), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_BadEvery2), "'every' can't be used in that way", "and should be reserved for sentences like 'A coin is in every room'."); @@ -595,7 +595,7 @@ pretty improbable: @ = if (Node::get_subject(py)) - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_ActionEquated), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_ActionEquated), "an action can't be the same as a thing", "so my guess is that this is an attempt to categorise an action which went " "wrong because there was already something of that name in existence. For " @@ -604,7 +604,7 @@ pretty improbable: "actions at once to a named kind of action, like 'Taking and dropping are " "manipulation.' - only one can be named at a time.)"); else - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_ActionEquated2), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_ActionEquated2), "that means something else already", "so it will only confuse things if we use it for a kind of action."); @@ -616,7 +616,7 @@ a spatial location. @ = if (Assertions::Refiner::turn_player_to_yourself(px)) { Assertions::Maker::make_assertion_recursive(px, py); return; } if (Assertions::Refiner::turn_player_to_yourself(py)) { Assertions::Maker::make_assertion_recursive(px, py); return; } - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_IntangibleRelated), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_IntangibleRelated), "this seems to give a worldly relationship to something intangible", "like saying that 'in the box is a text'. Perhaps it came " "to this because you gave something physical a name which was " @@ -630,7 +630,7 @@ a spatial location. >> The position of the weathervane is east of the church. @ = - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_XofYRelated), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_XofYRelated), "this seems to say that a property of something is not simply equal " "to what happens at the moment to satisfy some relationship, but " "conceptually the same as that relationship", @@ -662,7 +662,7 @@ possible to coerce the left side to a noun, we will. @h Case 23. And so on. @ = - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_DescriptionIsOther), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_DescriptionIsOther), "this seems to say that a general description is something else", "like saying that 'a door is 20'."); @@ -671,7 +671,7 @@ possible to coerce the left side to a noun, we will. >> Taking something is open. @ = - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_ActionAdjective), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_ActionAdjective), "that is already the name of a property", "so it will only confuse things if we use it for a kind of action."); @@ -717,7 +717,7 @@ but not in this context. if ((Node::get_text(px))) Activities::add_variable(av, py->down); else - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_BadActivityRef), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_BadActivityRef), "an activity has to be formally referred to in a way making clear that " "it is indeed a rulebook when we give it named values", "to reduce the risk of ambiguity. So 'The printing the banner text " @@ -738,7 +738,7 @@ but not in this context. if ((Node::get_text(px))) Rulebooks::add_variable(rb, py->down); else - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_BadRulebookRef), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_BadRulebookRef), "a rulebook has to be formally referred to in a way making clear that " "it is indeed a rulebook when we give it named values", "to reduce the risk of ambiguity. So 'The every turn rulebook has a " @@ -750,14 +750,14 @@ but not in this context. return; @ = - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_TooVagueForVariables), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_TooVagueForVariables), "this is too vague a description of the owner of the property", "so that I don't know where to put this. Something like 'A person " "has a number called age' is fine, but 'A kind has a number called " "age' is not. Which kind?"); @ = - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_HasNoVariables), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_HasNoVariables), "only an object, kind, rulebook, action or activity can be allowed to have " "properties or variables", "so for instance 'A door has a colour' is fine but not 'A number has a length'."); @@ -777,7 +777,7 @@ but in fact isn't one; if (traverse == 1) return; Assertions::Refiner::turn_player_to_yourself(px->down); if ((Node::get_text(py))) { - Problems::Issue::negative_sentence_problem(Task::syntax_tree(), _p_(PM_NonValue)); return; + StandardProblems::negative_sentence_problem(Task::syntax_tree(), _p_(PM_NonValue)); return; } parse_node *owner = Node::get_evaluation(px->down); @@ -828,7 +828,7 @@ properties) and for kinds (which do, but differently). return; } else if (Node::get_type(px->down) != COMMON_NOUN_NT) { LOG("$T\n", current_sentence); - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_Unspecifiable), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_Unspecifiable), "this tries to set specification text for a particular value", "rather than a kind of value. 'Specification' is a special property used " "only to annotate the Index, and it makes no sense to set this property for " @@ -840,7 +840,7 @@ properties) and for kinds (which do, but differently). if (((W)) && (Rvalues::is_CONSTANT_of_kind(<>, K_text))) { Word::dequote(Wordings::first_wn(W)); } else { - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_SpecNotText), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_SpecNotText), "this tries to set a specification to something other than literal quoted text", "which will not work. 'Specification' is a special property used only to " "annotate the Index, and specifically the Kinds index, so it makes no sense to " @@ -849,7 +849,7 @@ properties) and for kinds (which do, but differently). } @ = - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_OverspecifiedSpec), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_OverspecifiedSpec), "this tries to set a property for something more complicated than a single thing " "named without qualifications", "and that isn't allowed. For instance, 'The description of the Great Portal is " @@ -860,7 +860,7 @@ properties) and for kinds (which do, but differently). "substitutions.)"); @ = - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_BadInferenceSubject), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_BadInferenceSubject), "this tries to set a property for a value which can't have properties", "and that isn't allowed. For instance, 'The description of the Great Portal is " "\"It's open.\"' would be fine, if Great Portal were a room, but 'The description " @@ -868,7 +868,7 @@ properties) and for kinds (which do, but differently). "properties."); @ = - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_GeneralitySpec), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_GeneralitySpec), "this tries to set a property for a complicated generality of items all at once", "which can lead to ambiguities. For instance, 'The description of an open door " "is \"It's open.\"' is not allowed: if we followed Inform's normal conventions " @@ -892,7 +892,7 @@ properties) and for kinds (which do, but differently). if ((PL::Actions::Patterns::is_valid(apy)) && (PL::Actions::Patterns::is_named(apy) == FALSE)) { LOG("Actions: $A and $A\n", apx, apy); - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_ActionsEquated), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_ActionsEquated), "two actions are rather oddly equated here", "which would only make sense if the second were a named pattern of actions " "like (say) 'unseemly behaviour'."); @@ -921,7 +921,7 @@ in this case. #endif return; } - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_RelationsEquated), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_RelationsEquated), "this says that two different relations are the same", "like saying that 'in the box is on the table'. (Sometimes this " "happens if I misinterpret names of places like 'In Prison' or " @@ -942,13 +942,13 @@ opera about a dog, "Collared Is Bowser".) @ = if (Node::get_subject(py)) - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_AdjectiveIsObject), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_AdjectiveIsObject), "that seems to say that an adjective is a noun", "like saying 'Open are the doubled doors': which I'm picky about, preferring " "it written the other way about ('The doubled doors are open'). Less poetic, " "but clearer style."); else - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_AdjectiveIsValue), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_AdjectiveIsValue), "that suggests that an adjective has some sort of value", "like saying 'Open is a number' or 'Scenery is 5': but of course an adjective " "represents something which is either true or false."); @@ -964,13 +964,13 @@ opera about a dog, "Collared Is Bowser".) if ((Node::get_subject(px)) && (InferenceSubjects::domain(Node::get_subject(px)))) { Problems::quote_source(1, current_sentence); Problems::quote_source(2, py); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_KindIsAction)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_KindIsAction)); Problems::issue_problem_segment( "You wrote %1: unfortunately %2 is already the name of an action, " "and it would only confuse things if we used it for a value as well."); Problems::issue_problem_end(); } else { - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_ObjectIsAction), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_ObjectIsAction), "that is putting the definition back to front", "since I need these categorisations of actions to take the form 'Kissing a " "woman is love', not 'Love is kissing a woman'. (This is really because it " @@ -981,7 +981,7 @@ opera about a dog, "Collared Is Bowser".) @h Case 33. "Every K is every L." @ = - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_EveryEquated), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_EveryEquated), "I can't do that", "Dave."); @h Case 34. The "Genevieve" problem message is a finicky stylistic one, and @@ -1007,7 +1007,7 @@ this ought to be allowed... } if (Kinds::Compare::le(Specifications::to_kind(Node::get_evaluation(px)), K_object)) - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_KindRelated), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_KindRelated), "something described only by its kind should not be given a " "specific place or role in the world", "to avoid ambiguity. For instance, suppose 'car' is a kind. Then " @@ -1018,7 +1018,7 @@ this ought to be allowed... "though more specific ones like 'a car called Genevieve is in the " "garage' are fine, as is the reverse, 'In the garage is a car.'"); else - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_KOVRelated), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_KOVRelated), "this seems to give a worldly relationship to something intangible", "possibly due to an accidental clash of names between a kind of " "value and something in the real world. " @@ -1130,7 +1130,7 @@ two whole domains. (We have the "kind of..." syntax instead.) Problems::quote_subject(2, left_object); Problems::quote_subject(3, right_kind); if (left_object == right_kind) { - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_SameKindEquated)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_SameKindEquated)); Problems::issue_problem_segment( "The sentence %1 seems to be telling me that two descriptions, " "both forms of %2, are the same. That's a little puzzling - " @@ -1138,7 +1138,7 @@ two whole domains. (We have the "kind of..." syntax instead.) NAME_DESCRIPTION_CLASH_NOTE); Problems::issue_problem_end(); } else { - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_DescriptionsEquated)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_DescriptionsEquated)); Problems::issue_problem_segment( "The sentence %1 seems to be telling me that two descriptions, " "one a form of %2 and the other of %3, are the same. That's a " @@ -1157,7 +1157,7 @@ two whole domains. (We have the "kind of..." syntax instead.) Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(px)); Problems::quote_wording(3, Node::get_text(py)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_VariablesEquated)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_VariablesEquated)); Problems::issue_problem_segment( "The sentence %1 seems to tell me that '%2', which describes " "a kind of variable, is the same as '%3', another description " @@ -1171,7 +1171,7 @@ two whole domains. (We have the "kind of..." syntax instead.) @ = if (Specifications::is_new_variable_like(Node::get_evaluation(py))) { - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_VarKOVClash), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_VarKOVClash), "the name supplied for this new variable is a piece of text " "which is not available because it has a rival meaning already", "as a result of definitions made elsewhere. (Sometimes these " @@ -1239,7 +1239,7 @@ allow one case, where the declaration is redundant and harmless.) Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(px)); Problems::quote_kind_of(3, a_spec); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ChangedKind)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ChangedKind)); Problems::issue_problem_segment( "Before reading %1, I already knew that '%2' is %3, " "and it is too late to change now."); @@ -1272,7 +1272,7 @@ contradicted. Problems::quote_kind(4, kind_as_declared); else Problems::quote_kind(4, Specifications::to_kind(Node::get_evaluation(px))); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_GlobalRedeclared)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_GlobalRedeclared)); Problems::issue_problem_segment( "The sentence %1 seems to tell me that '%2', which has already been " "declared as %4, is instead %3 - but that would be a contradiction."); @@ -1291,7 +1291,7 @@ file: this may possibly be useful to I6 hackers. @ = if ((var_set == FALSE) && (Kinds::Compare::eq(a_kind, K_number))) { Problems::quote_source(1, current_sentence); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_Sarcasm1)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_Sarcasm1)); Problems::issue_problem_segment( "%1: Grateful as I generally am for your guidance, " "I think perhaps I could manage without this sentence."); @@ -1308,7 +1308,7 @@ file: this may possibly be useful to I6 hackers. if (Kinds::Compare::eq(a_kind, K_number)) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(px)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_Sarcasm2)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_Sarcasm2)); Problems::issue_problem_segment("%1: That, sir, is a damnable lie. '%2' is a number."); Problems::issue_problem_end(); return; @@ -1316,7 +1316,7 @@ file: this may possibly be useful to I6 hackers. if (Kinds::Compare::eq(a_kind, K_text)) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(px)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_Sarcasm3)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_Sarcasm3)); Problems::issue_problem_segment("%1: And I am the King of Siam. '%2' is some text."); Problems::issue_problem_end(); return; @@ -1324,7 +1324,7 @@ file: this may possibly be useful to I6 hackers. @ = Problems::quote_source(1, current_sentence); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_DescAsLiteral)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_DescAsLiteral)); Problems::issue_problem_segment("%1: this seems to be using a description " "as if it were a constant value, which isn't allowed. (Descriptions " "can only be used as values to a limited extent.)"); @@ -1342,7 +1342,7 @@ the "creation proposition" of Y, and we now assert this to be true about X. if (prop) { if ((Calculus::Variables::number_free(prop) == 0) && (left_object)) { LOG("Proposition is: $D\n", prop); - Problems::Issue::subject_problem_at_sentence(_p_(PM_SubjectNotFree), + StandardProblems::subject_problem_at_sentence(_p_(PM_SubjectNotFree), left_object, "seems to be set equal to something in a complicated relationship " "with something else again", @@ -1366,7 +1366,7 @@ the "creation proposition" of Y, and we now assert this to be true about X. @; if (Kinds::Compare::le(Specifications::to_kind(Node::get_evaluation(py)), K_object)) Assertions::Maker::issue_value_equation_problem(py, px); - else Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_CommonIsProper), + else Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_CommonIsProper), "this seems to say that a general description is something else", "like saying that 'a door is 20'."); @@ -1420,7 +1420,7 @@ There is also one case in which an object can be set equal to another object: if (Rvalues::is_object(Node::get_evaluation(py))) @ else if (Rvalues::is_CONSTANT_construction(Node::get_evaluation(py), CON_property)) - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_ObjectIsProperty), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_ObjectIsProperty), "that seems to say that some object is a property", "like saying 'The brick building is the description': if you want to specify " "the description of the current object, try putting the sentence the other way " @@ -1428,7 +1428,7 @@ There is also one case in which an object can be set equal to another object: else if (Node::get_subject(px)) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(px)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ObjectIsValue)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ObjectIsValue)); Problems::issue_problem_segment( "I am reading the sentence %1 as saying that a thing called " "'%2' is a value, but this makes no sense to me - it would be " @@ -1439,7 +1439,7 @@ There is also one case in which an object can be set equal to another object: @ = if (Assertions::Traverse::get_current_subject() == NULL) { - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_NoMapOrigin), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_NoMapOrigin), "no location is under discussion to be the origin of this map connection", "so this is like starting with 'North is the Aviary': I can't tell where from."); return; @@ -1450,7 +1450,7 @@ There is also one case in which an object can be set equal to another object: } if (traverse == 2) { if (target == NULL) { - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_MapNonObject), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_MapNonObject), "this seems to make a map connection to something which is " "not an object", "like saying '20 is north'. This is an odd thing " @@ -1466,12 +1466,12 @@ There is also one case in which an object can be set equal to another object: Problems::quote_wording(3, Node::get_text(py)); if (Node::get_subject(px) == Node::get_subject(py)) - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_ProperIsItself), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_ProperIsItself), "this seems to say that something is itself", "like saying 'the coin is the coin'. This is an odd thing " "to say, and makes me think that I've misunderstood you."); else if ((Node::get_text(px))) { - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_IfInAssertion)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_IfInAssertion)); Problems::issue_problem_segment( "I am reading the sentence %1 as a declaration of the initial " "state of the world, so I'm expecting that it will be definite. " @@ -1490,7 +1490,7 @@ There is also one case in which an object can be set equal to another object: @ = Problems::quote_kind_of(4, Node::get_evaluation(px)); Problems::quote_kind_of(5, Node::get_evaluation(py)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ObjectAndValueEquated)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ObjectAndValueEquated)); Problems::issue_problem_segment( "The sentence %1 seems to say that '%2', which I think is %4, and " "'%3', which I think is %5, are the same. %P" @@ -1503,7 +1503,7 @@ There is also one case in which an object can be set equal to another object: @ = @; - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ChalkCheese)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ChalkCheese)); Problems::issue_problem_segment( "The sentence %1 appears to say two things are the same - I am reading '%2' " "and '%3' as two different things, and therefore it makes no sense to say " @@ -1512,7 +1512,7 @@ There is also one case in which an object can be set equal to another object: "properties: for instance '%6 is a lighted room' says that something " "called %6 exists and that it is a 'room', which is a kind I know about, " "combined with a property called 'lighted' which I also know about."); - Problems::Issue::diagnose_further(); + Problems::Using::diagnose_further(); Problems::issue_problem_end(); @ ...that we vary it randomly for fun. The low bits of the current time are not @@ -1583,13 +1583,13 @@ yet during traverse 1. if (Rvalues::is_CONSTANT_construction(Node::get_evaluation(px), CON_property)) { inference_subject *talking_about = Assertions::Traverse::get_current_subject(); if (talking_about == NULL) - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_NothingDiscussed), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_NothingDiscussed), "nothing is under discussion which might have this property", "so this is like starting with 'The description is \"Orange.\"': " "I can't tell what of."); else if (traverse == 2) { if ((Node::get_text(py))) - Problems::Issue::negative_sentence_problem(Task::syntax_tree(), _p_(PM_NonValue2)); + StandardProblems::negative_sentence_problem(Task::syntax_tree(), _p_(PM_NonValue2)); else Assertions::PropertyKnowledge::assert_property_value_from_property_subtree_infs( Rvalues::to_property(Node::get_evaluation(px)), talking_about, py); } @@ -1663,14 +1663,14 @@ need to switch interpretations to avoid the problem message. if (Kinds::Compare::eq(Specifications::to_kind(Node::get_evaluation(px)), Specifications::to_kind(Node::get_evaluation(py)))) { - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_SimilarValuesEquated)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_SimilarValuesEquated)); Problems::issue_problem_segment( "Before reading %1, I already knew that '%2' is %4 and " "'%3' likewise: so they are specific values, and saying " "that they are equal will not make it so."); Problems::issue_problem_end(); } else { - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_DissimilarValuesEquated)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_DissimilarValuesEquated)); Problems::issue_problem_segment( "Before reading %1, I already knew that '%2' is %4 and " "'%3' is %5: so they are specific values, and saying " @@ -1692,7 +1692,7 @@ referring to a thing which then can't be equated with a colour. *** something *** ==> @; @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_EquatesSomethingToValue), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_EquatesSomethingToValue), "that seems to say that an object is the same as a value", "which must be wrong. This can happen if the word 'something' is " "used loosely - I read it as 'some thing', so I think it has to " @@ -1714,7 +1714,7 @@ can also be used adjectivally. return; } - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), "that seems to relate an adjective to something", "which must be wrong. (This can sometimes happen if the same word can " "be used both as an adjective and a noun, and I misunderstand.)"); @@ -1750,7 +1750,7 @@ void Assertions::Maker::issue_value_equation_problem(parse_node *px, parse_node Problems::quote_wording(1, Node::get_text(px)); Problems::quote_source(2, current_sentence); Problems::quote_source(3, InferenceSubjects::where_created(Node::get_subject(px))); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_CantUncreate)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_CantUncreate)); Problems::issue_problem_segment( "In order to act on %2, I seem to need to give " "a new meaning to '%1', something which was created by the earlier " @@ -1769,7 +1769,7 @@ void Assertions::Maker::issue_value_equation_problem(parse_node *px, parse_node Problems::quote_wording(2, Node::get_text(py)); if (Wordings::nonempty(Node::get_text(px))) Problems::quote_wording(3, Node::get_text(px)); else Problems::quote_text(3, "(something not given an explicit name)"); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_IdentityUnclear)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_IdentityUnclear)); Problems::issue_problem_segment( "The sentence %1 seems to tell me that '%2' and '%3' have to be " "the same, but it looks odd to me. '%2' is something generic - " @@ -1780,7 +1780,7 @@ void Assertions::Maker::issue_value_equation_problem(parse_node *px, parse_node return; } - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), "that seems to say that an object is the same as a value", "which must be wrong."); } diff --git a/inform7/core-module/Chapter 9/Property Declarations.w b/inform7/core-module/Chapter 9/Property Declarations.w index 4095d4bfa..d88322fd5 100644 --- a/inform7/core-module/Chapter 9/Property Declarations.w +++ b/inform7/core-module/Chapter 9/Property Declarations.w @@ -74,7 +74,7 @@ The subject (in this example, "a container") is required not to match: @ = *X = -1; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PropertyOfKind1), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PropertyOfKind1), "this seems to give a property to all kinds, rather than to objects or " "values", "which are the only things capable of having properties. For instance, " @@ -83,7 +83,7 @@ The subject (in this example, "a container") is required not to match: @ = *X = -1; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PropertyOfPronoun), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PropertyOfPronoun), "it's often a little ambiguous to declare properties for 'it'", "so it seems best to spell this out by saying exactly what the " "property's owner or owners would be."); @@ -177,7 +177,7 @@ which might take forms such as: @ = if ((Wordings::nonempty(CNW)) && (count < 3)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ThisIsEitherOr), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ThisIsEitherOr), "a name can only be supplied using '... (this is...)' when a new property " "is being made with three or more named alternatives", "whereas here a simpler either/or property is being made with just one or " @@ -190,7 +190,7 @@ which might take forms such as: @ = if (Node::get_type(the_owner) == WITH_NT) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_QualifiedCanBe), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_QualifiedCanBe), "only a room, a thing or a kind can have such adjectives applied to it", "and qualifications cannot be used. It makes no sense to say 'An open door " "can be rickety or sturdy' because the door still has to have the property " @@ -212,7 +212,7 @@ differently as a result. @ = if ((either_flag) && (count != 2)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_EitherOnThree), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_EitherOnThree), "that looks like an attempt to use 'either' other than to lay out exactly " "two possibilities", "which is not allowed. (Technically it ought to be legal to have a property " @@ -240,7 +240,7 @@ differently as a result. @ = Problems::quote_source(1, current_sentence); Problems::quote_kind(2, K); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ValueCantHaveProperties)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ValueCantHaveProperties)); Problems::issue_problem_segment( "The sentence %1 looked to me as if it might be trying to create an either/or " "property which would be held by all of the values of a rather large kind " @@ -256,7 +256,7 @@ differently as a result. @ = Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(the_owner)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_VariableCantHaveProperties)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_VariableCantHaveProperties)); Problems::issue_problem_segment( "The sentence %1 looked to me as if it might be trying to create an either/or " "property which would be held by a variable ('%2'). But because '%2' can have " @@ -271,7 +271,7 @@ differently as a result. return; @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_OwnerTimeDependent), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_OwnerTimeDependent), "ownership of a property is something that has to be always true or " "always false", "so that 'a room can be secret' is fine - a room is always a room - " @@ -282,7 +282,7 @@ differently as a result. return; @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NonObjectCanBe), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NonObjectCanBe), "only a room, a thing or a kind can have such adjectives applied to it", "so that 'a dead end can be secret' is fine but 'taking can be secret' would " "not be, since 'taking' is an action and not a room, thing or kind."); @@ -311,7 +311,7 @@ differently as a result. Problems::quote_source(1, current_sentence); Problems::quote_wording(2, EW); Problems::quote_text(3, error_text); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_MiscellaneousEOProblem)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_MiscellaneousEOProblem)); Problems::issue_problem_segment( "In %1, you proposed the new either/or property '%2': but %3."); Problems::issue_problem_end(); @@ -437,7 +437,7 @@ there would be horrible ambiguities in parsing. Problems::quote_source(1, current_sentence); Problems::quote_wording(2, PW); Problems::quote_spec(3, spec); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyAlreadyKnown)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyAlreadyKnown)); Problems::issue_problem_segment( "In %1, one of the values you supply as a possibility is '%2', but this " "already has a meaning (as %3)."); @@ -454,7 +454,7 @@ there would be horrible ambiguities in parsing. if ((already) && (Properties::is_either_or(already))) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, PW); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_EOClashesWithCondition)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_EOClashesWithCondition)); Problems::issue_problem_segment( "In %1, one of the values you supply as a possibility is '%2', but this " "already has a meaning as an either-or property. The same adjective " @@ -500,7 +500,7 @@ automatically creates it. @ = if (((Node::get_text(p))) && ((<> == K_number) || (<> == K_text))) { - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_BareProperty), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_BareProperty), "this would create a property called 'number' or 'text'", "and although bare names of kinds are usually allowed as properties, " "these aren't. Instead, try '... has a number called position.' or " @@ -520,12 +520,12 @@ automatically creates it. if ((Kinds::Compare::eq(K, K_action_name)) || (Kinds::get_construct(K) == CON_activity) || (Kinds::get_construct(K) == CON_rulebook)) - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_ValueCantHaveVProperties2), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_ValueCantHaveVProperties2), "this is a kind of value which is not allowed to have properties of its own", "because this would cause confusion with variables, which are more useful in " "most cases. (See the Kinds index for which kinds can have properties.)"); else - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_ValueCantHaveVProperties), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_ValueCantHaveVProperties), "this is a kind of value which is not allowed to have properties of its own", "because this would be impossible to store in any sensible way. For instance, " "'A scene has a number called difficulty.' is fine because there are not many " @@ -580,7 +580,7 @@ void Assertions::Property::recursively_call_properties(parse_node *owner_ref, pa if (Specifications::is_new_variable_like(spec)) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(kind_ref)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RedundantThatVaries)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RedundantThatVaries)); Problems::issue_problem_segment( "You wrote %1, which I am reading as a request to make a new named property - " "a value associated with an object and which has a name. But you write this " @@ -592,7 +592,7 @@ void Assertions::Property::recursively_call_properties(parse_node *owner_ref, pa } else if (Specifications::is_description(spec)) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(kind_ref)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyTooSpecific)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyTooSpecific)); Problems::issue_problem_segment( "You wrote %1, which I am reading as a request to make a new named property - " "a value associated with an object and which has a name. The request seems to " @@ -604,7 +604,7 @@ void Assertions::Property::recursively_call_properties(parse_node *owner_ref, pa } else { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(kind_ref)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyKindUnknown)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyKindUnknown)); Problems::issue_problem_segment( "You wrote %1, but '%2' is not the name of a kind of value which I know (such " "as 'number' or 'text')."); @@ -617,7 +617,7 @@ void Assertions::Property::recursively_call_properties(parse_node *owner_ref, pa if (prn == P_variable_initial_value) return; Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(kind_ref)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyKindVague)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyKindVague)); Problems::issue_problem_segment( "You wrote %1, but saying that a property is a 'value' does not give me a clear " "enough idea what it will hold. You need to say what kind of value: for instance, " @@ -632,7 +632,7 @@ void Assertions::Property::recursively_call_properties(parse_node *owner_ref, pa Problems::quote_wording(2, Node::get_text(kind_ref)); Problems::quote_property(3, prn); Problems::quote_kind(4, current_kind); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyKindClashes)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyKindClashes)); Problems::issue_problem_segment( "You wrote %1, but '%2' contradicts what I previously thought about the property " "%3, which was that it was %4."); diff --git a/inform7/core-module/Chapter 9/Property Knowledge.w b/inform7/core-module/Chapter 9/Property Knowledge.w index 34111c522..4638cdec5 100644 --- a/inform7/core-module/Chapter 9/Property Knowledge.w +++ b/inform7/core-module/Chapter 9/Property Knowledge.w @@ -66,14 +66,14 @@ For both these reasons, then, we perform a simple type-check here. Problems::quote_kind(5, constant_kind); if ((Kinds::Compare::lt(kind_as_declared, K_object)) && (Rvalues::is_nothing_object_constant(val))) { - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_QuantityKindNothing)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_QuantityKindNothing)); Problems::issue_problem_segment( "The sentence %1 tells me that '%2', which should be %4 that varies, is to " "have the initial value 'nothing'. This is allowed as an 'object which varies', " "but the rules are stricter for %4."); Problems::issue_problem_end(); } else { - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_GlobalKindWrong)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_GlobalKindWrong)); Problems::issue_problem_segment( "The sentence %1 tells me that '%2', which is %4 that varies, " "should start out with the value '%3', but this is %5 and not %4."); @@ -84,7 +84,7 @@ For both these reasons, then, we perform a simple type-check here. "I often assume that it's meant to be a new object. So it may " "be that you intended '%3' to be something quite different, " "but I just didn't get it."); - Problems::Issue::diagnose_further(); + Problems::Using::diagnose_further(); Problems::issue_problem_end(); } return; @@ -150,7 +150,7 @@ are typechecked at run-time rather than compile-time in that domain.) (Calculus::Propositions::contains_adjective(Specifications::to_proposition(owner_spec)))) { Problems::quote_source(1, current_sentence); Problems::quote_spec(2, owner_spec); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RelationAPL)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RelationAPL)); Problems::issue_problem_segment( "The sentence %1 looked to me as if it might be trying to assign certain " "properties to something described in a way (%2) which involved a clause " @@ -163,7 +163,7 @@ are typechecked at run-time rather than compile-time in that domain.) @ = Problems::quote_source(1, current_sentence); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PropForBadKOV)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PropForBadKOV)); Problems::issue_problem_segment( "The sentence %1 looked to me as if it might be trying to assign certain properties " "to something which is not allowed to have them."); @@ -200,7 +200,7 @@ parse_node *Assertions::PropertyKnowledge::property_value_from_property_subtree( @ = Problems::quote_source(1, current_sentence); Problems::quote_property(3, prn); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_HasBareAdjective)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_HasBareAdjective)); Problems::issue_problem_segment( "In %1 you write about the %3 property as if it were some kind of value " "or possession, but %3 is an either/or property - something is either " @@ -213,7 +213,7 @@ parse_node *Assertions::PropertyKnowledge::property_value_from_property_subtree( Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(py)); Problems::quote_property(3, prn); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); Problems::issue_problem_segment( "In %1 you give a value of the %3 property as '%2', but %3 is an either/or " "property - something is either %3 or not, so there is no value involved."); @@ -229,7 +229,7 @@ parse_node *Assertions::PropertyKnowledge::property_value_from_property_subtree( Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(py)); Problems::quote_property(3, prn); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyValueUnknown)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyValueUnknown)); Problems::issue_problem_segment( "You wrote %1, but that seems to set a property %3 to the " "value '%2', which I don't recognise as meaning anything."); @@ -238,7 +238,7 @@ parse_node *Assertions::PropertyKnowledge::property_value_from_property_subtree( } break; /* (this is fine -- there's a well-expressed value) */ case COMMON_NOUN_NT: - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PropertyInstance), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PropertyInstance), "this property value makes no sense to me", "since it looks as if it contains a relative clause. Sometimes this " "happens if a clause follows directly on, and I have misunderstood to " @@ -248,13 +248,13 @@ parse_node *Assertions::PropertyKnowledge::property_value_from_property_subtree( "applying to the door."); return NULL; case X_OF_Y_NT: - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), "something grammatically odd has happened here", "possibly to do with the unexpected 'of' in what seems to be a list of " "property values?"); return NULL; case WITH_NT: - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_MisplacedFrom), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_MisplacedFrom), "something grammatically odd has happened here", "possibly to do with the unexpected 'with' in what seems " "to be a list of property values? Maybe there is some punctuation missing."); @@ -263,7 +263,7 @@ parse_node *Assertions::PropertyKnowledge::property_value_from_property_subtree( Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(py)); Problems::quote_property(3, prn); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PeculiarPropertyValue)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PeculiarPropertyValue)); Problems::issue_problem_segment( "You wrote %1, but that seems to set a property %3 to the " "value '%2', which really doesn't make sense."); @@ -276,7 +276,7 @@ parse_node *Assertions::PropertyKnowledge::property_value_from_property_subtree( Problems::quote_wording(2, Node::get_text(py)); Problems::quote_kind(3, property_kind); Problems::quote_property(4, prn); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyNonConstant)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PropertyNonConstant)); Problems::issue_problem_segment( "In %1 you give a value of the %4 property as '%2', " "and while this does make sense as %3, it is a value which " diff --git a/inform7/core-module/Chapter 9/Refine Parse Tree.w b/inform7/core-module/Chapter 9/Refine Parse Tree.w index d0d9f5621..ae9c105ef 100644 --- a/inform7/core-module/Chapter 9/Refine Parse Tree.w +++ b/inform7/core-module/Chapter 9/Refine Parse Tree.w @@ -227,7 +227,7 @@ from the tree. } Assertions::Refiner::refine(p->down, FORBID_CREATION); if (Annotations::read_int(p->down, multiplicity_ANNOT) > 1) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_MultipleCalled), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_MultipleCalled), "I can only make a single 'called' thing at a time", "or rather, the 'called' is only allowed to apply to one thing " "at a time. For instance, 'A thing called a vodka and tonic is " @@ -236,7 +236,7 @@ from the tree. } forbid_nowhere = TRUE; if (creation_rule == FORBID_CREATION) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), "'called' can't be used in this context", "and is best reserved for full sentences."); else Assertions::Refiner::refine(p->down->next, MANDATE_CREATION); @@ -302,14 +302,14 @@ inference subject representing the domain to which any new kind would belong. @ = if ((InferenceSubjects::is_an_object(kind_of_what)) || (InferenceSubjects::is_a_kind_of_object(kind_of_what))) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_KindOfInstance), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_KindOfInstance), "kinds can only be made from other kinds", "so 'a kind of container' is allowed but 'a kind of Mona Lisa' (where " "Mona Lisa is a specific thing you've already made), wouldn't be " "allowed. There is only one Mona Lisa."); kind_of_what = Kinds::Knowledge::as_subject(K_object); } else { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_KindOfActualValue), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_KindOfActualValue), "I don't recognise that as a kind", "such as 'room' or 'door': it would need to be straightforwardly the name " "of a kind, and not be qualified with adjectives like 'open'."); @@ -317,7 +317,7 @@ inference subject representing the domain to which any new kind would belong. } @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_KindOfExotica), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_KindOfExotica), "you are only allowed to create kinds of objects (things, rooms, and " "so on) and kinds of 'value'", "so for example 'colour is a kind of value' is allowed but 'prime is " @@ -406,14 +406,14 @@ thing. (If we had more and better pronouns, they would go here.) if (((Node::get_text(p))) && (<> == 2) && (Assertions::Traverse::get_current_subject_plurality())) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_EnigmaticThey), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_EnigmaticThey), "I'm unable to handle 'they' here", "since it looks as if it needs to refer to more than one " "object here, and that's something I can't manage."); return; } if (Assertions::Traverse::get_current_object() == NULL) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_EnigmaticPronoun), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_EnigmaticPronoun), "I'm not sure what to make of the pronoun here", "since it is unclear what previously mentioned thing " "is being referred to. In general, it's best only to use " @@ -459,7 +459,7 @@ property name meaning, not as the name of a kind of value.) @ = *X = FALSE; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_VagueVariable), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_VagueVariable), "'variable' is too vague a description", "because it doesn't say what kind of value should go into the variable. " "'number variable' or 'a number that varies' - whatever kind of value you " @@ -498,7 +498,7 @@ a noun instead of a condition testing the current action. @ = if (Quantifiers::can_be_used_in_assertions(Descriptions::get_quantifier(spec)) == FALSE) { LOG("$T\nSo $D\n", current_sentence, Specifications::to_proposition(spec)); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ComplexDeterminer), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ComplexDeterminer), "complicated determiners are not allowed in assertions", "so for instance 'More than three people are in the Dining Room' " "or 'None of the containers is open' will be rejected. Only " @@ -515,7 +515,7 @@ a noun instead of a condition testing the current action. Node::set_type(p, EVERY_NT); return; } - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ComplexEvery), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ComplexEvery), "in an assertion 'every' or 'all' can only be used with a kind", "so for instance 'A coin is in every container' is all right, " "because 'container' is a kind, but not 'A coin is in every " diff --git a/inform7/core-module/Chapter 9/Relation Knowledge.w b/inform7/core-module/Chapter 9/Relation Knowledge.w index c1c334ce1..92cad1b09 100644 --- a/inform7/core-module/Chapter 9/Relation Knowledge.w +++ b/inform7/core-module/Chapter 9/Relation Knowledge.w @@ -41,7 +41,7 @@ void Assertions::Relational::assert_subtree_in_relationship(parse_node *value, p @ = if (Node::get_subject(value) == NULL) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_HereFailedOnNothing), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_HereFailedOnNothing), "that is an assertion which puts nothing 'here'", "which looks as if it might be trying to give me negative rather " "than positive information. There's no need to tell me something " @@ -62,12 +62,12 @@ void Assertions::Relational::assert_subtree_in_relationship(parse_node *value, p if (iy == NULL) { if (Rvalues::is_nothing_object_constant( Node::get_evaluation(relationship_subtree->down))) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_MapFromNowhere), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_MapFromNowhere), "the source of a map connection can't be nowhere", "so sentences like 'The pink door is south of nowhere.' are not " "allowed."); else - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_MapFromNonroom2), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_MapFromNonroom2), "the source of a map connection has to be a room or door", "so sentences like 'The pink door is south of 0.' are not " "allowed."); @@ -81,7 +81,7 @@ void Assertions::Relational::assert_subtree_in_relationship(parse_node *value, p PL::Map::connect(iy, Node::get_subject(value), id); else { LOG("Val is $P\n", value); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_MapToNonobject), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_MapToNonobject), "the destination of a map connection has to be either a room, " "a door or 'nowhere'", "but here the destination doesn't even seem to be an object."); @@ -94,13 +94,13 @@ void Assertions::Relational::assert_subtree_in_relationship(parse_node *value, p (relationship_subtree->down->next->next != NULL)) internal_error("malformed DIRECTION"); if (Node::get_type(relationship_subtree->down) != PROPER_NOUN_NT) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), "this is not straightforward in saying which room (or door) leads away from", "and should just name the source."); break; } if (Node::get_type(relationship_subtree->down->next) != PROPER_NOUN_NT) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), "this is not straightforward in saying which direction the room (or door) lies in", "and should just name the direction."); break; @@ -152,7 +152,7 @@ void Assertions::Relational::assert_relation_between_subtrees(parse_node *px, bi if (((Node::get_type(px) != PROPER_NOUN_NT) && (Node::get_type(px) != COMMON_NOUN_NT)) || ((Node::get_type(py) != PROPER_NOUN_NT) && (Node::get_type(py) != COMMON_NOUN_NT))) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadRelation), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadRelation), "this description of a relationship makes no sense to me", "and should be something like 'X is in Y' (or 'on' or 'part of Y'); " "or else 'X is here' or 'X is east of Y'."); @@ -165,7 +165,7 @@ void Assertions::Relational::assert_relation_between_subtrees(parse_node *px, bi if ((BinaryPredicates::relates_values_not_objects(bp)) && (((Node::get_subject(px)) && (InferenceSubjects::domain(Node::get_subject(px)))) || ((Node::get_subject(py)) && (InferenceSubjects::domain(Node::get_subject(py)))))) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_KindRelatedToValue), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_KindRelatedToValue), "relations between objects and values have to be made one " "object at a time", "not using kinds of object to make multiple relationships in " @@ -176,7 +176,7 @@ void Assertions::Relational::assert_relation_between_subtrees(parse_node *px, bi } @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_EveryWrongSide), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_EveryWrongSide), "'every' can only be used on the other side of the verb", "because of limitations in Inform (but also to avoid certain possible " "ambiguities). In general, 'every' should be applied to the subject of an " diff --git a/inform7/core-module/Chapter 9/The Creator.w b/inform7/core-module/Chapter 9/The Creator.w index 266ce8c81..af682b756 100644 --- a/inform7/core-module/Chapter 9/The Creator.w +++ b/inform7/core-module/Chapter 9/The Creator.w @@ -295,7 +295,7 @@ void Assertions::Creator::noun_creator(parse_node *p, kind *create_as, parse_nod @ = if ((prevailing_mood == IMPOSSIBLE_CE) || (prevailing_mood == UNLIKELY_CE)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NegativeCreation), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NegativeCreation), "sentences are only allowed to say that things do exist", "not that they don't."); } @@ -377,7 +377,7 @@ disappears from the tree entirely when the creator has finished work. @ = LOG("$T\n", what_to_make_node); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CalledWithoutKind), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CalledWithoutKind), "I can only make 'a something called whatever' when the something is a kind I know", "possibly qualified with adjectives. For instance, 'an open door called the Marble " "Door' is fine because 'door' is the name of a kind and 'open' is an adjective " @@ -463,7 +463,7 @@ it handles crashes correctly. list-entries ==> @ @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NameIsArticle), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NameIsArticle), "this seems to give something a name which consists only of an article", "that is, 'a', 'an', 'the' or 'some'. This is not allowed since the " "potential for confusion is too high. (If you need, say, a room which " @@ -471,7 +471,7 @@ it handles crashes correctly. "a room with printed name \"A\".')"); @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NameWithBrackets), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NameWithBrackets), "this seems to give something a name which contains brackets '(' or ')'", "which is not allowed since the potential for confusion with other uses " "for brackets in Inform source text is too high. (If you need, say, a " @@ -482,40 +482,40 @@ it handles crashes correctly. @ = WRITE_TO(STDERR, "*** Exit(1) requested for testing purposes ***\n"); STREAM_FLUSH(STDERR); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_Crash1), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_Crash1), "this uses the first secret hieroglyph of dreadful power", "which forces me to crash. (It's for testing the way I crash, in fact. " "If this is a genuine inconvenience to you, get in touch with my authors.)"); - Problems::Fatal::exit(1); + ProblemSigils::exit(1); @ = WRITE_TO(STDERR, "*** Exit(10) requested for testing purposes ***\n"); STREAM_FLUSH(STDERR); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_Crash10), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_Crash10), "this uses the second secret hieroglyph of dreadful power", "which forces me to crash. (It's for testing the way I crash, in fact. " "If this is a genuine inconvenience to you, get in touch with my authors.)"); - Problems::Fatal::exit(10); + ProblemSigils::exit(10); @ = WRITE_TO(STDERR, "*** Exit(11) requested for testing purposes ***\n"); STREAM_FLUSH(STDERR); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_Crash11), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_Crash11), "this uses the third secret hieroglyph of dreadful power", "which forces me to crash. (It's for testing the way I crash, in fact. " "If this is a genuine inconvenience to you, get in touch with my authors.)"); - Problems::Fatal::exit(11); + ProblemSigils::exit(11); @ = LOG("$T\n", current_sentence); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_StartsWithComma), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_StartsWithComma), "this seems to refer to something whose name begins with a comma", "which is forbidden. Perhaps you used a comma in punctuating a sentence? " "Inform generally doesn't like this because it reserves commas for " "specific purposes such as dividing rules or 'if' phrases."); @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_EndsWithComma), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_EndsWithComma), "this seems to refer to something whose name ends with a comma", "which is forbidden. Perhaps you used a comma in punctuating a sentence? " "Inform generally doesn't like this because it reserves commas for " @@ -524,7 +524,7 @@ it handles crashes correctly. @ = Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ObjectIncWhen)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ObjectIncWhen)); Problems::issue_problem_segment( "The sentence %1 seems to be talking about a previously unknown room or " "thing called %2. Ordinarily, I would create this, but because the name " @@ -542,7 +542,7 @@ it handles crashes correctly. Problems::issue_problem_end(); @ = - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_NameWithText), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_NameWithText), "this seems to give something a name which contains " "double-quoted text", "which is not allowed. If you do need quotes in a name, one option " @@ -554,7 +554,7 @@ it handles crashes correctly. "fact it didn't, so that I read the next words as following on."); @ = - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_NameReserved), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_NameReserved), "this seems to give something a name which is reserved for Inform's " "own internal use", "so is not allowed. There are only a few of these - 'storage', " @@ -712,7 +712,7 @@ them by asserting propositions to be true; we act directly. @ And to wind up, sundry problem messages. @ = - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_NoTopicsThatVary), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_NoTopicsThatVary), "'topics that vary' are not allowed", "that is, a variable is not allowed to have 'topic' as its kind of value. " "(This would cause too much ambiguity with text variables, whose values " @@ -723,7 +723,7 @@ them by asserting propositions to be true; we act directly. Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); Problems::quote_kind(3, create_as); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_MixedConstantsEquation)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_MixedConstantsEquation)); Problems::issue_problem_segment( "The sentence %1 reads to me as if '%2' refers to something " "I should create as brand new - %3. But that can't be right, " @@ -734,7 +734,7 @@ them by asserting propositions to be true; we act directly. Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); Problems::quote_kind(3, create_as); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_MixedConstants)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_MixedConstants)); Problems::issue_problem_segment( "The sentence %1 reads to me as if '%2' refers to something " "I should create as brand new - %3. But that can't be right, " @@ -749,7 +749,7 @@ them by asserting propositions to be true; we act directly. Problems::quote_wording(2, W); Problems::quote_kind(3, create_as); Problems::quote_table(4, Tables::Defining::defined_by_table(create_as)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_TableOfExistingKind2)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TableOfExistingKind2)); Problems::issue_problem_segment( "The sentence %1 reads to me as if '%2' refers to something " "I should create as brand new - %3. That looks reasonable, since " @@ -767,7 +767,7 @@ if nothing has already been said: Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); Problems::quote_kind(3, create_as); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NoNewInstances)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NoNewInstances)); Problems::issue_problem_segment( "The sentence %1 reads to me as if '%2' refers to something " "I should create as brand new - %3. But that can't be right, " @@ -850,7 +850,7 @@ void Assertions::Creator::convert_instance_to_nounphrase(parse_node *p, binary_p @ = Problems::quote_source(1, current_sentence); Problems::quote_kind(2, instance_kind); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_CantCreateImplicitly)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_CantCreateImplicitly)); Problems::issue_problem_segment( "The sentence %1 seems to be asking me to create a new value (%2) " "in order to be part of a relationship, but this isn't a kind of " @@ -862,7 +862,7 @@ void Assertions::Creator::convert_instance_to_nounphrase(parse_node *p, binary_p @ = Problems::quote_source(1, current_sentence); Problems::quote_wording(2, CW); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_CalledArticle)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_CalledArticle)); Problems::issue_problem_segment( "The sentence %1 seems to be asking me to create something whose " "name, '%2', is just an article - this isn't allowed."); @@ -880,7 +880,7 @@ message says about performance, too.) instance_count = Annotations::read_int(p, multiplicity_ANNOT); if (instance_count < 1) instance_count = 1; if (instance_count > MAX_DUPLICATES_AT_ONCE) { - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_TooManyDuplicates), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_TooManyDuplicates), "at most 100 duplicates can be made at any one time", "so '157 chairs are in the UN General Assembly' will not be allowed. The " "system for handling duplicates during play becomes too slow and awkward " @@ -1049,7 +1049,7 @@ For example, property names can't be unsuitable, but they can be unfortunate. = int Assertions::Creator::vet_name_for_noun(wording W) { if ((W)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NameBestAvoided), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NameBestAvoided), "this is a name which is best avoided", "because it would lead to confusion inside Inform. In general, try " "to avoid punctuation, quotation marks, or the words 'with' or " diff --git a/inform7/core-module/Chapter 9/To Be and To Have.w b/inform7/core-module/Chapter 9/To Be and To Have.w index d9fd30704..24306becb 100644 --- a/inform7/core-module/Chapter 9/To Be and To Have.w +++ b/inform7/core-module/Chapter 9/To Be and To Have.w @@ -47,7 +47,7 @@ void Assertions::Copular::to_be(parse_node *pv) { if ((Wordings::length(Node::get_text(px)) > 1) && (Vocabulary::test_flags( Wordings::first_wn(Node::get_text(px)), TEXT_MC+TEXTWITHSUBS_MC))) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TextNotClosing), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TextNotClosing), "it looks as if perhaps you did not intend that to read as a " "single sentence", "and possibly the text in quotes was supposed to stand as " @@ -94,7 +94,7 @@ void Assertions::Copular::to_have(parse_node *pv) { @ = if (Node::get_type(py) == X_OF_Y_NT) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_SuperfluousOf), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_SuperfluousOf), "the 'of' here appears superfluous", "assuming the sentence aims to give a property value of something. " "(For instance, if we want to declare the carrying capacity of " @@ -104,7 +104,7 @@ void Assertions::Copular::to_have(parse_node *pv) { return; } if (Node::get_type(py) == WITH_NT) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_SuperfluousWith), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_SuperfluousWith), "the 'has ... with' here appears to be a mixture of two ways to " "give something properties", "that is, 'The box is a container with capacity 10.' and 'The box " @@ -117,7 +117,7 @@ as a |PROPERTYCALLED_NT| subtree and hang beneath an |ALLOWED_NT| node. @ = if (Wordings::match(Node::get_text(py->down->next), Node::get_text(py->down))) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_SuperfluousCalled), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_SuperfluousCalled), "'called' should be used only when the name is different from the kind", "so this sentence should be simplified. For example, 'A door has a " "colour called colour' should be written more simply as 'A door has " @@ -254,7 +254,7 @@ void Assertions::Copular::make_existential_assertion(parse_node *py) { (Kinds::Compare::eq(K_object, InferenceSubjects::as_kind(Node::get_subject(py))))) Assertions::Creator::convert_instance_to_nounphrase(py, NULL); else - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ThereIsVague), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ThereIsVague), "'there is...' can only be used to create objects", "and not instances of other kinds.'"); } diff --git a/inform7/core-module/Chapter 9/Traverse for Assertions.w b/inform7/core-module/Chapter 9/Traverse for Assertions.w index db4dfd523..897c673e9 100644 --- a/inform7/core-module/Chapter 9/Traverse for Assertions.w +++ b/inform7/core-module/Chapter 9/Traverse for Assertions.w @@ -243,7 +243,7 @@ void Assertions::Traverse::switch_sentence_trace(parse_node *PN) { telemetry_recording = TRUE; Telemetry::write_to_telemetry_file(Lexer::word_text(Wordings::last_wn(Node::get_text(PN)))); telemetry_recording = FALSE; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TelemetryAccepted), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TelemetryAccepted), "that's a message for the Author, not me", "so I'll note it down in the Telemetry file (if you're keeping one.)"); telemetry_recording = tr; @@ -320,7 +320,7 @@ to bite. ... ==> @ @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RuleWithoutColon), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RuleWithoutColon), "I can't find a verb that I know how to deal with, so can't do anything " "with this sentence. It looks as if it might be a rule definition", "but if so then it is lacking the necessary colon (or comma). " @@ -329,7 +329,7 @@ to bite. "of the colon?"); @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_IfOutsidePhrase), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_IfOutsidePhrase), "I can't find a verb that I know how to deal with. This looks like an 'if' " "phrase which has slipped its moorings", "so I am ignoring it. ('If' phrases, like all other such " @@ -340,7 +340,7 @@ to bite. @ = Problems::quote_source(1, current_sentence); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NoSuchVerbComma)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NoSuchVerbComma)); Problems::issue_problem_segment( "In the sentence %1, I can't find a verb that I know how to deal with. " "(I notice there's a comma here, which is sometimes used to abbreviate " @@ -355,7 +355,7 @@ to bite. @ = LOG("$T\n", current_sentence); Problems::quote_source(1, current_sentence); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NoSuchVerb)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NoSuchVerb)); Problems::issue_problem_segment( "In the sentence %1, I can't find a verb that I know how to deal with."); Problems::issue_problem_end(); @@ -372,7 +372,7 @@ but the ability does exist, and we defend it a little here: Wordings::one_word(Wordings::last_wn(Node::get_text(p->down->next)) + 1)); Problems::quote_wording(3, Node::get_text(p->down->next)); Problems::quote_wording(4, Node::get_text(p->down->next->next)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); if (Wordings::nonempty(Node::get_text(p->down->next->next))) Problems::issue_problem_segment( "I must be misreading the sentence %1. The verb " @@ -431,7 +431,7 @@ is the rubric, the second the credit line. return; @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TextWithoutSubject), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TextWithoutSubject), "I'm not sure what you're referring to", "that is, I can't decide to what room or thing you intend that text to belong. " "Perhaps you could rephrase this more explicitly? ('The description of the Inner " diff --git a/inform7/if-module/Chapter 2/Bibliographic Data.w b/inform7/if-module/Chapter 2/Bibliographic Data.w index 00bf668d8..0c4ed7542 100644 --- a/inform7/if-module/Chapter 2/Bibliographic Data.w +++ b/inform7/if-module/Chapter 2/Bibliographic Data.w @@ -156,7 +156,7 @@ which must match: @ = *X = -1; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadEpisode), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadEpisode), "this is not the right way to specify how the story " "fits into a larger narrative", "and should take the form 'The story is episode 2 of " diff --git a/inform7/if-module/Chapter 2/Release Instructions.w b/inform7/if-module/Chapter 2/Release Instructions.w index dcc669371..fd277d64b 100644 --- a/inform7/if-module/Chapter 2/Release Instructions.w +++ b/inform7/if-module/Chapter 2/Release Instructions.w @@ -80,7 +80,7 @@ The object noun phrase is an articled list, and each entry must match this. @ = *X = BOOKLET_PAYLOAD; /* to recover harmlessly */ Problems::quote_wording_as_source(1, W); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NoSuchPublicRelease)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NoSuchPublicRelease)); Problems::issue_problem_segment( "I don't know how to release along with %1: the only features of " "a release which can be marked as public or private are the 'source " @@ -198,7 +198,7 @@ void PL::Bibliographic::Release::handle_release_declaration_inner(parse_node *p) case EXISTING_STORY_FILE_PAYLOAD: case NAMED_EXISTING_STORY_FILE_PAYLOAD: if (TargetVMs::is_16_bit(Task::vm()) == FALSE) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), /* not usefully testable */ + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), /* not usefully testable */ "existing story files can only be used with the Z-machine", "not with the Glulx setting."); return; @@ -289,7 +289,7 @@ void PL::Bibliographic::Release::handle_release_declaration_inner(parse_node *p) @ = Problems::quote_source(1, p); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ReleaseAlong)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ReleaseAlong)); Problems::issue_problem_segment( "I don't know how to release along with %1: the only forms I can " "accept are - 'Release along with cover art', '...a website', " @@ -355,7 +355,7 @@ application sandboxing in Mac OS X in 2012 may force us to revisit this. @ = if (Pathnames::create_in_file_system( Projects::materials_path(Task::project())) == FALSE) { - Problems::Issue::release_problem_path(_p_(Untestable), + StandardProblems::release_problem_path(_p_(Untestable), "In order to release the story file along with other " "resources, I tried to create a folder alongside this " "Inform project, but was unable to do so. The folder " @@ -366,7 +366,7 @@ application sandboxing in Mac OS X in 2012 may force us to revisit this. @ = if (Pathnames::create_in_file_system(Task::release_path()) == FALSE) { - Problems::Issue::release_problem_path(_p_(Untestable), + StandardProblems::release_problem_path(_p_(Untestable), "In order to release the story file along with other " "resources, I tried to create a folder alongside this " "Inform project, but was unable to do so. The folder " @@ -377,7 +377,7 @@ application sandboxing in Mac OS X in 2012 may force us to revisit this. auxiliary_file *af; LOOP_OVER(af, auxiliary_file) if (Pathnames::create_in_file_system(af->folder_to_release_to) == FALSE) { - Problems::Issue::release_problem_path(_p_(Untestable), + StandardProblems::release_problem_path(_p_(Untestable), "In order to release the story file along with other " "resources, I tried to create a folder alongside this " "Inform project, but was unable to do so. The folder " @@ -388,7 +388,7 @@ application sandboxing in Mac OS X in 2012 may force us to revisit this. @ = if (Pathnames::create_in_file_system(Task::released_interpreter_path()) == FALSE) { - Problems::Issue::release_problem_path(_p_(Untestable), + StandardProblems::release_problem_path(_p_(Untestable), "In order to release the story file along with an " "interpreter, I tried to create a folder alongside this " "Inform project, but was unable to do so. The folder " @@ -421,7 +421,7 @@ art and see that its dimensions conform to Treaty of Babel requirements. int rv = ImageFiles::get_JPEG_dimensions(COVER_FILE, &width, &height); fclose(COVER_FILE); if (rv == FALSE) { - Problems::Issue::release_problem(_p_(Untestable), + StandardProblems::release_problem(_p_(Untestable), "The cover image seems not to be a JPEG despite the name", cover_filename); return; @@ -432,14 +432,14 @@ art and see that its dimensions conform to Treaty of Babel requirements. int rv = ImageFiles::get_PNG_dimensions(COVER_FILE, &width, &height); fclose(COVER_FILE); if (rv == FALSE) { - Problems::Issue::release_problem(_p_(Untestable), + StandardProblems::release_problem(_p_(Untestable), "The cover image seems not to be a PNG despite the name", cover_filename); return; } @ = - Problems::Issue::release_problem_at_sentence(_p_(Untestable), + StandardProblems::release_problem_at_sentence(_p_(Untestable), "The release instructions said that there is a cover image " "to attach to the story file, but I was unable to find it, " "having looked for both 'Cover.png' and 'Cover.jpg' in the " @@ -448,14 +448,14 @@ art and see that its dimensions conform to Treaty of Babel requirements. @ = if ((width < 120) || (width > 1200) || (height < 120) || (height > 1200)) { - Problems::Issue::release_problem(_p_(Untestable), + StandardProblems::release_problem(_p_(Untestable), "The height and width of the cover image, in pixels, must be " "between 120 and 1024 inclusive", cover_filename); return; } if ((width > 2*height) || (height > 2*width)) { - Problems::Issue::release_problem(_p_(Untestable), + StandardProblems::release_problem(_p_(Untestable), "We recommend a square cover image, but at any rate it is " "required to be no more rectangular than twice as wide as it " "is high (or vice versa)", @@ -468,7 +468,7 @@ art and see that its dimensions conform to Treaty of Babel requirements. @; FILE *STORYF = Filenames::fopen(Task::existing_storyfile_file(), "rb"); if (STORYF == NULL) { - Problems::Issue::unlocated_problem_on_file(Task::syntax_tree(), + StandardProblems::unlocated_problem_on_file(Task::syntax_tree(), _p_(BelievedImpossible), /* i.e., not testable by intest */ "The instruction 'Release along with an existing story file' " "means that I need to bind up a story file called '%1', in " @@ -485,7 +485,7 @@ art and see that its dimensions conform to Treaty of Babel requirements. fclose(STORYF); @ = - Problems::Issue::unlocated_problem(Task::syntax_tree(), _p_(PM_UnreleasedRelease), + StandardProblems::unlocated_problem(Task::syntax_tree(), _p_(PM_UnreleasedRelease), "This is supposed to be a source text which only contains " "release instructions to bind up an existing story file " "(for instance, one produced using Inform 6). That's because " @@ -509,7 +509,7 @@ art and see that its dimensions conform to Treaty of Babel requirements. text_stream xf_struct; text_stream *xf = &xf_struct; filename *F = Task::ifiction_record_file(); if (STREAM_OPEN_TO_FILE(xf, F, UTF8_ENC) == FALSE) - Problems::Fatal::filename_related("Can't open metadata file", F); + Problems::fatal_on_file("Can't open metadata file", F); BEGIN_COMPILATION_MODE; COMPILATION_MODE_ENTER(COMPILE_TEXT_TO_XML_CMODE); PL::Bibliographic::Release::write_ifiction_record(xf, header, cover_picture_number, cover_art_format, height, width); @@ -520,7 +520,7 @@ art and see that its dimensions conform to Treaty of Babel requirements. filename *F = Task::blurb_file(); text_stream xf_struct; text_stream *xf = &xf_struct; if (STREAM_OPEN_TO_FILE(xf, F, UTF8_ENC) == FALSE) - Problems::Fatal::filename_related("Can't open blurb file", F); + Problems::fatal_on_file("Can't open blurb file", F); PL::Bibliographic::Release::write_release_blurb(xf, cover_picture_number, cover_art_format); STREAM_CLOSE(xf); @@ -528,7 +528,7 @@ art and see that its dimensions conform to Treaty of Babel requirements. filename *F = Task::manifest_file(); text_stream xf_struct; text_stream *xf = &xf_struct; if (STREAM_OPEN_TO_FILE(xf, F, UTF8_ENC) == FALSE) - Problems::Fatal::filename_related("Can't open manifest file", F); + Problems::fatal_on_file("Can't open manifest file", F); PL::Figures::write_picture_manifest(xf, release_cover, cover_art_format); STREAM_CLOSE(xf); diff --git a/inform7/if-module/Chapter 3/Backdrops.w b/inform7/if-module/Chapter 3/Backdrops.w index eb5bcae7f..89b112e50 100644 --- a/inform7/if-module/Chapter 3/Backdrops.w +++ b/inform7/if-module/Chapter 3/Backdrops.w @@ -196,12 +196,12 @@ int PL::Backdrops::backdrops_intervene_in_assertion(parse_node *px, parse_node * ((Node::get_text(py)))) { inference_subject *left_subject = Node::get_subject(px); if (left_subject == NULL) - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_ValueEverywhere), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_ValueEverywhere), "'everywhere' can only be used to place individual backdrops", "so although 'The mist is a backdrop. The mist is everywhere.' " "would be fine, 'Corruption is everywhere.' would not."); else if (InferenceSubjects::domain(left_subject)) - Problems::Issue::subject_problem_at_sentence(_p_(PM_KindOfBackdropEverywhere), + StandardProblems::subject_problem_at_sentence(_p_(PM_KindOfBackdropEverywhere), left_subject, "seems to be said to be 'everywhere' in some way", "which doesn't make sense. An individual backdrop can be 'everywhere', " @@ -220,7 +220,7 @@ been asserted true: = void PL::Backdrops::infer_presence_everywhere(instance *I) { if ((I == NULL) || (Instances::of_kind(I, K_backdrop) == FALSE)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_EverywhereNonBackdrop), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_EverywhereNonBackdrop), "only a backdrop can be everywhere", "and no other kind of object will do. For instance, 'The sky is " "a backdrop which is everywhere.' is allowed, but 'The travelator " diff --git a/inform7/if-module/Chapter 3/EPS Map.w b/inform7/if-module/Chapter 3/EPS Map.w index 2c4f6cac9..5a4e8c13d 100644 --- a/inform7/if-module/Chapter 3/EPS Map.w +++ b/inform7/if-module/Chapter 3/EPS Map.w @@ -361,7 +361,7 @@ itself. @ = *X = NO_IMW; if (index_map_with_pass == 1) { - Problems::Issue::map_problem(_p_(PM_MapDirectionClue), + StandardProblems::map_problem(_p_(PM_MapDirectionClue), index_map_with_p, "You can only say 'Index map with D mapped as E.' " "when D and E are directions."); } @@ -369,7 +369,7 @@ itself. @ = *X = NO_IMW; if (index_map_with_pass == 1) { - Problems::Issue::map_problem(_p_(PM_MapPlacement), + StandardProblems::map_problem(_p_(PM_MapPlacement), index_map_with_p, "The map placement hint should either have the form 'Index map with X " "mapped east of Y' or 'Index map with X mapped above/below Y'."); } @@ -377,7 +377,7 @@ itself. @ = *X = NO_IMW; if (index_map_with_pass == 1) { - Problems::Issue::map_problem(_p_(PM_MapSettingTooLong), + StandardProblems::map_problem(_p_(PM_MapSettingTooLong), index_map_with_p, "The value supplied has to be a single item, a number, a word " "or some text in double-quotes: this looks too long to be right."); } @@ -389,7 +389,7 @@ itself. @ = *X = NO_IMW; if (index_map_with_pass == 2) { - Problems::Issue::map_problem(_p_(PM_MapHintUnknown), + StandardProblems::map_problem(_p_(PM_MapHintUnknown), index_map_with_p, "The general form for this is 'Index map with ...' and then a " "list of clues, such as 'the Ballroom mapped east of the Terrace', " "or 'room-size of the Ballroom set to 100'."); @@ -441,7 +441,7 @@ For now, at least, these are all in English only. @ = *X = NO_IMW; if (index_map_with_pass == 1) { - Problems::Issue::map_problem(_p_(PM_MapSettingUnknown), + StandardProblems::map_problem(_p_(PM_MapSettingUnknown), index_map_with_p, "The parameter has to be one of the fixed named set given in " "the documentation, like 'room-name'. All parameters are one " "word, but many are hyphenated. (Also, note that 'colour' has the " @@ -542,7 +542,7 @@ void PL::EPSMap::new_map_hint_sentence(int pass, parse_node *p) { @ = if (Instances::of_kind(<>, K_direction) == FALSE) { - if (pass == 1) Problems::Issue::map_problem(_p_(PM_MapPlacementDirection), + if (pass == 1) StandardProblems::map_problem(_p_(PM_MapPlacementDirection), p, "The direction given as a hint for map placement wasn't " "one that I know of."); return; @@ -553,17 +553,17 @@ void PL::EPSMap::new_map_hint_sentence(int pass, parse_node *p) { int exit = PF_I(map, <>)->direction_index; if ((I == NULL) || (PL::Spatial::object_is_a_room(I) == FALSE)) { - if (pass == 1) Problems::Issue::map_problem(_p_(PM_MapFromNonRoom), + if (pass == 1) StandardProblems::map_problem(_p_(PM_MapFromNonRoom), p, "The first-named thing must be a room (beware ambiguities!)."); return; } if ((I2 == NULL) || (PL::Spatial::object_is_a_room(I2) == FALSE)) { - if (pass == 1) Problems::Issue::map_problem(_p_(PM_MapToNonRoom), + if (pass == 1) StandardProblems::map_problem(_p_(PM_MapToNonRoom), p, "The second-named thing must be a room (beware ambiguities!)."); return; } if (PL::SpatialMap::direction_is_lateral(exit) == FALSE) { - if (pass == 1) Problems::Issue::map_problem(_p_(PM_MapNonLateral), + if (pass == 1) StandardProblems::map_problem(_p_(PM_MapNonLateral), p, "The direction given as a hint for map placement must be " "a lateral direction (not up, down, above, below, inside " "or outside)."); @@ -601,7 +601,7 @@ void PL::EPSMap::new_map_hint_sentence(int pass, parse_node *p) { @; break; } } else { - Problems::Issue::map_problem(_p_(PM_MapBadRubric), + StandardProblems::map_problem(_p_(PM_MapBadRubric), p, "Unfortunately the details of that rubric seem to be " "in error (a lame message, but an accurate one)."); break; @@ -612,14 +612,14 @@ void PL::EPSMap::new_map_hint_sentence(int pass, parse_node *p) { Word::dequote(<>); wchar_t *thec = HTML::translate_colour_name(Lexer::word_text(<>)); if (thec == NULL) { - Problems::Issue::map_problem(_p_(PM_MapUnknownColour), p, "There's no such map colour."); + StandardProblems::map_problem(_p_(PM_MapUnknownColour), p, "There's no such map colour."); return; } rh->colour = thec; @ = if (<> == ERRONEOUS_OFFSET_VALUE) { - Problems::Issue::map_problem(_p_(PM_MapUnknownOffset), p, "There's no such offset."); + StandardProblems::map_problem(_p_(PM_MapUnknownOffset), p, "There's no such offset."); return; } rh->at_offset = <>; @@ -628,7 +628,7 @@ void PL::EPSMap::new_map_hint_sentence(int pass, parse_node *p) { instance *I = Instances::parse_object(Wordings::from(Node::get_text(p), i)); i = Wordings::last_wn(RESTW) + 1; if (I == NULL) { - Problems::Issue::map_problem(_p_(PM_MapUnknownOffsetBase), + StandardProblems::map_problem(_p_(PM_MapUnknownOffsetBase), p, "There's no such room to be offset from."); return; } @@ -664,7 +664,7 @@ void PL::EPSMap::new_map_hint_sentence(int pass, parse_node *p) { && (eml->map_level - Room_position(benchmark_room).z == ln)) scope = &(eml->map_parameters); if (scope == NULL) { - Problems::Issue::map_problem(_p_(PM_MapLevelMisnamed), + StandardProblems::map_problem(_p_(PM_MapLevelMisnamed), p, "Layers of the map must be called 'level N', where " "N is a number, and level 0 is the one which contains " "the first room."); @@ -700,7 +700,7 @@ void PL::EPSMap::new_map_hint_sentence(int pass, parse_node *p) { @ = if (index_map_with_pass == 1) { - Problems::Issue::map_problem(_p_(PM_MapSettingOfUnknown), + StandardProblems::map_problem(_p_(PM_MapSettingOfUnknown), index_map_with_p, "The parameter has to be 'of' either 'the first room' " "or a specific named room (beware ambiguities!) or " "a level such as 'level 0' (the first room is by " @@ -757,7 +757,7 @@ void PL::EPSMap::new_map_hint_sentence(int pass, parse_node *p) { break; default: internal_error("Unexpected map parameter data type"); } - if (pass == 1) Problems::Issue::map_problem_wanted_but(_p_(PM_MapSettingTypeFailed), + if (pass == 1) StandardProblems::map_problem_wanted_but(_p_(PM_MapSettingTypeFailed), p, i_wanted_a, wn); @h Offset notation. @@ -848,7 +848,7 @@ void PL::EPSMap::render_map_as_EPS(void) { filename *F = Task::epsmap_file(); text_stream EPS_struct; text_stream *EPS = &EPS_struct; if (STREAM_OPEN_TO_FILE(EPS, F, ISO_ENC) == FALSE) - Problems::Fatal::filename_related("Can't open EPS map file", F); + Problems::fatal_on_file("Can't open EPS map file", F); PL::EPSMap::EPS_compile_map(EPS); STREAM_CLOSE(EPS); diff --git a/inform7/if-module/Chapter 3/Map Connection Relations.w b/inform7/if-module/Chapter 3/Map Connection Relations.w index 8eb8ad375..df229d3fd 100644 --- a/inform7/if-module/Chapter 3/Map Connection Relations.w +++ b/inform7/if-module/Chapter 3/Map Connection Relations.w @@ -171,7 +171,7 @@ void PL::MapDirections::make_mapped_predicate(instance *I, inter_name *ident) { binary_predicate *bp = Sentences::Rearrangement::relation_noticed(mmp_call_counter++); if (bp == NULL) { LOG("Improper text: %W\n", W); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ImproperlyMadeDirection), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ImproperlyMadeDirection), "directions must be created by only the simplest possible sentences", "in the form 'North-north-west is a direction' only. Using adjectives, " "'called', 'which', and so on is not allowed. (In practice this is not " diff --git a/inform7/if-module/Chapter 3/Regions.w b/inform7/if-module/Chapter 3/Regions.w index af59ed7e0..3d8a2b429 100644 --- a/inform7/if-module/Chapter 3/Regions.w +++ b/inform7/if-module/Chapter 3/Regions.w @@ -92,7 +92,7 @@ int PL::Regions::regions_new_subject_notify(inference_subject *subj) { int PL::Regions::regions_set_subkind_notify(kind *sub, kind *super) { if ((sub == K_region) && (super != K_object)) { if (problem_count == 0) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RegionAdrift), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RegionAdrift), "'region' is not allowed to be a kind of anything (other than " "'object')", "because it's too fundamental to the way Inform maps out the " @@ -167,7 +167,7 @@ int PL::Regions::regions_intervene_in_assertion(parse_node *px, parse_node *py) if ((left_object) && (current_sentence != Instances::get_creating_sentence(left_object)) && (Instances::of_kind(left_object, K_region) == FALSE)) { - Problems::Issue::subject_problem_at_sentence(_p_(PM_ExistingRegion), + StandardProblems::subject_problem_at_sentence(_p_(PM_ExistingRegion), left_subject, "(which I notice in another sentence) seems now to " "be declared as a new region", @@ -179,7 +179,7 @@ int PL::Regions::regions_intervene_in_assertion(parse_node *px, parse_node *py) } if ((Node::get_type(px) == RELATIONSHIP_NT) && (Node::get_subject(py) == Kinds::Knowledge::as_subject(K_region))) { - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_RegionRelated), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_RegionRelated), "a region cannot be given a specific location", "since it contains what may be many rooms, which may not be " "contiguous and could be scattered about all over. (Sometimes " @@ -236,7 +236,7 @@ int PL::Regions::assert_relations(binary_predicate *relation, if (I1_is_region) @ else @; } else { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RegionRelation), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RegionRelation), "regions can only contain rooms", "and have no other relationships."); } @@ -245,7 +245,7 @@ int PL::Regions::assert_relations(binary_predicate *relation, if ((relation == R_incorporation) || (relation == R_containment) || (relation == R_regional_containment)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RegionRelation2), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RegionRelation2), "regions can only be contained in other regions", "and not for example in rooms."); } @@ -257,7 +257,7 @@ int PL::Regions::assert_relations(binary_predicate *relation, @ = if ((PF_I(regions, I1)->in_region) && (PF_I(regions, I1)->in_region != I0)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RegionInTwoRegions), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RegionInTwoRegions), "each region can only be declared to be inside a single " "other region", "since although regions can be placed inside each other, " diff --git a/inform7/if-module/Chapter 3/Scenes.w b/inform7/if-module/Chapter 3/Scenes.w index da26576e2..44edd3f3d 100644 --- a/inform7/if-module/Chapter 3/Scenes.w +++ b/inform7/if-module/Chapter 3/Scenes.w @@ -208,7 +208,7 @@ int PL::Scenes::parse_scene_end_name(scene *sc, wording EW, int create) { } @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ScenesWithTooManyEnds), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ScenesWithTooManyEnds), "this scene now has too many different ways to end", "and will need to be simplified. (We can have up to 15 ends to a scene " "if the project format is for the Z-machine, and 31 for Glulx: see the " @@ -371,7 +371,7 @@ The subject is simple: it has to be a scene name. @ = *X = FALSE; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ScenesOnly), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ScenesOnly), "'begins when' and 'ends when' can only be applied to scenes", "which have already been defined with a sentence like 'The final " "confrontation is a scene.'"); @@ -400,7 +400,7 @@ in a different context, for instance, and could still be valid in that case. @ = *X = -1; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ScenesDisallowCalled), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ScenesDisallowCalled), "'(called ...)' is not allowed within conditions for a scene to begin or end", "since calling gives only a temporary name to something, for the purpose " "of further instructions which immediately follow in. Here there is no room " @@ -409,7 +409,7 @@ in a different context, for instance, and could still be valid in that case. @ = *X = -1; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ScenesNotPlay), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ScenesNotPlay), "'play' is not really a scene", "so although you can write '... when play begins' you cannot write '... " "when play ends'. But there's no need to do so, anyway. When play ends, " @@ -417,7 +417,7 @@ in a different context, for instance, and could still be valid in that case. @ = *X = -1; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ScenesUnknownEnd), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ScenesUnknownEnd), "that's not one of the known ends for that scene", "which must be declared with something like 'Confrontation ends happily " "when...' or 'Confrontation ends tragically when...'."); @@ -488,7 +488,7 @@ void PL::Scenes::new_scene_anchor(parse_node *p, int phase, int given_end) { if (phase == 2) { @; if ((this_scene == SC_entire_game) && (external_condition == NULL)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_EntireGameHardwired), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_EntireGameHardwired), "the special 'Entire Game' scene cannot have its start or end modified", "because it is a built-in scene designed to be going on whenever there " "is play going on in the story."); @@ -507,7 +507,7 @@ void PL::Scenes::new_scene_anchor(parse_node *p, int phase, int given_end) { @ = if (this_scene->anchor_condition[end]) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ScenesOversetEnd), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ScenesOversetEnd), "you have already told me a condition for when that happens", "and although a scene can be linked to the beginning or ending " "of any number of other scenes, it can only have a single " @@ -707,7 +707,7 @@ void PL::Scenes::test_scene_end(scene *sc, int end, inter_symbol *ch_s, inter_sy } if (Node::is(S, UNKNOWN_NT)) { LOG("Condition: $P\n", S); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ScenesBadCondition), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ScenesBadCondition), "'begins when' and 'ends when' must be followed by a condition", "which this does not seem to be, or else 'when play begins', " "'when play ends', 'when S begins', or 'when S ends', where " @@ -1164,7 +1164,7 @@ void PL::Scenes::emit_during_clause(parse_node *spec) { } if (stuck) { Produce::val(Emit::tree(), K_truth_state, LITERAL_IVAL, 1); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ScenesBadDuring), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ScenesBadDuring), "'during' must be followed by the name of a scene or of a " "description which applies to a single scene", "such as 'during Station Arrival' or 'during a recurring scene'."); diff --git a/inform7/if-module/Chapter 3/Spatial Model.w b/inform7/if-module/Chapter 3/Spatial Model.w index 289b01c86..d93cd4a46 100644 --- a/inform7/if-module/Chapter 3/Spatial Model.w +++ b/inform7/if-module/Chapter 3/Spatial Model.w @@ -210,7 +210,7 @@ int PL::Spatial::spatial_explain_contradiction(inference *A, inference *B, int s Problems::quote_subject(3, subj); Problems::quote_object(4, World::Inferences::get_reference_as_object(A)); Problems::quote_object(5, World::Inferences::get_reference_as_object(B)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_SpatialContradiction)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_SpatialContradiction)); Problems::issue_problem_segment( "You wrote %1, but also %2: that seems to be saying that the same " "object (%3) must be in two different places (%4 and %5). This " @@ -280,7 +280,7 @@ of vehicle, and so on, but this would cause mayhem in the model world. So: int PL::Spatial::spatial_set_subkind_notify(kind *sub, kind *super) { if ((sub == K_thing) && (super != K_object)) { if (problem_count == 0) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ThingAdrift), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ThingAdrift), "'thing' is not allowed to be a kind of anything (other than " "'object')", "because it's too fundamental to the way Inform uses rooms " @@ -289,7 +289,7 @@ int PL::Spatial::spatial_set_subkind_notify(kind *sub, kind *super) { } if ((sub == K_room) && (super != K_object)) { if (problem_count == 0) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_RoomAdrift), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RoomAdrift), "'room' is not allowed to be a kind of anything (other than " "'object')", "because it's too fundamental to the way Inform uses rooms " @@ -299,7 +299,7 @@ int PL::Spatial::spatial_set_subkind_notify(kind *sub, kind *super) { if (((sub == K_container) && (super == K_supporter)) || ((sub == K_supporter) && (super == K_container))) { if (problem_count == 0) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ContainerAdrift), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ContainerAdrift), "'container' and 'supporter' are not allowed to be kinds " "of each other", "because they're too fundamental to the way Inform models the " @@ -399,7 +399,7 @@ just decided whether |I| is a room or not. We therefore draw the necessary inference. @ = - Problems::Issue::object_problem(_p_(PM_SceneryDoublyDescribed), + StandardProblems::object_problem(_p_(PM_SceneryDoublyDescribed), I, "is scenery, which means that it cannot sensibly have any 'initial " "appearance' property - being scenery, it isn't announced when the " @@ -481,7 +481,7 @@ int PL::Spatial::spatial_intervene_in_assertion(parse_node *px, parse_node *py) inference_subject *left_subject = Node::get_subject(px); if (left_subject) { if (InferenceSubjects::domain(left_subject)) - Problems::Issue::subject_problem_at_sentence(_p_(PM_KindNowhere), + StandardProblems::subject_problem_at_sentence(_p_(PM_KindNowhere), left_subject, "seems to be said to be 'nowhere' in some way", "which doesn't make sense. An individual thing can be 'nowhere', " @@ -515,7 +515,7 @@ void PL::Spatial::infer_presence_here(instance *I) { inference_subject *infs = Instances::as_subject(I); inference *inf; POSITIVE_KNOWLEDGE_LOOP(inf, infs, PARENTAGE_HERE_INF) { - Problems::Issue::contradiction_problem(_p_(PM_DuplicateHere), + StandardProblems::contradiction_problem(_p_(PM_DuplicateHere), World::Inferences::where_inferred(inf), current_sentence, I, @@ -690,7 +690,7 @@ when it's legitimately a door. @; @ = - Problems::Issue::contradiction_problem(_p_(PM_PersonContaining), + StandardProblems::contradiction_problem(_p_(PM_PersonContaining), sentence_setting_kind, World::Inferences::where_inferred(geography_inference), I, "cannot contain or support things like something inanimate", @@ -702,7 +702,7 @@ when it's legitimately a door. Inform spatial model: @ = - Problems::Issue::contradiction_problem(_p_(PM_CantContainAndSupport), + StandardProblems::contradiction_problem(_p_(PM_CantContainAndSupport), decider, World::Inferences::where_inferred(geography_inference), I, "cannot both contain things and support things", "which is what you're implying here. If you need both, the easiest way is " @@ -712,7 +712,7 @@ Inform spatial model: "stapler.'"); @ = - Problems::Issue::contradiction_problem(_p_(PM_BothRoomAndSupporter), + StandardProblems::contradiction_problem(_p_(PM_BothRoomAndSupporter), decider, World::Inferences::where_inferred(geography_inference), I, "would need to have two different and incompatible kinds to make both " @@ -794,7 +794,7 @@ int PL::Spatial::spatial_stage_II(void) { Problems::quote_object(2, I); Problems::quote_object(3, PL::Spatial::progenitor(I)); Problems::quote_kind(4, Instances::to_kind(I)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_NonThingInModel)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NonThingInModel)); Problems::issue_problem_segment( "In the sentence %1, you create an object '%2' which you then seem " "to place in or on or as part of '%3', but the kind of '%2' is %4. " @@ -834,7 +834,7 @@ object under investigation. @ = if (parent_setting_inference) { - Problems::Issue::contradiction_problem(_p_(PM_DuplicateParentage), + StandardProblems::contradiction_problem(_p_(PM_DuplicateParentage), World::Inferences::where_inferred(parent_setting_inference), World::Inferences::where_inferred(inf), I, @@ -851,7 +851,7 @@ object under investigation. @; if (whereabouts == NULL) { current_sentence = here_sentence; - Problems::Issue::object_problem_at_sentence(_p_(PM_NoHere), + StandardProblems::object_problem_at_sentence(_p_(PM_NoHere), I, "was described as being 'here', and there doesn't seem to be any " "location being talked about at this point in the source text", @@ -871,7 +871,7 @@ when it finishes this will be set to the most recently mentioned. inference *inf; POSITIVE_KNOWLEDGE_LOOP(inf, Instances::as_subject(I), PART_OF_INF) { if ((PL::Spatial::object_is_a_room(I)) || (PL::Map::object_is_a_door(I))) { - Problems::Issue::object_problem(_p_(PM_RoomOrDoorAsPart), + StandardProblems::object_problem(_p_(PM_RoomOrDoorAsPart), I, "was set up as being part of something else, which doors and rooms " "are not allowed to be", @@ -1069,7 +1069,7 @@ changed progenitors at Stage II.) @ = Problems::quote_object(1, I); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_IllFounded)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_IllFounded)); Problems::issue_problem_segment("The %1 seems to be containing itself: "); instance *I3 = I; while (TRUE) { @@ -1277,7 +1277,7 @@ int PL::Spatial::spatial_stage_IV(void) { instance *I; LOOP_OVER_OBJECT_INSTANCES(I) if (PL::Spatial::object_is_a_room(I)) { - Problems::Issue::unlocated_problem(Task::syntax_tree(), _p_(PM_RoomInIgnoredSource), + StandardProblems::unlocated_problem(Task::syntax_tree(), _p_(PM_RoomInIgnoredSource), "This is supposed to be a source text which only contains " "release instructions to bind up an existing story file " "(for instance, one produced using Inform 6). That's because " diff --git a/inform7/if-module/Chapter 3/Spatial Relations.w b/inform7/if-module/Chapter 3/Spatial Relations.w index a6e360ff2..23bccc1b1 100644 --- a/inform7/if-module/Chapter 3/Spatial Relations.w +++ b/inform7/if-module/Chapter 3/Spatial Relations.w @@ -174,7 +174,7 @@ int PL::SpatialRelations::REL_assert(binary_predicate *bp, *I1 = InferenceSubjects::as_object_instance(infs1); if ((I0) && (I1)) { if (I1 == I0) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_MiseEnAbyme), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_MiseEnAbyme), "this asks to put something inside itself", "like saying 'the bottle is in the bottle'."); return TRUE; @@ -207,7 +207,7 @@ way which isn't symmetrical between the two, and this way round is cleanest. @ This is the point at which non-assertable relations are thrown out. @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_Unassertable), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_Unassertable), "the relationship you describe is not exact enough", "so that I do not know how to make this assertion come true. " "For instance, saying 'The Study is adjacent to the Hallway.' " @@ -218,7 +218,7 @@ way which isn't symmetrical between the two, and this way round is cleanest. @ People sometimes try, a little hopefully, to subdivide rooms. Alas for them. @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PartOfRoom), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PartOfRoom), "this asks to make something a part of a room", "when only things are allowed to have parts."); return TRUE; diff --git a/inform7/if-module/Chapter 3/The Map.w b/inform7/if-module/Chapter 3/The Map.w index a77834ab1..bad44a7f0 100644 --- a/inform7/if-module/Chapter 3/The Map.w +++ b/inform7/if-module/Chapter 3/The Map.w @@ -198,7 +198,7 @@ int PL::Map::map_new_base_kind_notify(kind *new_base, text_stream *name, wording int PL::Map::map_set_subkind_notify(kind *sub, kind *super) { if ((sub == K_direction) && (super != K_object)) { if (problem_count == 0) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_DirectionAdrift), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DirectionAdrift), "'direction' is not allowed to be a kind of anything (other than " "'object')", "because it's too fundamental to the way Inform maps out the " @@ -207,21 +207,21 @@ int PL::Map::map_set_subkind_notify(kind *sub, kind *super) { } if (super == K_direction) { if (problem_count == 0) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_DirectionSubkinded), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DirectionSubkinded), "'direction' is not allowed to have more specific kinds", "because it's too fundamental to the way Inform maps out the " "geography of the physical world."); return TRUE; } if ((K_backdrop) && (sub == K_door) && (Kinds::Compare::le(super, K_backdrop))) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_DoorAdrift), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DoorAdrift), "'door' is not allowed to be a kind of 'backdrop'", "because it's too fundamental to the way Inform maps out the " "geography of the physical world."); return TRUE; } if ((K_backdrop) && (sub == K_backdrop) && (Kinds::Compare::le(super, K_door))) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BackdropAdrift), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BackdropAdrift), "'backdrop' is not allowed to be a kind of 'door'", "because it's too fundamental to the way Inform maps out the " "geography of the physical world."); @@ -307,13 +307,13 @@ int PL::Map::map_set_kind_notify(instance *I, kind *k) { @ = if (Wordings::empty(IW)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NamelessDirection), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NamelessDirection), "nameless directions are not allowed", "so writing something like 'There is a direction.' is forbidden."); return TRUE; } if (Wordings::length(IW) > MAX_WORDS_IN_DIRECTION) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_DirectionTooLong), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DirectionTooLong), "although direction names can be really quite long in today's Inform", "they can't be as long as that."); return TRUE; @@ -601,7 +601,7 @@ int PL::Map::map_intervene_in_assertion(parse_node *px, parse_node *py) { return FALSE; } if (Annotations::read_int(px, nowhere_ANNOT)) { - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_NowhereDescribed), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_NowhereDescribed), "'nowhere' cannot be made specific", "and so cannot have specific properties or be of any given kind."); return TRUE; @@ -643,7 +643,7 @@ void PL::Map::connect(inference_subject *i_from, inference_subject *i_to, Problems::quote_source(1, current_sentence); Problems::quote_object(2, forwards_dir); Problems::quote_object(3, go_to); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_WayFromUnclear)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_WayFromUnclear)); Problems::issue_problem_segment( "On the basis of %1, I'm trying to make a map connection in the " "%2 direction to %3, but I can't make sense of where it goes from."); @@ -656,7 +656,7 @@ void PL::Map::connect(inference_subject *i_from, inference_subject *i_to, if (Instances::of_kind(reverse_dir, K_direction) == FALSE) { Problems::quote_object(1, forwards_dir); Problems::quote_object(2, reverse_dir); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_OppositeNotDirection)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_OppositeNotDirection)); Problems::issue_problem_segment( "I'm trying to make a map connection in the %1 direction, " "which means there ought to be map connection back in the " @@ -737,7 +737,7 @@ checks that various mapping impossibilities do not occur. if ((PL::Spatial::object_is_a_room(I)) && (to) && (PL::Map::object_is_a_door(to) == FALSE) && (PL::Spatial::object_is_a_room(to) == FALSE)) - Problems::Issue::contradiction_problem(_p_(PM_BadMapCell), + StandardProblems::contradiction_problem(_p_(PM_BadMapCell), Instances::get_creating_sentence(to), World::Inferences::where_inferred(inf), to, "appears to be something which can be reached via a map " @@ -745,7 +745,7 @@ checks that various mapping impossibilities do not occur. "and these are the only possibilities allowed by Inform."); if ((PL::Map::object_is_a_door(I)) && (PL::Spatial::object_is_a_room(to) == FALSE)) - Problems::Issue::object_problem(_p_(PM_DoorToNonRoom), + StandardProblems::object_problem(_p_(PM_DoorToNonRoom), I, "seems to be a door opening on something not a room", "but a door must connect one or two rooms (and in particular is " @@ -803,7 +803,7 @@ checks that various mapping impossibilities do not occur. } @ = - Problems::Issue::object_problem(_p_(PM_DoorUnconnected), + StandardProblems::object_problem(_p_(PM_DoorUnconnected), I, "seems to be a door with no way in or out", "so either you didn't mean it to be a door or you haven't specified what's " @@ -815,7 +815,7 @@ checks that various mapping impossibilities do not occur. Problems::quote_source(2, where[0]); Problems::quote_source(3, where[1]); Problems::quote_source(4, where[2]); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_DoorOverconnected)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_DoorOverconnected)); Problems::issue_problem_segment( "%1 seems to be a door with three ways out (specified %2, %3 and %4), but " "you can only have one or two sides to a door in Inform: a one-sided " @@ -846,7 +846,7 @@ from which there's no way back.) Problems::quote_object(1, I); Problems::quote_object(2, to); Problems::quote_object(3, exit1); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RoomTwistyDoor)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RoomTwistyDoor)); Problems::issue_problem_segment( "%1, a room, seems to have a map connection which goes " "through %2, a door: but that doesn't seem physically " @@ -858,7 +858,7 @@ from which there's no way back.) Problems::quote_object(2, to); Problems::quote_object(3, exit1); Problems::quote_object(4, exit2); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RoomMissingDoor)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RoomMissingDoor)); Problems::issue_problem_segment( "%1, a room, seems to have a map connection which goes " "through %2, a door: but that doesn't seem physically " @@ -878,7 +878,7 @@ from which there's no way back.) (PF_I(map, I)->map_connection_b) && (World::Inferences::get_prop_state( Instances::as_subject(I), P_other_side))) - Problems::Issue::object_problem(_p_(PM_BothWaysDoor), + StandardProblems::object_problem(_p_(PM_BothWaysDoor), I, "seems to be a door whose connections have been given in both " "of the alternative ways at once", "by directly giving its map connections (the normal way to set up " @@ -900,7 +900,7 @@ model at run-time.) This is where we apply the kill-joy rule in question: (PL::Spatial::progenitor(I)) && (PL::Spatial::progenitor(I) != PF_I(map, I)->map_connection_a) && (PL::Spatial::progenitor(I) != PF_I(map, I)->map_connection_b)) - Problems::Issue::object_problem(_p_(PM_DoorInThirdRoom), + StandardProblems::object_problem(_p_(PM_DoorInThirdRoom), I, "seems to be a door which is present in a room to which it is not connected", "but this is not allowed. A door must be in one or both of the rooms it is " "between, but not in a third place altogether."); diff --git a/inform7/if-module/Chapter 3/The Naming Thicket.w b/inform7/if-module/Chapter 3/The Naming Thicket.w index bf91126a6..55c183884 100644 --- a/inform7/if-module/Chapter 3/The Naming Thicket.w +++ b/inform7/if-module/Chapter 3/The Naming Thicket.w @@ -201,7 +201,7 @@ a comma, and that's caught here: @ = LOOP_THROUGH_WORDING(j, W) { if (Lexer::word(j) == COMMA_V) { - Problems::Issue::subject_creation_problem(_p_(PM_CommaInName), + StandardProblems::subject_creation_problem(_p_(PM_CommaInName), subj, "has a comma in its name", "which is forbidden. Perhaps you used a comma in " @@ -211,7 +211,7 @@ a comma, and that's caught here: break; } if (Vocabulary::test_flags(j, TEXT_MC+TEXTWITHSUBS_MC)) { - Problems::Issue::subject_creation_problem(_p_(BelievedImpossible), + StandardProblems::subject_creation_problem(_p_(BelievedImpossible), subj, "has some double-quoted text in its name", "which is forbidden. Perhaps something odd happened " diff --git a/inform7/if-module/Chapter 3/The Player.w b/inform7/if-module/Chapter 3/The Player.w index 5a9ece156..ba67d605c 100644 --- a/inform7/if-module/Chapter 3/The Player.w +++ b/inform7/if-module/Chapter 3/The Player.w @@ -288,7 +288,7 @@ int PL::Player::player_complete_model(int stage) { @ = if ((start_room == NULL) && (Task::wraps_existing_storyfile() == FALSE)) { - Problems::Issue::unlocated_problem(Task::syntax_tree(), _p_(PM_NoStartRoom), + StandardProblems::unlocated_problem(Task::syntax_tree(), _p_(PM_NoStartRoom), "There doesn't seem to be any location in this story, so there's " "nowhere for the player to begin. This may be because I have " "misunderstood what was meant to be a room and what wasn't: I " @@ -311,7 +311,7 @@ will do. But otherwise: while ((start_room) && (PL::Spatial::progenitor(start_room))) start_room = PL::Spatial::progenitor(start_room); if ((start_room) && (PL::Spatial::object_is_a_room(start_room) == FALSE)) { - Problems::Issue::object_problem(_p_(PM_StartsOutsideRooms), + StandardProblems::object_problem(_p_(PM_StartsOutsideRooms), start_object, "seems to be where the player is supposed to begin", "but (so far as I know) it is not a room, nor is it ultimately " @@ -320,7 +320,7 @@ will do. But otherwise: inference *inf; POSITIVE_KNOWLEDGE_LOOP(inf, Instances::as_subject(player_character_object), PART_OF_INF) { - Problems::Issue::object_problem(_p_(PM_PlayerIsPart), + StandardProblems::object_problem(_p_(PM_PlayerIsPart), start_object, "seems to have the player attached as a component part", "which is not allowed. The player can be in a room, or " diff --git a/inform7/if-module/Chapter 4/Action Patterns.w b/inform7/if-module/Chapter 4/Action Patterns.w index 7ce0e8c4d..88ea453cf 100644 --- a/inform7/if-module/Chapter 4/Action Patterns.w +++ b/inform7/if-module/Chapter 4/Action Patterns.w @@ -332,14 +332,14 @@ void PL::Actions::Patterns::categorise_as(action_pattern *ap, wording W) { LOGIF(ACTION_PATTERN_PARSING, "Categorising the action:\n$A...as %W\n", ap, W); if (
(W)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NamedAPIsArticle), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NamedAPIsArticle), "there's only an article here", "not a name, so I'm not sure what this action is supposed to be."); return; } if (ap->actor_spec) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NamedAPWithActor), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NamedAPWithActor), "behaviour characterised by named action patterns can only specify the action", "not the actor: as a result, it cannot include requests to other people to " "do things."); @@ -368,7 +368,7 @@ int PL::Actions::Patterns::check_going(parse_node *spec, char *keyword, Problems::quote_kind(4, ka); Problems::quote_kind(5, Instances::to_kind(oref)); if (kb) Problems::quote_kind(6, kb); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_GoingWrongKind)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_GoingWrongKind)); if (kb) Problems::issue_problem_segment( "In the sentence %1, %2 seems to be intended as something the " @@ -384,7 +384,7 @@ int PL::Actions::Patterns::check_going(parse_node *spec, char *keyword, Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(spec)); Problems::quote_text(3, keyword); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_GoingWithoutObject)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_GoingWithoutObject)); Problems::issue_problem_segment( "In the sentence %1, '%2' seems to be intended as something the player " "might be going %3, but it doesn't make sense in that context."); @@ -417,7 +417,7 @@ parse_node *PL::Actions::Patterns::parse_verified_action_parameter(wording W) { if (Node::is(spec, UNKNOWN_NT)) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadOptionalAPClause)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadOptionalAPClause)); Problems::issue_problem_segment( "In %1, I tried to read a description of an action - a complicated " "one involving optional clauses; but '%2' wasn't something I " @@ -1487,7 +1487,7 @@ int PL::Actions::Patterns::compile_pattern_match_clause_inner(int f, LOGIF(ACTION_PATTERN_COMPILATION, "[MPE on $P: $P]\n", I6_var_TS, spec); kind *K = Specifications::to_kind(spec); if (Kinds::Behaviour::definite(K) == FALSE) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_APClauseIndefinite), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_APClauseIndefinite), "that action seems to involve a value which is unclear about " "its kind", "and that's not allowed. For example, you're not allowed to just " @@ -2266,7 +2266,7 @@ void PL::Actions::Patterns::emit_past_tense(action_pattern *ap) { } @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PTAPTooComplex), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PTAPTooComplex), "that is too complex a past tense action", "at least for this version of Inform to handle: we may improve " "matters in later releases. The restriction is that the " diff --git a/inform7/if-module/Chapter 4/Actions.w b/inform7/if-module/Chapter 4/Actions.w index 292bc9b03..22d57622b 100644 --- a/inform7/if-module/Chapter 4/Actions.w +++ b/inform7/if-module/Chapter 4/Actions.w @@ -493,14 +493,14 @@ void PL::Actions::translates(wording W, parse_node *p2) { if ((W)) an = <>; else { LOG("Tried action name %W\n", W); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TranslatesNonAction), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TranslatesNonAction), "this does not appear to be the name of an action", "so cannot be translated into I6 at all."); return; } if (an->translated) { LOG("Tried action name %W = %n\n", W, PL::Actions::base_iname(an)); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TranslatesActionAlready), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TranslatesActionAlready), "this action has already been translated", "so there must be some duplication somewhere."); return; @@ -547,7 +547,7 @@ and this allows "exiting from the cage", say, as an action pattern. *X = NOT_APPLICABLE; Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BadMatchingSyntax)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadMatchingSyntax)); Problems::issue_problem_segment( "You wrote %1, which I am reading as a request to make " "a new named variable for an action - a value associated " @@ -559,7 +559,7 @@ and this allows "exiting from the cage", say, as an action pattern. @ = Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ActionVarAnd)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ActionVarAnd)); Problems::issue_problem_segment( "You wrote %1, which I am reading as a request to make " "a new named variable for an action - a value associated " @@ -575,7 +575,7 @@ void PL::Actions::an_add_variable(action_name *an, parse_node *cnode) { if (Node::get_type(cnode) != PROPERTYCALLED_NT) { Problems::quote_source(1, current_sentence); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ActionVarUncalled)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ActionVarUncalled)); Problems::issue_problem_segment( "You wrote %1, which I am reading as a request to make " "a new named variable for an action - a value associated " @@ -590,7 +590,7 @@ void PL::Actions::an_add_variable(action_name *an, parse_node *cnode) { if (an->owned_by_an == NULL) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(cnode->down->next)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(Untestable)); /* since we no longer define such actions */ + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(Untestable)); /* since we no longer define such actions */ Problems::issue_problem_segment( "You wrote %1, which I am reading as a request to make " "a new named variable for an action - a value associated " @@ -614,7 +614,7 @@ void PL::Actions::an_add_variable(action_name *an, parse_node *cnode) { if (Wordings::length(MW) > 1) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, MW); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_MatchedAsTooLong)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_MatchedAsTooLong)); Problems::issue_problem_segment( "You wrote %1, which I am reading as a request to make " "a new named variable for an action - a value associated " @@ -636,7 +636,7 @@ void PL::Actions::an_add_variable(action_name *an, parse_node *cnode) { if (Specifications::is_description(spec)) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(cnode->down)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ActionVarOverspecific)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ActionVarOverspecific)); Problems::issue_problem_segment( "You wrote %1, which I am reading as a request to make " "a new named variable for an action - a value associated " @@ -651,7 +651,7 @@ void PL::Actions::an_add_variable(action_name *an, parse_node *cnode) { LOG("Offending SP: $T", spec); Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(cnode->down)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ActionVarUnknownKOV)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ActionVarUnknownKOV)); Problems::issue_problem_segment( "You wrote %1, but '%2' is not the name of a kind of " "value which I know (such as 'number' or 'text')."); @@ -663,7 +663,7 @@ void PL::Actions::an_add_variable(action_name *an, parse_node *cnode) { if (Kinds::Compare::eq(K, K_value)) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(cnode->down)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ActionVarValue)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ActionVarValue)); Problems::issue_problem_segment( "You wrote %1, but saying that a variable is a 'value' " "does not give me a clear enough idea what it will hold. " @@ -718,7 +718,7 @@ void PL::Actions::compile_action_name_var_creators(void) { @ = *X = FALSE; *XP = NULL; - Problems::Issue::assertion_problem(Task::syntax_tree(), _p_(PM_BadActionDeclaration), + Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_BadActionDeclaration), "it is not sufficient to say that something is an 'action'", "without giving the necessary details: for example, 'Unclamping " "is an action applying to one thing.'"); @@ -773,7 +773,7 @@ action to be created. @ = *XP = NULL; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ActionAlreadyExists), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ActionAlreadyExists), "that seems to be an action already existing", "so it cannot be redefined now. If you would like to reconfigure " "an action in the standard set - for instance if you prefer " @@ -840,7 +840,7 @@ It's convenient to define a single action clause first: ==> R[1] @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ActionClauseUnknown), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ActionClauseUnknown), "the action definition contained text I couldn't follow", "and may be too complicated."); @@ -851,7 +851,7 @@ It's convenient to define a single action clause first: case PP_ACT_CLAUSE: { wording C = GET_RW(, 1); if (Wordings::length(C) != 1) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_MultiwordPastParticiple), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_MultiwordPastParticiple), "a past participle must be given as a single word", "even if the action name itself is longer than that. " "(For instance, the action name 'hanging around until' " @@ -892,7 +892,7 @@ It's convenient to define a single action clause first: @ = *X = REQUIRES_ACCESS; *XP = K_thing; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ActionMisapplied), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ActionMisapplied), "an action can only apply to things or to kinds of value", "for instance: 'photographing is an action applying to " "one visible thing'."); @@ -928,7 +928,7 @@ void PL::Actions::act_parse_definition(parse_node *p) { if (an->max_parameters >= 2) { if ((Kinds::Compare::le(an->noun_kind, K_object) == FALSE) && (Kinds::Compare::le(an->second_kind, K_object) == FALSE)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ActionBothValues), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ActionBothValues), "this action definition asks to have a single action apply " "to two different things which are not objects", "and unfortunately a fundamental restriction is that an " @@ -1130,7 +1130,7 @@ void PL::Actions::check_types_for_grammar(action_name *an, int tok_values, Problems::quote_wording(2, Node::get_text(an->designers_specification)); Problems::quote_wording(3, an->present_name); Problems::quote_text(4, failed_on); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_GrammarMismatchesAction)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_GrammarMismatchesAction)); Problems::issue_problem_segment("The grammar you give in %1 is not compatible " "with the %3 action (defined as '%2') - %4."); Problems::issue_problem_end(); diff --git a/inform7/if-module/Chapter 5/Grammar Lines.w b/inform7/if-module/Chapter 5/Grammar Lines.w index 6a4986d38..b47d42090 100644 --- a/inform7/if-module/Chapter 5/Grammar Lines.w +++ b/inform7/if-module/Chapter 5/Grammar Lines.w @@ -184,13 +184,13 @@ known what the action will be. ... ==> @; @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_WhenAction), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_WhenAction), "the condition after 'when' involves the current action", "but this can never work, because when Inform is still trying to " "understand a command, the current action isn't yet decided on."); @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadWhen), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadWhen), "the condition after 'when' makes no sense to me", "although otherwise this worked - it is only the part after 'when' " "which I can't follow."); @@ -555,7 +555,7 @@ void PL::Parsing::Lines::slash_grammar_line(grammar_line *gl) { for (pn = gl->tokens->down; pn; pn = pn->next) if ((Annotations::read_int(pn, slash_class_ANNOT) > 0) && (Annotations::read_int(pn, grammar_token_literal_ANNOT) == FALSE)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_OverAmbitiousSlash), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_OverAmbitiousSlash), "the slash '/' can only be used between single literal words", "so 'underneath/under/beneath' is allowed but " "'beneath/[florid ways to say under]/under' isn't."); @@ -621,7 +621,7 @@ parse_node *PL::Parsing::Lines::line_list_determine(grammar_line *list_head, if (PL::Parsing::Verbs::allow_mixed_lines(gv)) continue; current_sentence = gl->where_grammar_specified; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_MixedOutcome), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_MixedOutcome), "grammar tokens must have the same outcome whatever the way they are " "reached", "so writing a line like 'Understand \"within\" or \"next to " @@ -685,7 +685,7 @@ parse_node *PL::Parsing::Lines::gl_determine(grammar_line *gl, int depth, } if (multiples > 1) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_MultipleMultiples), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_MultipleMultiples), "there can be at most one token in any line which can match " "multiple things", "so you'll have to remove one of the 'things' tokens and " @@ -696,7 +696,7 @@ parse_node *PL::Parsing::Lines::gl_determine(grammar_line *gl, int depth, if (gv_is == GV_IS_COMMAND) spec = NULL; else { if (nrv < 2) spec = PL::Parsing::Tokens::Types::get_single_type(&(gl->gl_type)); - else Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TwoValuedToken), + else StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TwoValuedToken), "there can be at most one varying part in the definition of a " "named token", "so 'Understand \"button [a number]\" as \"[button indication]\"' " @@ -1047,7 +1047,7 @@ void PL::Parsing::Lines::compile_grammar_line(gpr_kit *gprk, grammar_line *gl, i pn = gl->tokens->down; if ((genuinely_verbal) && (pn)) { if (Annotations::read_int(pn, slash_class_ANNOT) != 0) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_SlashedCommand), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_SlashedCommand), "at present you're not allowed to use a / between command " "words at the start of a line", "so 'put/interpose/insert [something]' is out."); @@ -1081,7 +1081,7 @@ void PL::Parsing::Lines::compile_grammar_line(gpr_kit *gprk, grammar_line *gl, i if (gl->reversed) { if (token_values < 2) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_CantReverseOne), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantReverseOne), "you can't use a 'reversed' action when you supply fewer " "than two values for it to apply to", "since reversal is the process of exchanging them."); @@ -1196,7 +1196,7 @@ void PL::Parsing::Lines::compile_token_line(gpr_kit *gprk, int code_mode, parse_ for (; pn; pn = pn->next) { if ((PL::Parsing::Tokens::is_text(pn)) && (pn->next) && (PL::Parsing::Tokens::is_literal(pn->next) == FALSE)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TextFollowedBy), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TextFollowedBy), "a '[text]' token must either match the end of some text, or " "be followed by definitely known wording", "since otherwise the run-time parser isn't good enough to " @@ -1204,7 +1204,7 @@ void PL::Parsing::Lines::compile_token_line(gpr_kit *gprk, int code_mode, parse_ } if ((Node::get_grammar_token_relation(pn)) && (gv_is != GV_IS_OBJECT)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_GrammarObjectlessRelation), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_GrammarObjectlessRelation), "a grammar token in an 'Understand...' can only be based " "on a relation if it is to understand the name of a room or thing", "since otherwise there is nothing for the relation to be with."); diff --git a/inform7/if-module/Chapter 5/Grammar Properties.w b/inform7/if-module/Chapter 5/Grammar Properties.w index 2ea6a43d1..973694b9c 100644 --- a/inform7/if-module/Chapter 5/Grammar Properties.w +++ b/inform7/if-module/Chapter 5/Grammar Properties.w @@ -317,7 +317,7 @@ parse_node *PL::Parsing::Visibility::get_condition(property_permission *pp) { if (Dash::validate_conditional_clause(spec) == FALSE) { LOG("$T", spec); current_sentence = PLUGIN_PP(parsing, pp)->visibility_sentence; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadVisibilityWhen), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadVisibilityWhen), "the condition after 'when' makes no sense to me", "although otherwise this worked - it is only the part after 'when' " "which I can't follow."); diff --git a/inform7/if-module/Chapter 5/Grammar Tokens.w b/inform7/if-module/Chapter 5/Grammar Tokens.w index 07528ce15..a379a22c0 100644 --- a/inform7/if-module/Chapter 5/Grammar Tokens.w +++ b/inform7/if-module/Chapter 5/Grammar Tokens.w @@ -262,7 +262,7 @@ kind *PL::Parsing::Tokens::kind_for_special_token(int gtc) { *X = RELATED_GTC; *XP = NULL; Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_GrammarBadRelation)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_GrammarBadRelation)); Problems::issue_problem_segment( "The grammar token '%2' in the sentence %1 " "invites me to understand names of related things, " @@ -273,7 +273,7 @@ kind *PL::Parsing::Tokens::kind_for_special_token(int gtc) { *X = TOPIC_TOKEN_GTC; Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_UseTextNotTopic)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_UseTextNotTopic)); Problems::issue_problem_segment( "The grammar token '%2' in the sentence %1 would in some " "ways be the right logical way to suggest 'any words at " @@ -290,7 +290,7 @@ kind *PL::Parsing::Tokens::kind_for_special_token(int gtc) { *X = MULTI_TOKEN_GTC; Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_UseThingNotObject)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_UseThingNotObject)); Problems::issue_problem_segment( "The grammar token '%2' in the sentence %1 would in some " "ways be the right logical way to suggest 'any object at " @@ -318,11 +318,11 @@ void PL::Parsing::Tokens::incompatible_change_problem(char *token_tried, char *t Problems::quote_text(2, token_tried); Problems::quote_text(3, token_instead); Problems::quote_text(4, token_better); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_ObsoleteHeldTokens)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ObsoleteHeldTokens)); Problems::issue_problem_segment( "In the sentence %1, you used the '[%2]' as a token, which was " "allowed in the early Public Beta versions of Inform 7, but became " - "out of date in August 2006%|. A change was then made so that if an " + "out of date in August 2006.%L A change was then made so that if an " "action needed to apply to something which was carried, this would " "now be specified when the action is created - not in the Understand " "line for it. For instance, one might say 'Dismantling is an action " @@ -344,7 +344,7 @@ void PL::Parsing::Tokens::incompatible_change_problem(char *token_tried, char *t Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); Problems::quote_kind_of(3, RP[1]); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_BizarreToken)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BizarreToken)); Problems::issue_problem_segment( "The grammar token '%2' in the sentence %1 looked to me as " "if it might be %3, but this isn't something allowed in " @@ -356,7 +356,7 @@ void PL::Parsing::Tokens::incompatible_change_problem(char *token_tried, char *t LOG("$T", current_sentence); Problems::quote_source(1, current_sentence); Problems::quote_wording(2, W); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_UnknownToken)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_UnknownToken)); Problems::issue_problem_segment( "I was unable to understand what you meant by the grammar token '%2' " "in the sentence %1."); @@ -431,7 +431,7 @@ parse_node *PL::Parsing::Tokens::determine(parse_node *pn, int depth, int *score (Kinds::Behaviour::request_I6_GPR(K) == FALSE)) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(pn)); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_UnparsableKind)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_UnparsableKind)); Problems::issue_problem_segment( "The grammar token '%2' in the sentence %1 " "invites me to understand values typed by the player during " @@ -715,7 +715,7 @@ kind *PL::Parsing::Tokens::compile(gpr_kit *gprk, parse_node *pn, int code_mode, } else if (bp == R_equality) { Problems::quote_source(1, current_sentence); Problems::quote_source(2, pn); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_RelatedByEquality)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RelatedByEquality)); Problems::issue_problem_segment( "The grammar you give in %1 contains a token %2 which would " "create a circularity. To follow this, I'd have to compute " @@ -864,7 +864,7 @@ kind *PL::Parsing::Tokens::compile(gpr_kit *gprk, parse_node *pn, int code_mode, } else { Problems::quote_source(1, current_sentence); Problems::quote_source(2, pn); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_GrammarValueRelation)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_GrammarValueRelation)); Problems::issue_problem_segment( "The grammar you give in %1 contains a token " "which relates things to values - %2. At present, " @@ -914,7 +914,7 @@ kind *PL::Parsing::Tokens::compile(gpr_kit *gprk, parse_node *pn, int code_mode, Problems::quote_source(1, current_sentence); Problems::quote_source(2, pn); Problems::quote_kind(3, K); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_GrammarValueRelation2)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_GrammarValueRelation2)); Problems::issue_problem_segment( "The grammar you give in %1 contains a token " "which relates things to values - %2. (It would " @@ -959,7 +959,7 @@ kind *PL::Parsing::Tokens::compile(gpr_kit *gprk, parse_node *pn, int code_mode, LOG("Whose reversal is: $2\n", BinaryPredicates::get_reversal(bp)); Problems::quote_source(1, current_sentence); Problems::quote_source(2, pn); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_GrammarTokenCowardice)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_GrammarTokenCowardice)); Problems::issue_problem_segment( "The grammar you give in %1 contains a token " "which uses a relation I'm unable to test - %2."); @@ -1095,7 +1095,7 @@ kind *PL::Parsing::Tokens::compile(gpr_kit *gprk, parse_node *pn, int code_mode, if (Descriptions::is_complex(spec)) { Problems::quote_source(1, current_sentence); Problems::quote_source(2, pn); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(PM_OverComplexToken)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_OverComplexToken)); Problems::issue_problem_segment( "The grammar you give in %1 contains a token " "which is just too complicated - %2. %PFor instance, a " @@ -1111,7 +1111,7 @@ kind *PL::Parsing::Tokens::compile(gpr_kit *gprk, parse_node *pn, int code_mode, K = PL::Parsing::Tokens::kind_for_special_token(gtc); if (code_mode) { if ((consult_mode) && (gtc == TOPIC_TOKEN_GTC)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TextTokenRestricted), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TextTokenRestricted), "the '[text]' token is not allowed with 'matches' " "or in table columns", "as it is just too complicated to sort out: a " diff --git a/inform7/if-module/Chapter 5/Grammar Types.w b/inform7/if-module/Chapter 5/Grammar Types.w index 321b3b0c7..4c29d5315 100644 --- a/inform7/if-module/Chapter 5/Grammar Types.w +++ b/inform7/if-module/Chapter 5/Grammar Types.w @@ -46,7 +46,7 @@ int PL::Parsing::Tokens::Types::add_type(grammar_type *gty, parse_node *spec, gty->second_multiplicity = multiple_flag; return score; case 2: - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_ThreeValuedLine), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ThreeValuedLine), "there can be at most two varying parts to a line of grammar", "so 'put [something] in [a container]' is allowed but 'put " "[something] in [something] beside [a door]' is not."); diff --git a/inform7/if-module/Chapter 5/Grammar Verbs.w b/inform7/if-module/Chapter 5/Grammar Verbs.w index 379e7033e..b44c62956 100644 --- a/inform7/if-module/Chapter 5/Grammar Verbs.w +++ b/inform7/if-module/Chapter 5/Grammar Verbs.w @@ -214,7 +214,7 @@ void PL::Parsing::Verbs::add_command(grammar_verb *gv, wording W) { if (gv->gv_is != GV_IS_COMMAND) internal_error("tried to add alias command to non-command GV"); if (gv->no_aliased_commands == MAX_ALIASED_COMMANDS) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TooManyAliases), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TooManyAliases), "this 'understand the command ... as ...' makes too many aliases " "for the same command", "exceeding the limit of 32."); @@ -286,7 +286,7 @@ packaging_state PL::Parsing::Verbs::gv_compile_Verb_directive_header(grammar_ver current_sentence = gv->where_gv_created; Problems::quote_source(1, current_sentence); Problems::quote_wording(2, gv->command); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(BelievedImpossible)); Problems::issue_problem_segment( "You wrote %1, but %2 is a built-in Inform testing verb, which " "means it is reserved for Inform's own use and can't be used " @@ -440,7 +440,7 @@ void PL::Parsing::Verbs::translates(wording W, parse_node *p2) { grammar_verb *gv; LOOP_OVER(gv, grammar_verb) if ((gv->gv_is == GV_IS_TOKEN) && (Wordings::match(W, gv->name))) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_GrammarTranslatedAlready), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_GrammarTranslatedAlready), "this grammar token has already been translated", "so there must be some duplication somewhere."); return; @@ -545,7 +545,7 @@ void PL::Parsing::Verbs::add_line(grammar_verb *gv, grammar_line *gl) { LOGIF(GRAMMAR, "Adding grammar line $g to verb $G\n", gl, gv); if ((gv->gv_is == GV_IS_COMMAND) && (PL::Parsing::Lines::list_length(gv->first_line) >= MAX_LINES_PER_COMMAND)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TooManyGrammarLines), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TooManyGrammarLines), "this command verb now has too many Understand possibilities", "that is, there are too many 'Understand \"whatever ...\" as ...' " "which share the same initial word 'whatever'. The best way to " @@ -630,7 +630,7 @@ parse_node *PL::Parsing::Verbs::determine(grammar_verb *gv, int depth) { return PL::Parsing::Tokens::Types::get_single_type(&(gv->gv_type)); if (depth > NUMBER_CREATED(grammar_verb)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_GrammarIllFounded), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_GrammarIllFounded), "grammar tokens are not allowed to be defined in terms of " "themselves", "either directly or indirectly."); diff --git a/inform7/if-module/Chapter 5/Noun Filter Tokens.w b/inform7/if-module/Chapter 5/Noun Filter Tokens.w index 76384688b..00de30977 100644 --- a/inform7/if-module/Chapter 5/Noun Filter Tokens.w +++ b/inform7/if-module/Chapter 5/Noun Filter Tokens.w @@ -27,7 +27,7 @@ noun_filter_token *PL::Parsing::Tokens::Filters::nft_new(parse_node *spec, int g pcalc_prop *prop = Specifications::to_proposition(spec); if ((prop) && (Calculus::Variables::number_free(prop) != 1)) { LOG("So $P and $D\n", spec, prop); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_FilterQuantified), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_FilterQuantified), "the [any ...] doesn't clearly give a description in the '...' part", "where I was expecting something like '[any vehicle]'."); spec = Specifications::from_kind(K_object); @@ -255,14 +255,14 @@ int too_late_for_further_NFTs = FALSE; int PL::Parsing::Tokens::Filters::new_id(parse_node *spec, int global_scope, int any_things) { if (too_late_for_further_NFTs) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), "complicated instructions on understanding the player's command " "are not allowed in the past tense", "for instance by being applied to several previous turns in a row."); kind *K = Specifications::to_kind(spec); if ((Kinds::Compare::le(K, K_object) == FALSE) && (Kinds::Behaviour::request_I6_GPR(K) == FALSE) && (global_scope)) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), "this is a kind of value I can't understand in command grammar", "so the '[any ...]' part will have to go."); diff --git a/inform7/if-module/Chapter 5/Traverse for Grammar.w b/inform7/if-module/Chapter 5/Traverse for Grammar.w index c30436ee9..713cbe1e4 100644 --- a/inform7/if-module/Chapter 5/Traverse for Grammar.w +++ b/inform7/if-module/Chapter 5/Traverse for Grammar.w @@ -148,7 +148,7 @@ As examples: @ = *X = NO_UNDERSTAND_FORM; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_OldVerbUsage), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_OldVerbUsage), "this is an outdated form of words", "and Inform now prefers 'Understand the command ...' " "rather than 'Understand the verb ...'. (Since this " @@ -190,7 +190,7 @@ formal way (with "property"). @ = if (!preform_lookahead_mode) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnknownUnderstandProperty), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnknownUnderstandProperty), "I don't understand what property that refers to", "but it doesn't seem to be a property I know. An example of " "correct usage is 'understand the transparent property as " @@ -306,7 +306,7 @@ It's not widely known, but the object phrase here can be a list. @ = *X = -1; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_TextlessMistake), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TextlessMistake), "when 'understand' results in a mistake it can only be " "followed by a textual message in brackets", "so for instance 'understand \"take\" as a mistake " @@ -315,7 +315,7 @@ It's not widely known, but the object phrase here can be a list. @ = *X = -1; LOG("Offending pseudo-meaning is: %W\n", W); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandVariable), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandVariable), "this meaning is a value that varies", "whereas I need something fixed. " "(The most common case of this is saying that something should be " @@ -329,7 +329,7 @@ It's not widely known, but the object phrase here can be a list. @; @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandVague), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandVague), "'understand ... as ...' should be followed " "by a meaning", "which might be an action (e.g., " @@ -357,7 +357,7 @@ Here the grammar is very simple, and the object can't be a list. @ = *X = -1; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandCommandWhen), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandCommandWhen), "'understand the command ... as ...' is not allowed to have a " "'... when ...' clause", "for the moment at any rate."); @@ -395,7 +395,7 @@ to or described can be of any kind, but in fact we restrict to kinds of object. @ = *X = 0; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadUnderstandProperty), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadUnderstandProperty), "'understand the ... property as ...' is only allowed if " "followed by 'describing ...' or 'referring to ...'", "so for instance 'understand the transparent property as " @@ -403,7 +403,7 @@ to or described can be of any kind, but in fact we restrict to kinds of object. @ = *XP = NULL; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadUnderstandPropertyAs), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadUnderstandPropertyAs), "I don't understand what single thing or kind of thing that refers to", "but it does need to be an object (or kind of object) and not " "some other sort of value. For instance, 'understand the transparent " @@ -487,7 +487,7 @@ void PL::Parsing::understand_the_command(wording W, wording ASW) { wchar_t *p = Lexer::word_text(Wordings::first_wn(W)); for (int i=0; p[i]; i++) if (p[i] == ' ') { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_SpacyCommand), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_SpacyCommand), "'understand the command ... as ...' is only allowed when " "the old command is a single word", "so for instance 'understand the command \"capture\" as \"get\"' " @@ -505,7 +505,7 @@ void PL::Parsing::understand_the_command(wording W, wording ASW) { DESTROY(gv, grammar_verb); gv = NULL; } else { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NotNewCommand), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NotNewCommand), "'understand the command ... as ...' is only allowed when " "the new command has no meaning already", "so for instance 'understand \"drop\" as \"throw\"' is not " @@ -524,7 +524,7 @@ void PL::Parsing::understand_the_command(wording W, wording ASW) { } @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NotOldCommand), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NotOldCommand), "'understand the command ... as ...' should end with a command " "already defined", "as in 'understand the command \"steal\" as \"take\"'. (This " @@ -544,7 +544,7 @@ void PL::Parsing::understand_property_block(property *pr, int level, inference_s (Str::len(Kinds::Behaviour::get_recognition_only_GPR(Properties::Valued::kind(pr))) == 0) && ((Kinds::Compare::le(Properties::Valued::kind(pr), K_object)) || (Kinds::Behaviour::request_I6_GPR(Properties::Valued::kind(pr)) == FALSE))) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadReferringProperty), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadReferringProperty), "that property is of a kind which I can't recognise in " "typed commands", "so that it cannot be understand as describing or referring to " @@ -554,7 +554,7 @@ void PL::Parsing::understand_property_block(property *pr, int level, inference_s "(like snippet or rulebook, for instance) I can't use."); } if (PL::Parsing::Visibility::seek(pr, subj, level, WHENW) == FALSE) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnknownUnpermittedProperty), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnknownUnpermittedProperty), "that property is not allowed for the thing or kind in question", "just as (ordinarily) 'understand the open property as describing a " "device' would not be allowed because it makes no sense to call a " @@ -566,11 +566,11 @@ void PL::Parsing::understand_property_block(property *pr, int level, inference_s @ = void PL::Parsing::understand_nothing(understanding_reference *ur, wording WHENW) { if ((ur == NULL) || (ur->gv_result != GV_IS_OBJECT) || (ur->an_reference == NULL)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandNothingNonAction), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandNothingNonAction), "'Understand nothing as ...' must be followed by an action", "such as 'Understand nothing as taking.'"); } else if (Wordings::nonempty(WHENW)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandNothingWhen), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandNothingWhen), "'Understand nothing as ...' must be unconditional", "so your 'when' or 'while' condition will have to go."); } else { @@ -601,22 +601,22 @@ void PL::Parsing::understand_block(wording W, understanding_reference *ur, wordi if (problem_count > base_problem_count) return; if ((W) == FALSE) { if (table_entry) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), "a table entry in a 'topic' column must be a single double-quoted " "text", "such as \"eternity\" or \"peruvian skies\"."); else if (TEST_COMPILATION_MODE(SPECIFICATIONS_CMODE)) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NontextualUnderstandInAP), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NontextualUnderstandInAP), "the topic here should be in the form of a textual description", "as in 'asking about \"[something]\"'."); else - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_NontextualUnderstand), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NontextualUnderstand), "'understand' should be followed by a textual description", "as in 'understand \"take [something]\" as taking the noun'."); return; } if (Word::well_formed_text_routine(Lexer::word_text(Wordings::first_wn(W))) == FALSE) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandMismatch), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandMismatch), "'understand' should be followed by text in which brackets " "'[' and ']' match", "so for instance 'understand \"take [something]\" as taking the noun' " @@ -645,7 +645,7 @@ void PL::Parsing::understand_block(wording W, understanding_reference *ur, wordi gv_is = GV_IS_OBJECT; if (Descriptions::is_qualified(spec)) { LOG("Offending description: $T", spec); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandAsQualified), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandAsQualified), "I cannot understand text as meaning an object " "qualified by relative clauses or properties", "only a specific thing, a specific value or a kind. " @@ -670,7 +670,7 @@ void PL::Parsing::understand_block(wording W, understanding_reference *ur, wordi gv_is = GV_IS_VALUE; } else { if (Kinds::get_construct(K) == CON_activity) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandAsActivity), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandAsActivity), "this 'understand ... as ...' gives text " "meaning an activity", "rather than an action. Since activities " @@ -678,7 +678,7 @@ void PL::Parsing::understand_block(wording W, understanding_reference *ur, wordi "happen, not in response to typed commands, " "this doesn't make sense."); else - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandAsBadValue), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandAsBadValue), "'understand ... as ...' gives text " "meaning a value whose kind is not allowed", "and should be a value such as 100."); @@ -725,7 +725,7 @@ void PL::Parsing::understand_block(wording W, understanding_reference *ur, wordi } if ((pluralised) && (gv_is != GV_IS_OBJECT)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandPluralValue), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandPluralValue), "'understand' as a plural can only apply to things, rooms or kinds " "of things or rooms", "so 'Understand \"paperwork\" as the plural of a document.' is " @@ -744,7 +744,7 @@ void PL::Parsing::understand_block(wording W, understanding_reference *ur, wordi literal_punct = TRUE; } if (literal_punct) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_LiteralPunctuation), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LiteralPunctuation), "'understand' text cannot contain literal punctuation", "or more specifically cannot contain any of these: . , ! ? : ; " "since they are already used in various ways by the parser, and " @@ -756,7 +756,7 @@ void PL::Parsing::understand_block(wording W, understanding_reference *ur, wordi to_pn = NounPhrases::new_raw(W); PL::Parsing::Tokens::break_into_tokens(to_pn, XW); if (to_pn->down == NULL) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandEmptyText), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandEmptyText), "'understand' should be followed by text which contains at least " "one word or square-bracketed token", "so for instance 'understand \"take [something]\" as taking' " @@ -771,7 +771,7 @@ void PL::Parsing::understand_block(wording W, understanding_reference *ur, wordi LOOP_THROUGH_WORDING(i, XW) if (i < Wordings::last_wn(XW)) if ((compare_word(i, COMMA_V)) && (compare_word(i+1, COMMA_V))) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandCommaCommand), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandCommaCommand), "'understand' as an action cannot involve a comma", "since a command leading to an action never does. " "(Although Inform understands commands like 'PETE, LOOK' " @@ -796,7 +796,7 @@ void PL::Parsing::understand_block(wording W, understanding_reference *ur, wordi if (Wordings::nonempty(WHENW)) { PL::Parsing::Lines::set_understand_when(gl, WHENW); if (gv_is == GV_IS_CONSULT) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), /* at present, I7 syntax prevents this anyway */ + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), /* at present, I7 syntax prevents this anyway */ "'when' cannot be used with this kind of 'Understand'", "for the time being at least."); return; @@ -805,7 +805,7 @@ void PL::Parsing::understand_block(wording W, understanding_reference *ur, wordi if (Wordings::nonempty(WHENW)) { PL::Parsing::Lines::set_understand_when(gl, WHENW); if (gv_is == GV_IS_CONSULT) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), /* at present, I7 syntax prevents this anyway */ + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), /* at present, I7 syntax prevents this anyway */ "'when' cannot be used with this kind of 'Understand'", "for the time being at least."); return; @@ -814,7 +814,7 @@ void PL::Parsing::understand_block(wording W, understanding_reference *ur, wordi if (u_prop) { PL::Parsing::Lines::set_understand_prop(gl, u_prop); if (gv_is == GV_IS_CONSULT) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), /* at present, I7 syntax prevents this anyway */ + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible), /* at present, I7 syntax prevents this anyway */ "'when' cannot be used with this kind of 'Understand'", "for the time being at least."); return; @@ -826,7 +826,7 @@ void PL::Parsing::understand_block(wording W, understanding_reference *ur, wordi XW = Feeds::feed_C_string_full(Lexer::word_text(Wordings::first_wn(ur->reference_text)), TRUE, GRAMMAR_PUNCTUATION_MARKS); LOGIF(GRAMMAR_CONSTRUCTION, "GV_IS_TOKEN as words: %W\n", XW); if (PL::Parsing::valid_new_token_name(XW) == FALSE) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandAsCompoundText), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnderstandAsCompoundText), "if 'understand ... as ...' gives the meaning as text " "then it must describe a single new token", "so that 'Understand \"group four/five/six\" as " diff --git a/inform7/index-module/Chapter 2/Documentation References.w b/inform7/index-module/Chapter 2/Documentation References.w index f8831462b..3186614fc 100644 --- a/inform7/index-module/Chapter 2/Documentation References.w +++ b/inform7/index-module/Chapter 2/Documentation References.w @@ -33,7 +33,27 @@ typedef struct documentation_ref { @ -@d DOCUMENTATION_REFERENCES_PRESENT +@d DOCUMENTATION_REFERENCE_PROBLEMS_CALLBACK Index::DocReferences::show_xref_in_problem + += +void Index::DocReferences::show_xref_in_problem(text_stream *OUT, text_stream *sigil) { + wchar_t *chap = NULL, *sec = NULL; + wchar_t *leaf = Index::DocReferences::link_if_possible_once( + sigil, &chap, &sec); + if (leaf) { + HTML::open_indented_p(OUT, 2, "tight"); + HTML_OPEN_WITH("a", "href=inform:/%w.html", leaf); + HTML_TAG_WITH("img", "border=0 src=inform:/doc_images/help.png"); + HTML_CLOSE("a"); + WRITE(" "); + if ((chap) && (sec)) { + WRITE("See the manual: %w > %w", chap, sec); + } else { + WRITE("See the manual."); + } + HTML_CLOSE("p"); + } +} @ The blue query icons link to pages in the documentation, as described above. Documentation references are used to match the documentation text against diff --git a/inform7/index-module/Chapter 2/Index File Services.w b/inform7/index-module/Chapter 2/Index File Services.w index 550e43b3c..a12bf2c42 100644 --- a/inform7/index-module/Chapter 2/Index File Services.w +++ b/inform7/index-module/Chapter 2/Index File Services.w @@ -71,7 +71,7 @@ text_stream *Index::open_file(text_stream *index_leaf, text_stream *title, int s filename *F = Task::index_file(index_leaf, sub); if (ifl) Index::close_index_file(); if (STREAM_OPEN_TO_FILE(&index_file_struct, F, UTF8_ENC) == FALSE) - Problems::Fatal::filename_related("Can't open index file", F); + Problems::fatal_on_file("Can't open index file", F); ifl = &index_file_struct; text_stream *OUT = ifl; diff --git a/inform7/multimedia-module/Chapter 2/External Files.w b/inform7/multimedia-module/Chapter 2/External Files.w index a183f3f39..6773d2de1 100644 --- a/inform7/multimedia-module/Chapter 2/External Files.w +++ b/inform7/multimedia-module/Chapter 2/External Files.w @@ -51,7 +51,7 @@ int PL::Files::files_new_named_instance_notify(instance *nc) { kind *K = Instances::to_kind(nc); if (Kinds::Compare::eq(K, K_external_file)) { if (allow_exf_creations == FALSE) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BackdoorFileCreation), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BackdoorFileCreation), "this is not the way to create a new external file", "which should be done with a special 'The File ... is called ...' " "sentence."); @@ -92,7 +92,7 @@ Here is the subject: @ = *X = NOT_APPLICABLE; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadFileOwner), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadFileOwner), "the owner of this file is wrongly specified", "since it is not one of the three possibilities - " "(1) Specify nothing: making the file belong to this " @@ -115,7 +115,7 @@ letters or digits, with the first being a letter. @ = *X = -1; - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_FilenameNotTextual), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_FilenameNotTextual), "a file can only be called with a single quoted piece of text", "as in: 'The File of Wisdom is called \"wisdom\".'"); @@ -173,7 +173,7 @@ void PL::Files::register_file(wording F, wording FN) { } if (bad_filename) { LOG("Filename: %s\n", p); - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_FilenameUnsafe), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_FilenameUnsafe), "filenames must be very conservatively chosen", "in order to be viable on a wide range of computers. They must " "consist of 3 to 23 English letters or digits, with the first being " @@ -202,7 +202,7 @@ void PL::Files::register_file(wording F, wording FN) { LOG("Objected to character %c\n", p[j]); } if ((invalid) || (j==47)) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BadFileIFID), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadFileIFID), "the owner of the file should be specified " "using a valid double-quoted IFID", "as in: 'The File of Wisdom (owned by project " @@ -219,7 +219,7 @@ void PL::Files::register_file(wording F, wording FN) { if (((F)) && (Rvalues::is_CONSTANT_of_kind(<>, K_external_file))) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_FilenameDuplicate), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_FilenameDuplicate), "this is already the name of a file", "so there must be some duplication somewhere."); return; diff --git a/inform7/multimedia-module/Chapter 2/Figures.w b/inform7/multimedia-module/Chapter 2/Figures.w index 8da2aa4ed..454341cc6 100644 --- a/inform7/multimedia-module/Chapter 2/Figures.w +++ b/inform7/multimedia-module/Chapter 2/Figures.w @@ -52,7 +52,7 @@ int PL::Figures::figures_new_named_instance_notify(instance *nc) { kind *K = Instances::to_kind(nc); if (Kinds::Compare::eq(K, K_figure_name)) { if (allow_figure_creations == FALSE) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BackdoorFigureCreation), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BackdoorFigureCreation), "this is not the way to create a new figure name", "which should be done with a special 'Figure ... is the file ...' " "sentence."); @@ -118,7 +118,7 @@ int PL::Figures::new_figure_SMF(int task, parse_node *V, wording *NPs) { ... ==> @; @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PictureNotTextual), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PictureNotTextual), "a figure can only be declared as a quoted file name", "which should be the name of a JPEG or PNG image inside the " "project's .materials folder. For instance, 'Figure 2 is the " @@ -145,7 +145,7 @@ void PL::Figures::register_figure(wording F, wording FN) { Assertions::Creator::vet_name_for_noun(F); if (((F)) && (Rvalues::is_CONSTANT_of_kind(<>, K_figure_name))) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_PictureDuplicate), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PictureDuplicate), "this is already the name of a Figure", "so there must be some duplication somewhere."); return; diff --git a/inform7/multimedia-module/Chapter 2/Sound Effects.w b/inform7/multimedia-module/Chapter 2/Sound Effects.w index ef827658f..f48ded395 100644 --- a/inform7/multimedia-module/Chapter 2/Sound Effects.w +++ b/inform7/multimedia-module/Chapter 2/Sound Effects.w @@ -48,7 +48,7 @@ int PL::Sounds::sounds_new_named_instance_notify(instance *nc) { kind *K = Instances::to_kind(nc); if (Kinds::Compare::eq(K, K_sound_name)) { if (allow_sound_creations == FALSE) - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_BackdoorSoundCreation), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BackdoorSoundCreation), "this is not the way to create a new sound name", "which should be done with a special 'Sound ... is the file ...' " "sentence."); @@ -111,7 +111,7 @@ int PL::Sounds::new_sound_SMF(int task, parse_node *V, wording *NPs) { ... ==> @; @ = - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_SoundNotTextual), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_SoundNotTextual), "a sound effect can only be declared as a quoted file name", "which should be the name of an AIFF or OGG file inside the Sounds " "subfolder of the project's .materials folder. For instance, 'Sound " @@ -131,7 +131,7 @@ void PL::Sounds::register_sound(wording F, wording FN) { if (((F)) && (Rvalues::is_CONSTANT_of_kind(<>, K_sound_name))) { - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(PM_SoundDuplicate), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_SoundDuplicate), "this is already the name of a sound effect", "so there must be some duplication somewhere."); return; diff --git a/inter/codegen-module/Chapter 1/Pipelines.w b/inter/codegen-module/Chapter 1/Pipelines.w index 2ff55ce56..19a915d40 100644 --- a/inter/codegen-module/Chapter 1/Pipelines.w +++ b/inter/codegen-module/Chapter 1/Pipelines.w @@ -308,7 +308,7 @@ void CodeGen::Pipeline::run(pathname *P, codegen_pipeline *S, linked_list *PP, (step->step_stage->stage_arg == EXT_TEXT_OUT_STAGE_ARG)) { if (STREAM_OPEN_TO_FILE(T, step->parsed_filename, ISO_ENC) == FALSE) { #ifdef PROBLEMS_MODULE - Problems::Fatal::filename_related("Can't open output file", step->parsed_filename); + Problems::fatal_on_file("Can't open output file", step->parsed_filename); #endif #ifndef PROBLEMS_MODULE Errors::fatal_with_file("Can't open output file", step->parsed_filename); diff --git a/inter/codegen-module/Chapter 2/Template Reader.w b/inter/codegen-module/Chapter 2/Template Reader.w index 64f7a564f..3646552b6 100644 --- a/inter/codegen-module/Chapter 2/Template Reader.w +++ b/inter/codegen-module/Chapter 2/Template Reader.w @@ -95,7 +95,7 @@ void TemplateReader::report_unacted_upon_interventions(void) { LOG("Intervention at stage %d Segment %S Part %S\n", i6ti->intervention_stage, i6ti->segment_name, i6ti->part_name); #ifdef PROBLEMS_MODULE - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(Untestable), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(Untestable), "no template file of that name was ever read in", "so this attempt to intervene had no effect. " "The template files have names like 'Output.i6t', 'Parser.i6t' " @@ -113,7 +113,7 @@ void TemplateReader::report_unacted_upon_interventions(void) { LOG("Intervention at stage %d Segment %S Part %S\n", i6ti->intervention_stage, i6ti->segment_name, i6ti->part_name); #ifdef PROBLEMS_MODULE - Problems::Issue::sentence_problem(Task::syntax_tree(), _p_(Untestable), + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(Untestable), "that template file didn't have a part with that name", "so this attempt to intervene had no effect. " "Each template file is divided internally into a number of " @@ -344,7 +344,7 @@ heading markers, in order to accommodate both old and new Inweb syntaxes. LOG("heading begins: <%S>\n", I6T_buffer); #ifdef PROBLEMS_MODULE Problems::quote_stream(1, I6T_buffer); - Problems::Issue::unlocated_problem(Task::syntax_tree(), _p_(...), + StandardProblems::unlocated_problem(Task::syntax_tree(), _p_(...), "An unknown '@...' marker has been found at column 0 in " "raw Inform 6 template material: specifically, '@%1'. ('@' " "has a special meaning in this first column, and this " @@ -386,7 +386,7 @@ heading markers, in order to accommodate both old and new Inweb syntaxes. inweb_syntax = INWEB_FIGURE_SYNTAX; } else if (Regexp::match(&mr, I6T_buffer, L" %(%c*%) *")) { #ifdef PROBLEMS_MODULE - Problems::Issue::unlocated_problem(Task::syntax_tree(), _p_(...), + StandardProblems::unlocated_problem(Task::syntax_tree(), _p_(...), "An '= (...)' marker has been found at column 0 in " "raw Inform 6 template material, of a kind not allowed."); #endif @@ -561,7 +561,7 @@ void TemplateReader::error(char *message, text_stream *quote) { TEMPORARY_TEXT(M); WRITE_TO(M, message, quote); Problems::quote_stream(1, M); - Problems::Issue::handmade_problem(Task::syntax_tree(), _p_(...)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(...)); Problems::issue_problem_segment( "I ran into a mistake in a template file: %1. The I6 " "template files (or .i6t files) are a very low-level part of Inform, " diff --git a/services/problems-module/Chapter 1/Telemetry.w b/services/problems-module/Chapter 1/Telemetry.w index aaa64c4cc..6be351db2 100644 --- a/services/problems-module/Chapter 1/Telemetry.w +++ b/services/problems-module/Chapter 1/Telemetry.w @@ -28,7 +28,7 @@ void Telemetry::ensure_telemetry_file(void) { if (telmy) return; if (attempts_to_open_telemetry++ > 0) return; if (STREAM_OPEN_TO_FILE_APPEND(telemetry_file, spool_telemetry_to, ISO_ENC) == FALSE) - Problems::Fatal::filename_related("Can't open telemetry file", spool_telemetry_to); + Problems::fatal_on_file("Can't open telemetry file", spool_telemetry_to); telmy = telemetry_file; WRITE_TO(telmy, "\n-- -- -- -- -- -- -- --\n%B (build %B): telemetry.\n", FALSE, TRUE); diff --git a/services/problems-module/Chapter 2/Problems, Level 0.w b/services/problems-module/Chapter 2/Problems, Level 0.w index 1fe28cad2..18e4fdb34 100644 --- a/services/problems-module/Chapter 2/Problems, Level 0.w +++ b/services/problems-module/Chapter 2/Problems, Level 0.w @@ -1,4 +1,4 @@ -[Problems::Fatal::] Problems, Level 0. +[ProblemSigils::] Problems, Level 0. To handle fatal errors and establish how problem sigils work. @@ -18,16 +18,35 @@ int sigil_of_required_problem_found = FALSE; int echo_problem_message_sigils = FALSE; int crash_on_all_problems = FALSE; -void Problems::Fatal::exit(int code) { +void ProblemSigils::exit(int code) { if ((sigil_of_required_problem) && (sigil_of_required_problem_found == FALSE)) exit(0); /* so that the problem test case will fail in |intest| */ exit(code); } -@ Inform calls this in response to its |-require-problem| command line switch: +@ The following function has had an amusing evolution over the years. It does +something nobody is ever supposed to do: deliberately crashes the process. +At one time it executed |int x = 1/0;|, but compilers got wise to that, or +else would detect that such an expression had no side effects and was not used. +What we now do is to dereference a null pointer, while apparently trying to make +use of the result. = -void Problems::Fatal::require(text_stream *sigil) { +void ProblemSigils::force_crash(void) { + STREAM_FLUSH(STDOUT); + STREAM_FLUSH(DL); + WRITE_TO(STDERR, + "*** Intentionally crashing to force stack backtrace to console logs ***\n"); + STREAM_FLUSH(STDERR); + parse_node *PN = NULL; LOG("$T", PN->next); + ProblemSigils::exit(1); /* should never in fact be reached */ +} + +@h Configuration. +Inform calls this in response to its |-require-problem| command line switch: + += +void ProblemSigils::require(text_stream *sigil) { sigil_of_required_problem = Str::duplicate(sigil); } @@ -35,7 +54,7 @@ void Problems::Fatal::require(text_stream *sigil) { be echoed to standard output (i.e., printed). Again, this is useful in testing. = -void Problems::Fatal::echo_sigils(int state) { +void ProblemSigils::echo_sigils(int state) { echo_problem_message_sigils = state; } @@ -43,7 +62,7 @@ void Problems::Fatal::echo_sigils(int state) { Inform in the debugger. = -void Problems::Fatal::crash_on_problems(int state) { +void ProblemSigils::crash_on_problems(int state) { crash_on_all_problems = state; } @@ -98,40 +117,3 @@ text_stream *sigil_of_latest_unlinked_problem = NULL; sigil_of_required_problem_found = TRUE; if (echo_problem_message_sigils) WRITE_TO(STDERR, "Problem__ %S\n", sigil_of_latest_problem); - -@h Further fatalities. - -= -void Problems::Fatal::issue(char *message) { - WRITE_TO(STDERR, message); - WRITE_TO(STDERR, "\n"); - STREAM_FLUSH(STDERR); - if (crash_on_all_problems) Problems::Fatal::force_crash(); - Problems::Fatal::exit(2); -} - -void Problems::Fatal::filename_related(char *message, filename *F) { - WRITE_TO(STDERR, message); - WRITE_TO(STDERR, "\nOffending filename: <%f>\n", F); - STREAM_FLUSH(STDERR); - if (crash_on_all_problems) Problems::Fatal::force_crash(); - Problems::Fatal::exit(2); -} - -@ The following function has had an amusing evolution over the years. It does -something nobody is ever supposed to do: deliberately crashes the process. -At one time it executed |int x = 1/0;|, but compilers got wise to that, or -else would detect that such an expression had no side effects and was not used. -What we now do is to dereference a null pointer, while apparently trying to make -use of the result. - -= -void Problems::Fatal::force_crash(void) { - STREAM_FLUSH(STDOUT); - STREAM_FLUSH(DL); - WRITE_TO(STDERR, - "*** Intentionally crashing to force stack backtrace to console logs ***\n"); - STREAM_FLUSH(STDERR); - parse_node *PN = NULL; LOG("$T", PN->next); - Problems::Fatal::exit(1); /* should never in fact be reached */ -} diff --git a/services/problems-module/Chapter 2/Problems, Level 1.w b/services/problems-module/Chapter 2/Problems, Level 1.w index 0f1fd79b4..e21bbc65c 100644 --- a/services/problems-module/Chapter 2/Problems, Level 1.w +++ b/services/problems-module/Chapter 2/Problems, Level 1.w @@ -1,4 +1,4 @@ -[Problems::Buffer::] Problems, Level 1. +[ProblemBuffer::] Problems, Level 1. To render problem messages either as plain text or HTML, and write them out to files. @@ -10,7 +10,7 @@ it in a single text stream: = text_stream *PBUFF = NULL; -void Problems::Buffer::clear(void) { +void ProblemBuffer::clear(void) { if (PBUFF == NULL) PBUFF = Str::new(); else Str::clear(PBUFF); } @@ -29,7 +29,7 @@ any sentence in one go: @d QUOTATION_TOLERANCE_LIMIT 100 = -void Problems::Buffer::copy_text_into_problem_buffer(wording W) { +void ProblemBuffer::copy_text(wording W) { W = Wordings::truncate(W, QUOTATION_TOLERANCE_LIMIT); WRITE_TO(PBUFF, "%"); return; } source_file *referred = Lexer::file_of_origin(Wordings::first_wn(W)); TEMPORARY_TEXT(file); if (referred) { WRITE_TO(file, "%f", TextFromFiles::get_filename(referred)); - #ifdef HTML_MODULE pathname *proj = HTML::get_link_abbreviation_path(); if (proj) { TEMPORARY_TEXT(project_prefix); @@ -64,25 +64,14 @@ void Problems::Buffer::copy_source_reference_into_problem_buffer(wording W) { if (Str::prefix_eq(file, project_prefix, Str::len(project_prefix))) Str::delete_n_characters(file, Str::len(project_prefix)); } - #endif } else { WRITE_TO(file, "(no file)"); } WRITE_TO(PBUFF, "'"); - Problems::Buffer::copy_text_into_problem_buffer(W); + ProblemBuffer::copy_text(W); text_stream *paraphrase = file; - #ifdef SUPERVISOR_MODULE - paraphrase = I"source text"; - inform_extension *E = Extensions::corresponding_to(referred); - if (E) { - inbuild_work *work = E->as_copy->edition->work; - if ((work) && (Works::is_standard_rules(work))) - paraphrase = I"the Standard Rules"; - else if ((work) && (Works::is_basic_inform(work))) - paraphrase = I"Basic Inform"; - else - paraphrase = file; - } + #ifdef DESCRIBE_SOURCE_FILE_PROBLEMS_CALLBACK + paraphrase = DESCRIBE_SOURCE_FILE_PROBLEMS_CALLBACK(paraphrase, referred, file); #endif WRITE_TO(PBUFF, "' %c%S%c%S%c%d%c", SOURCE_REF_CHAR, paraphrase, @@ -94,10 +83,10 @@ void Problems::Buffer::copy_source_reference_into_problem_buffer(wording W) { (redirected_to_B) && (Wordings::eq(Node::get_text(redirected_sentence), W))) { WRITE_TO(PBUFF, " (which asserts that "); - Problems::Buffer::copy_source_reference_into_problem_buffer( + ProblemBuffer::copy_source_reference( Node::get_text(redirected_to_A)); WRITE_TO(PBUFF, " is/are "); - Problems::Buffer::copy_source_reference_into_problem_buffer( + ProblemBuffer::copy_source_reference( Node::get_text(redirected_to_B)); WRITE_TO(PBUFF, ")"); } @@ -106,7 +95,7 @@ void Problems::Buffer::copy_source_reference_into_problem_buffer(wording W) { @ Once the error message is fully constructed, we will want to output it to a file: in fact, by default it will go in three directions, to -|stderr|, to the debugging log and of course to the error log. The main +|stderr|, to the debugging log and of course to the problems file. The main thing is to word-wrap it, since it is likely to be a paragraph-sized chunk of text, not a single line. The unprintable |SOURCE_REF_CHAR| and |FORCE_NEW_PARA_CHAR| are simply filtered out for plain text output: for @@ -115,18 +104,13 @@ HTML, they are dealt with elsewhere. = int problem_count_at_last_in = 1; text_stream problems_file_struct; /* The actual report of Problems file */ -text_stream *problems_file = &problems_file_struct; /* The actual report of Problems file */ - -text_stream *probl = NULL; /* Current destination of problem message text */ - -int it_is_not_worth_adding = FALSE; /* To suppress the "It may be worth adding..." */ - +text_stream *problems_file = &problems_file_struct; /* As a |text_sream *| */ #ifndef PROBLEMS_HTML_EMITTER #define PROBLEMS_HTML_EMITTER PUT_TO #endif -void Problems::Buffer::output_problem_buffer_to(OUTPUT_STREAM, int indentation) { +void ProblemBuffer::output_problem_buffer_to(OUTPUT_STREAM, int indentation) { int line_width = 0, html_flag = FALSE; if (OUT == problems_file) html_flag = TRUE; for (int k=0; k = WRITE("("); line_width++; - while (Str::get_at(PBUFF, ++i) != SOURCE_REF_CHAR) @; + while (Str::get_at(PBUFF, ++i) != SOURCE_REF_CHAR) + @; while (Str::get_at(PBUFF, ++i) != SOURCE_REF_CHAR) ; WRITE(", line "); line_width += 7; - while (Str::get_at(PBUFF, ++i) != SOURCE_REF_CHAR) @; + while (Str::get_at(PBUFF, ++i) != SOURCE_REF_CHAR) + @; WRITE(")"); line_width++; @ = @@ -270,31 +256,54 @@ after the sequence of whitespace. WRITE(" "); line_width++; } -@ The following handles the three-way distribution of problems, but also -allows us to route individual messages to only one output of our choice by -temporarily setting the |probl| variable: which is a convenience for -informational messages such as appear in index files, for instance. +@ The following allows us to route individual messages to only one output of +our choice. = -void Problems::Buffer::redirect_problem_stream(text_stream *S) { - probl = S; +text_stream *redirected_problem_text = NULL; /* Current destination of problem message text */ +void ProblemBuffer::redirect_problem_stream(text_stream *S) { + redirected_problem_text = S; } int telemetry_recording = FALSE; -void Problems::Buffer::output_problem_buffer(int indentation) { - if (probl == NULL) { - Problems::Buffer::output_problem_buffer_to(problems_file, indentation); +void ProblemBuffer::output_problem_buffer(int indentation) { + if (redirected_problem_text == NULL) { + ProblemBuffer::output_problem_buffer_to(problems_file, indentation); WRITE_TO(problems_file, "\n"); - Problems::Buffer::output_problem_buffer_to(STDERR, indentation); + ProblemBuffer::output_problem_buffer_to(STDERR, indentation); STREAM_FLUSH(STDERR); WRITE_TO(DL, "\n"); - Problems::Buffer::output_problem_buffer_to(DL, indentation); + ProblemBuffer::output_problem_buffer_to(DL, indentation); WRITE_TO(DL, "\n"); if (telemetry_recording) { WRITE_TO(telmy, "\n"); - Problems::Buffer::output_problem_buffer_to(telmy, indentation); + ProblemBuffer::output_problem_buffer_to(telmy, indentation); WRITE_TO(telmy, "\n"); } - } else Problems::Buffer::output_problem_buffer_to(probl, indentation); + } else ProblemBuffer::output_problem_buffer_to(redirected_problem_text, indentation); +} + +@h Problems report and index. +That gives us enough infrastructure to produce the final report. Note the use +of error redirection to in order to put pseudo-problem messages -- actually +informational -- into the report. In the case where the run was successful and +there we no Problem messages, we have to be careful to reset |problem_count| +-- it will have been increased by the issuing of these pseudo-problems, and we +need it to remain 0 so that |main()| can finally return back to the operating +system without an error code. + += +int tail_of_report_written = FALSE; +void ProblemBuffer::write_reports(int disaster_struck) { + if (tail_of_report_written) return; + tail_of_report_written = TRUE; + + crash_on_all_problems = FALSE; + #ifdef INFORMATIONAL_ADDENDA_PROBLEMS_CALLBACK + int pc = problem_count; + INFORMATIONAL_ADDENDA_PROBLEMS_CALLBACK(disaster_struck, problem_count); + problem_count = pc; + #endif + HTML::end_body(problems_file); } diff --git a/services/problems-module/Chapter 2/Problems, Level 2.w b/services/problems-module/Chapter 2/Problems, Level 2.w index e7fa91267..0f6f434c7 100644 --- a/services/problems-module/Chapter 2/Problems, Level 2.w +++ b/services/problems-module/Chapter 2/Problems, Level 2.w @@ -77,8 +77,8 @@ void Problems::show_problem_location(parse_node_tree *T) { parse_node *problem_headings[NO_HEADING_LEVELS]; int i, f = FALSE; if (problem_count == 0) { - #ifdef FIRST_PROBLEM_CALLBACK - FIRST_PROBLEM_CALLBACK(problems_file); + #ifdef FIRST_PROBLEMS_CALLBACK + FIRST_PROBLEMS_CALLBACK(problems_file); #endif for (i=0; i = source_file *pos = NULL; - Problems::Buffer::clear(); + ProblemBuffer::clear(); if (problem_count > 0) WRITE_TO(PBUFF, ">---> "); WRITE_TO(PBUFF, "In"); for (f=FALSE; ias_copy->edition->work); + #ifdef GLOSS_EXTENSION_SOURCE_FILE_PROBLEMS_CALLBACK + GLOSS_EXTENSION_SOURCE_FILE_PROBLEMS_CALLBACK(PBUFF, pos); #endif } WRITE_TO(PBUFF, ":"); - Problems::Buffer::output_problem_buffer(0); - Problems::Buffer::clear(); + ProblemBuffer::output_problem_buffer(0); + ProblemBuffer::clear(); @h Problem quotations. -Problem messages are printed using a printf-like formatting system. -Unlike printf, though, where |%s| means a string and |%d| a number, here -the escape codes do not indicate the type of the data: they are simply -|%1|, |%2|, |%3|, ..., |%9|. This is to prevent horrendous crashes when -type mismatches occur: using a pointer to a phrase when trying to print a -source code reference, for instance. - The texts to be substituted in place of |%1|, |%2|, ..., are called the "quotations". The value is either a range of words in the source text, or -else a pointer to some data structure, depending on the type. The type is a +else a pointer to some object, depending on the type. The type is a single character code. (This coding system is used only here, and could easily be changed, but there seems no reason to.) -The type codes are S(ource), W(ords), B(inary predicate), E(xtension), -(p)H(rase), I(nvocation), N(umber), O(bject), P(roperty name), T(ext), -(t)Y(pe specification). - = typedef struct problem_quotation { char quotation_type; /* one of the above */ @@ -189,19 +177,20 @@ void Problems::quote_source(int t, parse_node *p) { } void Problems::quote_source_eliding_begin(int t, parse_node *p) { if (p == NULL) Problems::problem_quote_textual(t, 'S', EMPTY_WORDING); - else { - wording W = Node::get_text(p); - #ifdef CORE_MODULE - if ((W)) W = GET_RW(, 1); - #endif - Problems::problem_quote_textual(t, 'S', W); - } + else Problems::problem_quote_textual(t, 'S', Node::get_text(p)); +} +void Problems::quote_wording(int t, wording W) { + Problems::problem_quote_textual(t, 'W', W); +} +void Problems::quote_wording_tinted_green(int t, wording W) { + Problems::problem_quote_textual(t, 'g', W); +} +void Problems::quote_wording_tinted_red(int t, wording W) { + Problems::problem_quote_textual(t, 'r', W); +} +void Problems::quote_wording_as_source(int t, wording W) { + Problems::problem_quote_textual(t, 'S', W); } -void Problems::quote_wording(int t, wording W) { Problems::problem_quote_textual(t, 'W', W); } -void Problems::quote_wording_tinted_green(int t, wording W) { Problems::problem_quote_textual(t, 'g', W); } -void Problems::quote_wording_tinted_red(int t, wording W) { Problems::problem_quote_textual(t, 'r', W); } -void Problems::quote_wording_as_source(int t, wording W) { Problems::problem_quote_textual(t, 'S', W); } - void Problems::quote_text(int t, char *p) { Problems::problem_quote(t, (void *) p, Problems::expand_text); } @@ -246,10 +235,13 @@ Some of the text is common to both versions, but other parts are specific to either one or the other, and variables record the status of our current position in scanning and transcribing the problem message. +@d ANY_USE_OF_PROBLEM 1 +@d FIRST_USE_OF_PROBLEM 2 +@d SUBSEQUENT_USE_OF_PROBLEM 3 + = -int shorten_problem_message; /* give short form of this previously-seen problem */ -int reading_text_specific_to_short_version; /* modes during problem message writing */ -int reading_text_specific_to_long_version; +int this_is_a_subsequent_use_of_problem; /* give short form of this previously-seen problem */ +int scanning_problem_for = ANY_USE_OF_PROBLEM; @ We do not want to keep wittering on with the same old explanations, so we remember which ones we've given before (i.e., in previous problem @@ -263,9 +255,8 @@ char *explanations[PATIENCE_EXHAUSTION_POINT]; int no_explanations = 0; int Problems::explained_before(char *explanation) { - int i; if (no_explanations == PATIENCE_EXHAUSTION_POINT) return TRUE; - for (i=0; i++>"); - shorten_problem_message = FALSE; + this_is_a_subsequent_use_of_problem = FALSE; } else if (strcmp(message, "****") == 0) { WRITE_TO(PBUFF, ">++++>"); - shorten_problem_message = FALSE; + this_is_a_subsequent_use_of_problem = FALSE; } else if (strcmp(message, "***") == 0) { WRITE_TO(PBUFF, ">+++>"); - shorten_problem_message = FALSE; + this_is_a_subsequent_use_of_problem = FALSE; } else if (strcmp(message, "**") == 0) { - shorten_problem_message = FALSE; + this_is_a_subsequent_use_of_problem = FALSE; } else { if (T) Problems::show_problem_location(T); problem_count++; WRITE_TO(PBUFF, ">--> "); - shorten_problem_message = Problems::explained_before(message); + this_is_a_subsequent_use_of_problem = + Problems::explained_before(message); } - reading_text_specific_to_short_version = FALSE; - reading_text_specific_to_long_version = FALSE; + scanning_problem_for = ANY_USE_OF_PROBLEM; } void Problems::issue_problem_end(void) { - #ifdef CORE_MODULE - if (compiling_text_routines_mode) Strings::TextSubstitutions::append_text_substitution_proviso(); + #ifdef ENDING_MESSAGE_PROBLEMS_CALLBACK + ENDING_MESSAGE_PROBLEMS_CALLBACK(); #endif - Problems::Buffer::output_problem_buffer(1); - Problems::Issue::problem_documentation_links(problems_file); - if (crash_on_all_problems) Problems::Fatal::force_crash(); + ProblemBuffer::output_problem_buffer(1); + Problems::problem_documentation_links(problems_file); + if (crash_on_all_problems) ProblemSigils::force_crash(); +} + +@ Documentation links: + += +void Problems::problem_documentation_links(OUTPUT_STREAM) { + if (Str::len(sigil_of_latest_unlinked_problem) == 0) return; + #ifdef DOCUMENTATION_REFERENCE_PROBLEMS_CALLBACK + DOCUMENTATION_REFERENCE_PROBLEMS_CALLBACK(OUT, sigil_of_latest_unlinked_problem); + #endif + Str::clear(sigil_of_latest_unlinked_problem); +} + +text_stream *Problems::latest_sigil(void) { + return sigil_of_latest_problem; } @h Appending source. @@ -324,47 +329,29 @@ void Problems::append_source(wording W) { } void Problems::transcribe_appended_source(void) { if (Wordings::nonempty(appended_source)) - Problems::Buffer::copy_source_reference_into_problem_buffer(appended_source); + ProblemBuffer::copy_source_reference(appended_source); } @h Issuing a segment of a problem message. -Here is the routine which performs the substitution of quotations into -problem messages and sends them on their way: which is called -|Problems::issue_problem_segment| since it only appends a further piece of text, and may -be used several times to build up complicated messages. - -We have seen that, within problem message texts, the escapes |%1| to |%9| -are to produce quotations. Four further escape codes switch between problem -message versions, as follows: we have |%L|, which indicates that the text -which follows should only be used in the long form of the error message; -|%S|, the same for the short form; |%%|, which cancels either of these -settings and restores the text to appearing in both forms, which is the -default. A percentage sign followed by a vertical stroke acts more simply -as a divider between the brief message and the explanation text in many -simple problem messages which do not use the elaborations of the other -three escapes. +This function performs the substitution of quotations into problem messages and +sends them on their way: which is called //Problems::issue_problem_segment// +since it only appends a further piece of text, and may be used several times +to build up complicated messages. = void Problems::issue_problem_segment(char *message) { for (int i=0; message[i]; i++) { if (message[i] == '%') { switch (message[i+1]) { - case 'L': reading_text_specific_to_long_version = TRUE; i++; continue; - case 'S': reading_text_specific_to_short_version = TRUE; i++; continue; - case '%': reading_text_specific_to_short_version = FALSE; - reading_text_specific_to_long_version = FALSE; i++; continue; - case '|': reading_text_specific_to_short_version = FALSE; - reading_text_specific_to_long_version = TRUE; - if (shorten_problem_message) WRITE_TO(PBUFF, "."); - i++; continue; + case 'A': scanning_problem_for = ANY_USE_OF_PROBLEM; i++; continue; + case 'L': scanning_problem_for = FIRST_USE_OF_PROBLEM; i++; continue; + case 'S': scanning_problem_for = SUBSEQUENT_USE_OF_PROBLEM; i++; continue; } } - - if ((reading_text_specific_to_short_version) && - (shorten_problem_message == FALSE)) continue; - if ((reading_text_specific_to_long_version) && - (shorten_problem_message == TRUE)) continue; - + if ((scanning_problem_for == SUBSEQUENT_USE_OF_PROBLEM) && + (this_is_a_subsequent_use_of_problem == FALSE)) continue; + if ((scanning_problem_for == FIRST_USE_OF_PROBLEM) && + (this_is_a_subsequent_use_of_problem == TRUE)) continue; @; } } @@ -379,8 +366,8 @@ on when the shortened form is the one being issued). @ = if (message[i] == '%') { switch (message[i+1]) { - case 'P': PUT_TO(PBUFF, FORCE_NEW_PARA_CHAR); - i++; continue; + case 'P': PUT_TO(PBUFF, FORCE_NEW_PARA_CHAR); i++; continue; + case '%': PUT_TO(PBUFF, '%'); i++; continue; } if (Characters::isdigit(message[i+1])) { int t = ((int) (message[i+1]))-((int) '0'); i++; @@ -401,10 +388,10 @@ its type, stored internally as a single character. @ = switch(problem_quotations[t].quotation_type) { /* Monochrome wording */ - case 'S': Problems::Buffer::copy_source_reference_into_problem_buffer( + case 'S': ProblemBuffer::copy_source_reference( problem_quotations[t].text_quoted); break; - case 'W': Problems::Buffer::copy_text_into_problem_buffer( + case 'W': ProblemBuffer::copy_text( problem_quotations[t].text_quoted); break; @@ -462,26 +449,21 @@ void Problems::issue_problem_segment_from_stream(text_stream *message) { WRITE_TO(PBUFF, "%S", message); } -@h Problems report and index. -That gives us enough infrastructure to produce the final report. Note the use -of error redirection to in order to put pseudo-problem messages -- actually -informational -- into the report. In the case where the run was successful and -there we no Problem messages, we have to be careful to reset |problem_count| --- it will have been increased by the issuing of these pseudo-problems, and we -need it to remain 0 so that |main()| can finally return back to the operating -system without an error code. +@h Fatalities. = -int tail_of_report_written = FALSE; -void Problems::write_reports(int disaster_struck) { - if (tail_of_report_written) return; - tail_of_report_written = TRUE; - - crash_on_all_problems = FALSE; - #ifdef PROBLEMS_FINAL_REPORTER - int pc = problem_count; - PROBLEMS_FINAL_REPORTER(disaster_struck, problem_count); - problem_count = pc; - #endif - HTML::end_body(problems_file); +void Problems::fatal(char *message) { + WRITE_TO(STDERR, message); + WRITE_TO(STDERR, "\n"); + STREAM_FLUSH(STDERR); + if (crash_on_all_problems) ProblemSigils::force_crash(); + ProblemSigils::exit(2); +} + +void Problems::fatal_on_file(char *message, filename *F) { + WRITE_TO(STDERR, message); + WRITE_TO(STDERR, "\nOffending filename: <%f>\n", F); + STREAM_FLUSH(STDERR); + if (crash_on_all_problems) ProblemSigils::force_crash(); + ProblemSigils::exit(2); } diff --git a/services/problems-module/Chapter 2/Problems, Level 3.w b/services/problems-module/Chapter 2/Problems, Level 3.w index 1539bc693..912e33e1f 100644 --- a/services/problems-module/Chapter 2/Problems, Level 3.w +++ b/services/problems-module/Chapter 2/Problems, Level 3.w @@ -1,4 +1,4 @@ -[Problems::Issue::] Problems, Level 3. +[StandardProblems::] Problems, Level 3. Here we provide some convenient semi-standardised problem messages, which also serve as examples of how to use the Level 2 problem message @@ -9,7 +9,7 @@ occur, whatever the provocation: if they do, they are symptoms of a bug. = int internal_error_thrown = FALSE; -int Problems::Issue::internal_errors_have_occurred(void) { +int StandardProblems::internal_errors_have_occurred(void) { return internal_error_thrown; } @@ -17,12 +17,19 @@ int Problems::Issue::internal_errors_have_occurred(void) { in order that they can supply the current filename and line number automatically to the actual internal error functions. The result is, for instance, += (text as ConsoleText) +>--> Problem. An internal error has occurred: Unknown verb code. The current + sentence is "A room is a kind"; the error was detected at line 133 of + "Chapter 5/Traverse for Objects.w". This should never happen, and I am + now halting in abject failure. += ->> Problem. An internal error has occurred: Unknown verb code. The current sentence is "A room is a kind"; the error was detected at line 133 of "Chapter 5/Traverse for Objects.w". This should never happen, and I am now halting in abject failure. - -@d internal_error_tree_unsafe(X) Problems::Issue::internal_error_tu_fn(NULL, X, __FILE__, __LINE__) -@d internal_error_if_node_type_wrong(T, X, Y) Problems::Issue::nodal_check(T, X, Y, __FILE__, __LINE__) -@d internal_error_on_node_type(X) Problems::Issue::internal_error_on_node_type_fn(NULL, X, __FILE__, __LINE__) +@d internal_error_tree_unsafe(X) + StandardProblems::internal_error_tu_fn(NULL, X, __FILE__, __LINE__) +@d internal_error_if_node_type_wrong(T, X, Y) + StandardProblems::nodal_check(T, X, Y, __FILE__, __LINE__) +@d internal_error_on_node_type(X) + StandardProblems::internal_error_on_node_type_fn(NULL, X, __FILE__, __LINE__) @ Internal errors are generated much like any other problem message, except that we use a variant form of the "end" routine which salvages what it can @@ -31,11 +38,11 @@ visible in a debugger) or simply exits to the operating system with error code 1: = -void Problems::Issue::internal_error_end(void) { +void StandardProblems::internal_error_end(void) { Problems::issue_problem_end(); - Problems::write_reports(TRUE); - if (debugger_mode) Problems::Fatal::force_crash(); - Problems::Fatal::exit(1); + ProblemBuffer::write_reports(TRUE); + if (debugger_mode) ProblemSigils::force_crash(); + ProblemSigils::exit(1); } @ And now for the functions which the above macros invoke. There are two @@ -46,10 +53,11 @@ that the internal error occurred during parse tree construction, so we need to be cautious. = -void Problems::Issue::internal_error_fn(void *T, char *p, char *filename, int linenum) { +void StandardProblems::internal_error_fn(void *T, char *p, + char *filename, int linenum) { internal_error_thrown = TRUE; if (current_sentence == NULL) { - Problems::Issue::internal_error_tu_fn(T, p, filename, linenum); + StandardProblems::internal_error_tu_fn(T, p, filename, linenum); return; } Problems::quote_source(1, current_sentence); @@ -61,10 +69,15 @@ void Problems::Issue::internal_error_fn(void *T, char *p, char *filename, int li "An internal error has occurred: %2. The current sentence is %1; the " "error was detected at line %4 of \"%3\". This should never happen, " "and I am now halting in abject failure."); - Problems::Issue::internal_error_end(); + StandardProblems::internal_error_end(); } -void Problems::Issue::internal_error_tu_fn(void *T, char *p, char *filename, int linenum) { +@ This second sort of internal error comes in two sub-versions, one using +a |char *|, one a |text_stream *|. + += +void StandardProblems::internal_error_tu_fn(void *T, char *p, + char *filename, int linenum) { internal_error_thrown = TRUE; Problems::quote_text(1, p); Problems::quote_text(2, filename); @@ -74,10 +87,11 @@ void Problems::Issue::internal_error_tu_fn(void *T, char *p, char *filename, int "An internal error has occurred: %1. The error was detected at " "line %3 of \"%2\". This should never happen, and I am now halting " "in abject failure."); - Problems::Issue::internal_error_end(); + StandardProblems::internal_error_end(); } -void Problems::Issue::internal_error_tu_fn_S(void *T, text_stream *p, char *filename, int linenum) { +void StandardProblems::internal_error_tu_fn_S(void *T, text_stream *p, + char *filename, int linenum) { internal_error_thrown = TRUE; Problems::quote_stream(1, p); Problems::quote_text(2, filename); @@ -87,7 +101,7 @@ void Problems::Issue::internal_error_tu_fn_S(void *T, text_stream *p, char *file "An internal error has occurred: %1. The error was detected at " "line %3 of \"%2\". This should never happen, and I am now halting " "in abject failure."); - Problems::Issue::internal_error_end(); + StandardProblems::internal_error_end(); } @h Nodal errors. @@ -98,34 +112,37 @@ failure of such an invariant produces a form of internal error called a "nodal error". = -void Problems::Issue::nodal_error_fn(parse_node_tree *T, parse_node *pn, char *p, char *filename, int linenum) { +void StandardProblems::nodal_error_fn(parse_node_tree *T, parse_node *pn, char *p, + char *filename, int linenum) { LOG("Internal nodal error at:\n"); LOG("$T\n", pn); - Problems::Issue::internal_error_fn(T, p, filename, linenum); + StandardProblems::internal_error_fn(T, p, filename, linenum); } -void Problems::Issue::nodal_error_fn_S(parse_node_tree *T, parse_node *pn, text_stream *p, char *filename, int linenum) { +void StandardProblems::nodal_error_fn_S(parse_node_tree *T, parse_node *pn, + text_stream *p, char *filename, int linenum) { LOG("Internal nodal error at:\n"); LOG("$T\n", pn); - Problems::Issue::internal_error_tu_fn_S(T, p, filename, linenum); + StandardProblems::internal_error_tu_fn_S(T, p, filename, linenum); } @ Here is a convenient function to check said invariant. = -void Problems::Issue::nodal_check(parse_node_tree *T, parse_node *pn, node_type_t node_type_required, char *filename, int linenum) { +void StandardProblems::nodal_check(parse_node_tree *T, parse_node *pn, + node_type_t node_type_required, char *filename, int linenum) { if (pn == NULL) { TEMPORARY_TEXT(internal_message); WRITE_TO(internal_message, "NULL node found where type %S expected", NodeType::get_name(node_type_required)); - Problems::Issue::internal_error_tu_fn_S(T, internal_message, filename, linenum); + StandardProblems::internal_error_tu_fn_S(T, internal_message, filename, linenum); DISCARD_TEXT(internal_message); } else if (Node::get_type(pn) != node_type_required) { TEMPORARY_TEXT(internal_message); WRITE_TO(internal_message, "Node of type %S found where type %S expected", NodeType::get_name(Node::get_type(pn)), NodeType::get_name(node_type_required)); - Problems::Issue::nodal_error_fn_S(T, pn, internal_message, filename, linenum); + StandardProblems::nodal_error_fn_S(T, pn, internal_message, filename, linenum); DISCARD_TEXT(internal_message); } } @@ -135,14 +152,15 @@ act on various selections of node types, and those use the |internal_error_on_no macro, which invokes the following: = -void Problems::Issue::internal_error_on_node_type_fn(parse_node_tree *T, +void StandardProblems::internal_error_on_node_type_fn(parse_node_tree *T, parse_node *pn, char *filename, int linenum) { TEMPORARY_TEXT(internal_message); if (pn == NULL) - Problems::Issue::internal_error_tu_fn(T, "Unexpected NULL node found", filename, linenum); + StandardProblems::internal_error_tu_fn(T, "Unexpected NULL node found", + filename, linenum); WRITE_TO(internal_message, "Unexpectedly found node of type %S", NodeType::get_name(Node::get_type(pn))); - Problems::Issue::nodal_error_fn_S(T, pn, internal_message, filename, linenum); + StandardProblems::nodal_error_fn_S(T, pn, internal_message, filename, linenum); DISCARD_TEXT(internal_message); } @@ -152,52 +170,23 @@ tree which represents a proposition. = parse_node *latest_s_subtree = NULL; -void Problems::Issue::s_subtree_error_set_position(parse_node_tree *T, parse_node *p) { +void StandardProblems::s_subtree_error_set_position(parse_node_tree *T, parse_node *p) { latest_s_subtree = p; } -void Problems::Issue::s_subtree_error(parse_node_tree *T, char *mess) { +void StandardProblems::s_subtree_error(parse_node_tree *T, char *mess) { TEMPORARY_TEXT(internal_message); WRITE_TO(internal_message, "S-subtree error: %s", mess); LOG("%S", internal_message); if (latest_s_subtree) LOG("Applied to the subtree:\n$T", latest_s_subtree); - Problems::Issue::internal_error_tu_fn_S(T, internal_message, __FILE__, __LINE__); + StandardProblems::internal_error_tu_fn_S(T, internal_message, __FILE__, __LINE__); DISCARD_TEXT(internal_message); } -void Problems::Issue::problem_documentation_links(OUTPUT_STREAM) { - if (Str::len(sigil_of_latest_unlinked_problem) == 0) return; - #ifdef DOCUMENTATION_REFERENCES_PRESENT - wchar_t *chap = NULL, *sec = NULL; - wchar_t *leaf = Index::DocReferences::link_if_possible_once(sigil_of_latest_unlinked_problem, &chap, &sec); - if (leaf) { - HTML::open_indented_p(OUT, 2, "tight"); - HTML_OPEN_WITH("a", "href=inform:/%w.html", leaf); - HTML_TAG_WITH("img", "border=0 src=inform:/doc_images/help.png"); - HTML_CLOSE("a"); - WRITE(" "); - if ((chap) && (sec)) { - WRITE("See the manual: %w > %w", chap, sec); - } else { - WRITE("See the manual."); - } - HTML_CLOSE("p"); - if (telemetry_recording) { - WRITE_TO(telmy, "See the manual: %w > %w\n\n", chap, sec); - } - } - #endif - Str::clear(sigil_of_latest_unlinked_problem); -} - -text_stream *Problems::Issue::latest_sigil(void) { - return sigil_of_latest_problem; -} - @h Handmade problems. Those made without using the convenient shorthand forms below: = -void Problems::Issue::handmade_problem(parse_node_tree *T, SIGIL_ARGUMENTS) { +void StandardProblems::handmade_problem(parse_node_tree *T, SIGIL_ARGUMENTS) { ACT_ON_SIGIL Problems::issue_problem_begin(T, ""); } @@ -207,7 +196,8 @@ Running out of memory, irretrievably: the politest kind of fatal error, though let's face it, fatal is fatal. = -void Problems::Issue::limit_problem(parse_node_tree *T, SIGIL_ARGUMENTS, char *what_has_run_out, int how_many) { +void StandardProblems::limit_problem(parse_node_tree *T, SIGIL_ARGUMENTS, + char *what_has_run_out, int how_many) { ACT_ON_SIGIL Problems::quote_text(1, what_has_run_out); Problems::quote_number(2, &how_many); @@ -218,11 +208,12 @@ void Problems::Issue::limit_problem(parse_node_tree *T, SIGIL_ARGUMENTS, char *w "there is no getting around it. You will need to rewrite your source " "text so that it needs fewer %1."); Problems::issue_problem_end(); - Problems::write_reports(FALSE); - Problems::Fatal::exit(1); + ProblemBuffer::write_reports(FALSE); + ProblemSigils::exit(1); } -void Problems::Issue::memory_allocation_problem(parse_node_tree *T, SIGIL_ARGUMENTS, char *what_has_run_out) { +void StandardProblems::memory_allocation_problem(parse_node_tree *T, SIGIL_ARGUMENTS, + char *what_has_run_out) { ACT_ON_SIGIL Problems::quote_text(1, what_has_run_out); Problems::issue_problem_begin(T, ""); @@ -233,8 +224,8 @@ void Problems::Issue::memory_allocation_problem(parse_node_tree *T, SIGIL_ARGUME "symptom that the device isn't powerful enough to run me. (See how " "I pass the blame?)"); Problems::issue_problem_end(); - Problems::write_reports(FALSE); - Problems::Fatal::exit(1); + ProblemBuffer::write_reports(FALSE); + ProblemSigils::exit(1); } @h Problem messages unlocated in the source text. @@ -242,7 +233,8 @@ And now the regular problem messages, the ones which are not my fault. We begin with lexical problems happening when the run is hardly begun: = -void Problems::Issue::lexical_problem(parse_node_tree *T, SIGIL_ARGUMENTS, char *message, wchar_t *concerning, char *exp) { +void StandardProblems::lexical_problem(parse_node_tree *T, SIGIL_ARGUMENTS, + char *message, wchar_t *concerning, char *exp) { ACT_ON_SIGIL char *lexical_explanation = "This is a low-level problem happening when I am still reading in the " @@ -255,11 +247,12 @@ void Problems::Issue::lexical_problem(parse_node_tree *T, SIGIL_ARGUMENTS, char else Problems::quote_text(2, ""); Problems::quote_text(3, lexical_explanation); Problems::issue_problem_begin(T, lexical_explanation); - Problems::issue_problem_segment("%1: %2%L.%%%| %3"); + Problems::issue_problem_segment("%1: %2.%L %3"); Problems::issue_problem_end(); } -void Problems::Issue::lexical_problem_S(parse_node_tree *T, SIGIL_ARGUMENTS, char *message, text_stream *concerning, char *exp) { +void StandardProblems::lexical_problem_S(parse_node_tree *T, SIGIL_ARGUMENTS, + char *message, text_stream *concerning, char *exp) { ACT_ON_SIGIL char *lexical_explanation = "This is a low-level problem happening when I am still reading in the " @@ -272,7 +265,7 @@ void Problems::Issue::lexical_problem_S(parse_node_tree *T, SIGIL_ARGUMENTS, cha else Problems::quote_text(2, ""); Problems::quote_text(3, lexical_explanation); Problems::issue_problem_begin(T, lexical_explanation); - Problems::issue_problem_segment("%1: %2%L.%%%| %3"); + Problems::issue_problem_segment("%1: %2.%L %3"); Problems::issue_problem_end(); } @@ -280,7 +273,8 @@ void Problems::Issue::lexical_problem_S(parse_node_tree *T, SIGIL_ARGUMENTS, cha other problems can't either, so: = -void Problems::Issue::unlocated_problem(parse_node_tree *T, SIGIL_ARGUMENTS, char *message) { +void StandardProblems::unlocated_problem(parse_node_tree *T, SIGIL_ARGUMENTS, + char *message) { ACT_ON_SIGIL do_not_locate_problems = TRUE; Problems::issue_problem_begin(T, message); @@ -289,7 +283,8 @@ void Problems::Issue::unlocated_problem(parse_node_tree *T, SIGIL_ARGUMENTS, cha do_not_locate_problems = FALSE; } -void Problems::Issue::unlocated_problem_on_file(parse_node_tree *T, SIGIL_ARGUMENTS, char *message, filename *F) { +void StandardProblems::unlocated_problem_on_file(parse_node_tree *T, SIGIL_ARGUMENTS, + char *message, filename *F) { ACT_ON_SIGIL do_not_locate_problems = TRUE; TEMPORARY_TEXT(fn); @@ -309,20 +304,21 @@ that isn't surprising, since it simply quotes the entire sentence at fault (which is always the current sentence) and issues a message. = -void Problems::Issue::sentence_problem(parse_node_tree *T, SIGIL_ARGUMENTS, char *message, char *explanation) { +void StandardProblems::sentence_problem(parse_node_tree *T, SIGIL_ARGUMENTS, + char *message, char *explanation) { ACT_ON_SIGIL Problems::quote_source(1, current_sentence); Problems::quote_text(2, message); Problems::quote_text(3, explanation); Problems::issue_problem_begin(T, explanation); - Problems::issue_problem_segment("You wrote %1: %Sagain, %%%Lbut %%%2%|, %3"); + Problems::issue_problem_segment("You wrote %1: %Sagain, %2.%Lbut %2, %3"); Problems::issue_problem_end(); } @ And a variant which adds a note in a subsequent paragraph. = -void Problems::Issue::sentence_problem_with_note(parse_node_tree *T, SIGIL_ARGUMENTS, +void StandardProblems::sentence_problem_with_note(parse_node_tree *T, SIGIL_ARGUMENTS, char *message, char *explanation, char *note) { ACT_ON_SIGIL Problems::quote_source(1, current_sentence); @@ -330,7 +326,7 @@ void Problems::Issue::sentence_problem_with_note(parse_node_tree *T, SIGIL_ARGUM Problems::quote_text(3, explanation); Problems::quote_text(4, note); Problems::issue_problem_begin(T, explanation); - Problems::issue_problem_segment("You wrote %1: %Sagain, %%%Lbut %%%2%|, %3 %P%4"); + Problems::issue_problem_segment("You wrote %1: %Sagain, %2.%Lbut %2, %3 %P%4"); Problems::issue_problem_end(); } @@ -338,7 +334,7 @@ void Problems::Issue::sentence_problem_with_note(parse_node_tree *T, SIGIL_ARGUM which is part of the current sentence. = -void Problems::Issue::sentence_in_detail_problem(parse_node_tree *T, SIGIL_ARGUMENTS, +void StandardProblems::sentence_in_detail_problem(parse_node_tree *T, SIGIL_ARGUMENTS, wording W, char *message, char *explanation) { ACT_ON_SIGIL Problems::quote_source(1, current_sentence); @@ -347,7 +343,7 @@ void Problems::Issue::sentence_in_detail_problem(parse_node_tree *T, SIGIL_ARGUM Problems::quote_wording(4, W); Problems::issue_problem_begin(T, explanation); Problems::issue_problem_segment( - "You wrote %1, and in particular '%4': %Sagain, %%%Lbut %%%2%|, %3"); + "You wrote %1, and in particular '%4': %Sagain, %2.%Lbut %2, %3"); Problems::issue_problem_end(); } @@ -355,106 +351,34 @@ void Problems::Issue::sentence_in_detail_problem(parse_node_tree *T, SIGIL_ARGUM therefore is kept here: = -void Problems::Issue::negative_sentence_problem(parse_node_tree *T, SIGIL_ARGUMENTS) { - Problems::Issue::sentence_problem(T, PASS_SIGIL, +void StandardProblems::negative_sentence_problem(parse_node_tree *T, SIGIL_ARGUMENTS) { + StandardProblems::sentence_problem(T, PASS_SIGIL, "assertions about the initial state of play must be positive, not negative", "so 'The cat is an animal' is fine but not 'The cat is not a container'. " "I have only very feeble powers of deduction - sometimes the implications " "of a negative statement are obvious to a human reader, but not to me."); } -@ This is a much more elaborate form of the standard |Problems::Issue::sentence_problem|, -used when an assertion sentence has gone wrong. Experience from the early -builds of the Public Beta showed that many people tried syntaxes which -Inform did not recognise, and which cause Inform to misread the primary -verb of the sentence. It would then issue a Problem -- because the sentence -would be peculiar -- but this problem report would itself be odd, and -make little sense to the user. So we look to see if the current sentence -is an assertion with a primary verb: and if it is, we hunt through it -for alternative verbs which might have been intended, and try to produce -a message which diagnoses the problem rather better. - -= -#ifdef LINGUISTICS_MODULE -void Problems::Issue::assertion_problem(parse_node_tree *T, SIGIL_ARGUMENTS, char *message, char *explanation) { - wording RTW = EMPTY_WORDING; /* "rather than" text */ - ACT_ON_SIGIL - if ((current_sentence == NULL) || (current_sentence->down == NULL) || - (Node::get_type(current_sentence->down) != VERB_NT)) { - LOG("(Assertion error reverting to sentence error.)\n"); - Problems::Issue::sentence_problem(T, PASS_SIGIL, message, explanation); - return; - } - - LOG("(Assertion error: looking for alternative verbs in <%W>.)\n", - Node::get_text(current_sentence)); - wording AW = Wordings::trim_both_ends(Node::get_text(current_sentence)); - LOOP_THROUGH_WORDING(i, AW) - if ((i != Wordings::first_wn(Node::get_text(current_sentence->down))) && - (Word::unexpectedly_upper_case(i) == FALSE)) { - int j = (Wordings::from(Node::get_text(current_sentence), i)); - if (j > 0) RTW = Wordings::new(i, j); - } - Problems::quote_source(1, current_sentence); - Problems::quote_text(2, message); - Problems::quote_text(3, explanation); - Problems::issue_problem_begin(T, explanation); - Problems::issue_problem_segment("You wrote %1: %Sagain, %%%Lbut %%%2%|, %3"); - if (Wordings::nonempty(RTW)) { - Problems::quote_wording(4, Node::get_text(current_sentence->down)); - Problems::quote_wording(5, RTW); - Problems::issue_problem_segment( /* see also PM_AmbiguousVerb */ - " %P(It may help to know that I am reading the primary verb here " - "as '%4', not '%5'.)"); - } - Problems::Issue::diagnose_further(); - Problems::issue_problem_end(); -} - -void Problems::Issue::diagnose_further(void) { - if (current_sentence == NULL) return; - if (Wordings::empty(Node::get_text(current_sentence))) return; - int sqc = 0; - LOOP_THROUGH_WORDING(i, Node::get_text(current_sentence)) sqc += Word::singly_quoted(i); - if (sqc >= 2) - Problems::issue_problem_segment( - " %P(I notice what look like single quotation marks in this " - "sentence. If you meant to write some quoted text, it needs to " - "be in double quotes, \"like this\" and not 'like this'.)"); - - control_structure_phrase *csp = - ControlStructures::detect(Node::get_text(current_sentence)); - if (csp) - Problems::issue_problem_segment( - " %P(The way this sentence starts makes me think it might have been " - "intended as part of a rule rather than being a statement about the " - "the way things are at the beginning of play. For example, 'If the " - "player is in the Penalty Zone, say \"An alarm sounds.\" is not " - "allowed: it has to be put in the form of a rule showing Inform " - "what circumstances apply - for example 'Every turn: if the player is " - "in the Penalty Zone, say \"An alarm sounds.\")"); -} -#endif - @h Definition problems. Sentence problems are a nuisance for "Definition:" definitions, because those usually occur when the current sentence is rather unhelpfully just the word "Definition" alone. So we use this routine instead: = -void Problems::Issue::definition_problem(parse_node_tree *T, SIGIL_ARGUMENTS, parse_node *q, - char *message, char *explanation) { +void StandardProblems::definition_problem(parse_node_tree *T, SIGIL_ARGUMENTS, + parse_node *q, char *message, char *explanation) { ACT_ON_SIGIL Problems::quote_source(1, q); Problems::quote_text(2, message); Problems::quote_text(3, explanation); Problems::issue_problem_begin(T, explanation); - Problems::issue_problem_segment("You gave as a definition %1: %Sagain, %%%Lbut %%%2%|, %3"); + Problems::issue_problem_segment( + "You gave as a definition %1: %Sagain, %2.%Lbut %2, %3"); Problems::issue_problem_end(); } -void Problems::Issue::adjective_problem(parse_node_tree *T, SIGIL_ARGUMENTS, wording IX, wording D, - char *message, char *explanation) { +void StandardProblems::adjective_problem(parse_node_tree *T, SIGIL_ARGUMENTS, + wording IX, wording D, char *message, char *explanation) { ACT_ON_SIGIL Problems::quote_wording(1, IX); Problems::quote_wording(2, D); @@ -462,8 +386,9 @@ void Problems::Issue::adjective_problem(parse_node_tree *T, SIGIL_ARGUMENTS, wor Problems::quote_text(4, explanation); Problems::quote_source(5, current_sentence); Problems::issue_problem_begin(T, explanation); - Problems::issue_problem_segment("In %5 you defined an adjective by '%1' intending that " - "it would apply to '%2': %Sagain, %%%Lbut %%%3%|, %4"); + Problems::issue_problem_segment( + "In %5 you defined an adjective by '%1' intending that " + "it would apply to '%2': %Sagain, %3.%Lbut %3, %4"); Problems::issue_problem_end(); } @@ -472,13 +397,13 @@ We are at last able to print the text which appears at the top of the Problems report; and this completes the code for errors. In my end is my beginning. = -void Problems::Issue::start_problems_report(filename *F) { - #ifdef PROBLEMS_INITIAL_REPORTER - PROBLEMS_INITIAL_REPORTER(F); +void StandardProblems::start_problems_report(filename *F) { + #ifdef START_PROBLEM_FILE_PROBLEMS_CALLBACK + START_PROBLEM_FILE_PROBLEMS_CALLBACK(F, problems_file); #endif } -void Problems::Issue::issue_problems_banner(OUTPUT_STREAM, char *verdict) { +void StandardProblems::issue_problems_banner(OUTPUT_STREAM, char *verdict) { HTML::comment(OUT, I"BANNER BEGINS"); HTML_OPEN_WITH("table", "cellspacing=\"3\" border=\"0\" width=\"100%%\""); HTML_OPEN_WITH("tr", "id=\"surround0\""); diff --git a/services/problems-module/Preliminaries/How To Include This Module.w b/services/problems-module/Preliminaries/How To Include This Module.w index e0fcf6cde..8127d329d 100644 --- a/services/problems-module/Preliminaries/How To Include This Module.w +++ b/services/problems-module/Preliminaries/How To Include This Module.w @@ -26,4 +26,48 @@ Import: somepath/problems |ProblemsModule::end()| just before it shuts down. (But just after, and just before, the corresponding calls to //foundation//.) +@h Using callbacks. +Shared modules like this one are tweaked in behaviour by defining "callback +functions". This means that the parent might provide a function of its own +which would answer a question put to it by the module, or take some action +on behalf of the module: it's a callback in the sense that the parent is +normally calling the module, but then the module calls the parent back to +ask for data or action. +The problems module has only a few callbacks, and they are all optional. The +following alphabetical list has references to fuller explanations: + +@ |DESCRIBE_SOURCE_FILE_PROBLEMS_CALLBACK| can change the description of a +file used in problem messages; Inform uses this to say "the source text" or +"Standard Rules" rather than citing filenames. See //ProblemBuffer::copy_source_reference//. + +@ |DOCUMENTATION_REFERENCE_PROBLEMS_CALLBACK| is invited to add a clickable +link to in-app documentation; if no callback function is provided, no +such links appear. See //Problems::problem_documentation_links//. + +@ |ENDING_MESSAGE_PROBLEMS_CALLBACK| is called just before a problem message +is about to end, and can be used to append some extra wording. See +//Problems::issue_problem_end//. + +@ |FIRST_PROBLEMS_CALLBACK| is called before the first problem in a run is +issued, and takes as an argument the |text_stream *| to which problems are +being written. See //Problems::show_problem_location//. + +@ |GLOSS_EXTENSION_SOURCE_FILE_PROBLEMS_CALLBACK| is called to add a note +like "in the extension Locksmith by Emily Short"; see //Problems::show_problem_location//. + +@ |INFORMATIONAL_ADDENDA_PROBLEMS_CALLBACK| is called just before a problems +report closes, to give it a chance to add informational messages. (//core// +uses this mechanism to append text such as "There were 3 rooms and 27 things.") +Such addenda are not problems, and do not affect the program's exit code. +See //ProblemBuffer::write_reports//. + +@ |START_PROBLEM_FILE_PROBLEMS_CALLBACK| is called when //problems// wants +to open some kind of file for problem messages, with two arguments: the +filename |F| and the stream |P| to open to it. If the callback function wants +this to come to anything, it must perform the file-open, and write any header +material it would like. See //StandardProblems::start_problems_report//. + +@ |WORDING_FOR_HEADING_NODE_PROBLEMS_CALLBACK| is called to ask what wording +should be used to describe a heading in problem messages. See +//Problems::show_problem_location//. diff --git a/services/problems-module/Preliminaries/What This Module Does.w b/services/problems-module/Preliminaries/What This Module Does.w index 8ec78dca7..dfc8cbfbf 100644 --- a/services/problems-module/Preliminaries/What This Module Does.w +++ b/services/problems-module/Preliminaries/What This Module Does.w @@ -45,21 +45,145 @@ conventions on test case naming: in particular, the suffix |-G| means "for the Glulx virtual machine only", and similarly for |-Z|. @ In general problems are a bad thing, of course, but a call to -//Problems::Fatal::require// tells //problems// that the parent tool positively +//ProblemSigils::require// tells //problems// that the parent tool positively wants to issue a given problem message. This is useful when testing Inform on bad source text to check that it reports the badness as we hope. -The parent can also configure //problems// by calling //Problems::Fatal::echo_sigils// -or //Problems::Fatal::crash_on_problems//. +The parent can also configure //problems// by calling //ProblemSigils::echo_sigils// +or //ProblemSigils::crash_on_problems//. -@h Fatal errors. -These are problems which cause an immediate exit of the program as soon as -they are issued, and are typically used for filing-system disasters or -failed assertions (so-called "internal errors"). +@h The story of a non-fatal problem message. +Suppose that the //core// module wants to issue a problem message: what +happens? + +This depends on how complicated it is. The //problems// system has three +levels: +(3) //Problems, Level 3// contains functions for problem messages which have +a commonly-needed shape to them: for example, //StandardProblems::sentence_problem//. +The functions in question call down to... +(2) //Problems, Level 2//, which contains functions to accept "quotations" and +a problem message with placeholders in to hold those quotations; after which, +they call down to... +(1) //Problems, Level 1//, where the text of a message is stored in the +"problem buffer" and eventually printed or written to a file. + +Most of the problems issued by Inform look like this: += (text as InC) + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadDesk), + "Inform does not support standing desks", + "and needs your laptop to be lower than your ribcage at all times."); += +The sigil for this (hypothetical) problem message is |PM_BadDesk|, and note the +use of the |_p_| macro to refer to it: see //Problems, Level 0// for more. The +first piece of text is always produced, and the second added only on the first +occurrence. //core// doesn't need to do anything more than make this one +function call to Level 3, and //problems// does everything else. + +But a significant number of problems are less standard in shape and are +called "handmade", meaning that //core// has to call some Level 2 functions. +For example: += (text as InC) + Problems::quote_source(1, current_sentence); + Problems::quote_wording(2, W); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ScottishPlay)); + Problems::issue_problem_segment( + "In the sentence %1, it looks as if '%2' might be a reference to a " + "theatrical work connected with Scotland."); + Problems::issue_problem_end(); += +What happens, in sequence, is that we +(a) Establish what material should go into the placeholders |%1| and |%2|, +(b) Call //StandardProblems::handmade_problem// to begin work, +(c) Call //Problems::issue_problem_segment// a number of times -- though often +just once -- to put some text into the problem, and +(d) Call //Problems::issue_problem_end// to signal that we are done. + +@ As this demonstrates, problem messages are expanded from prototypes using +a |printf|-like formatting system. Unlike |printf|, though, where |%s| means +a string and |%d| a number, here the escape codes do not indicate the type of +the data: they are simply |%1|, |%2|, |%3|, ..., |%9|. This is to prevent +horrendous crashes when type mismatches occur: using a pointer to a phrase +when trying to print a source code reference, for instance. + +The placeholders do not need to be used contiguously -- if you want to use +just |%4| and |%7|, feel free. + +Four further escape codes switch between problem message versions, as follows: +(*) |%L| means "long form", the version used the first time this message is +generated, +(*) |%S| means "short form", for subsequent times, +(*) |%A| means "both long and short", which is the situation at the start, + +Note that the form is reset to |%A| when a new problem message begins, but not +in between calls to //Problems::issue_problem_segment//: i.e., if one segment +leaves things in |%L|, the next segment, if there is one, resumes that way. + +For example, |"You wrote %1: %Sagain, %2.%Lbut %2, %3"| is the message +text used by //StandardProblems::sentence_problem//. += (text) + "You wrote %1: %Sagain, %2.%Lbut %2, %3" + on first use --> "You wrote %1: but %2, %3" + subsequently --> "You wrote %1: again, %2." += +Here the punctuation; |%3| is expected to end with a full stop and |%2| not to. + +Finally, the escape |%P| means "poragraph break here", and is used for adding +subsequent clarifications to long or complicated problems. + +@ //Problems, Level 3// contains functions for standardly-shaped problems, then. +A significant amount of this section also deals with internal errors, that is, +failed assertions; while //foundation// provides the basic system for handling +those -- i.e., print and then exit the program -- //core// redirects all +internal errors to //StandardProblems::internal_error_fn//, which ensures that +they pass through our problems machinery here, and are thus properly recorded +in the HTML problems report in the Inform app (if that's what the user is +using). + +@ //Problems, Level 2// contains functions for making quotations to fill the +placeholders with content -- see //problem_quotation//. + +The mechanism for determining whether an explanation has been given before is +//Problems::explained_before//. The obvious thing would be to go by the sigils +of previously issued messages, but it actually uses the textual token supplied +on the call to //Problems::issue_problem_begin//, which allows for some +variations -- Level 3 functions are able to use this to ensure that particular +kinds of message are always, or are never, explained. + +As Level 2 generates problem text, it calls down into //ProblemBuffer::output_problem_buffer// +at Level 1. + +Just a few functions at Level 2 issue fatal errors -- that is, problems which +cause an immediate exit of the program as soon as they are issued, and are +typically used for filing-system disasters or failed assertions (so-called +"internal errors"). Facilities for these are very limited: -(*) //Problems::Fatal::issue// for a simple message with fixed wording. -(*) //Problems::Fatal::filename_related// for a message relating to a file. +(*) //Problems::fatal// for a simple message with fixed wording. +(*) //Problems::fatal_on_file// for a message relating to a file. + +These routines have to be written with care because a file-system disaster +might mean that the problems file itself cannot be written to. + +@ //Problems, Level 1// is concerned with the "problem buffer" |PBUFF|. +This is a text used to hold the problem message as it is assembled from pieces, +and only Level 2 functions should print to it. Even they should call down to +two Level 1 functions when they want to write something other than straightforward +text: +(*) Source text from the lexer can be quoted into it with //ProblemBuffer::copy_text//, +which automatically trims excessive quotes for length. +(*) References to positions in the source text can be inserted with +//ProblemBuffer::copy_source_reference//: there is a sort of protocol for how +this is done, with use of the magic |SOURCE_REF_CHAR| which will be +intercepted later on when the problems file is written out as HTML (see +//foundation: HTML// for details). + +@ When a portion of text has been buffered which Level 2 wants to get shot of, +it calls down to //ProblemBuffer::output_problem_buffer// to send this to a +file. By default, the text is actually sent three ways: to the standard +console output, to the debugging log (if there is one), and to the telemetry +file (if there is one). But this can be diverted with +//ProblemBuffer::redirect_problem_stream//, telling it to send problem text +just one way. @h Telemetry. The //Telemetry// system isn't really to do with problems, except that it diff --git a/services/problems-test/Chapter 1/Unit Tests.w b/services/problems-test/Chapter 1/Unit Tests.w index ddf0a4359..73f399919 100644 --- a/services/problems-test/Chapter 1/Unit Tests.w +++ b/services/problems-test/Chapter 1/Unit Tests.w @@ -31,7 +31,7 @@ any text but then fail. @ = Problems::quote_wording(1, W); - Problems::Issue::handmade_problem(syntax_tree, _p_(PM_UnexpectedFruit)); + StandardProblems::handmade_problem(syntax_tree, _p_(PM_UnexpectedFruit)); Problems::issue_problem_segment( "The sentence '%1' contained an unexpected fruit item, and now supper " "will be ruined.");