@@ -41,7 +41,11 @@ import type { ModeledMethod } from "./modeled-method";
4141import type { ExtensionPack } from "./shared/extension-pack" ;
4242import type { ModelConfigListener } from "../config" ;
4343import { Mode } from "./shared/mode" ;
44- import { loadModeledMethods , saveModeledMethods } from "./modeled-method-fs" ;
44+ import {
45+ GENERATED_MODELS_SUFFIX ,
46+ loadModeledMethods ,
47+ saveModeledMethods ,
48+ } from "./modeled-method-fs" ;
4549import { pickExtensionPack } from "./extension-pack-picker" ;
4650import type { QueryLanguage } from "../common/query-language" ;
4751import { getLanguageDisplayName } from "../common/query-language" ;
@@ -60,6 +64,10 @@ import { parseAccessPathSuggestionRowsToOptions } from "./suggestions-bqrs";
6064import { ModelEvaluator } from "./model-evaluator" ;
6165import type { ModelEvaluationRunState } from "./shared/model-evaluation-run-state" ;
6266import type { VariantAnalysisManager } from "../variant-analysis/variant-analysis-manager" ;
67+ import type { ModelExtensionFile } from "./model-extension-file" ;
68+ import { modelExtensionFileToYaml } from "./yaml" ;
69+ import { outputFile } from "fs-extra" ;
70+ import { join } from "path" ;
6371
6472export class ModelEditorView extends AbstractWebview <
6573 ToModelEditorMessage ,
@@ -264,6 +272,7 @@ export class ModelEditorView extends AbstractWebview<
264272 modeledMethods ,
265273 mode ,
266274 this . cliServer ,
275+ this . modelConfig ,
267276 this . app . logger ,
268277 ) ;
269278
@@ -483,6 +492,7 @@ export class ModelEditorView extends AbstractWebview<
483492 this . extensionPack ,
484493 this . language ,
485494 this . cliServer ,
495+ this . modelConfig ,
486496 this . app . logger ,
487497 ) ;
488498 this . modelingStore . setModeledMethods ( this . databaseItem , modeledMethods ) ;
@@ -648,14 +658,18 @@ export class ModelEditorView extends AbstractWebview<
648658 await runGenerateQueries ( {
649659 queryConstraints : modelGeneration . queryConstraints ( mode ) ,
650660 filterQueries : modelGeneration . filterQueries ,
651- parseResults : ( queryPath , results ) =>
652- modelGeneration . parseResults (
661+ onResults : async ( queryPath , results ) => {
662+ const modeledMethods = modelGeneration . parseResults (
653663 queryPath ,
654664 results ,
655665 modelsAsDataLanguage ,
656666 this . app . logger ,
657- ) ,
658- onResults : async ( modeledMethods ) => {
667+ {
668+ mode,
669+ config : this . modelConfig ,
670+ } ,
671+ ) ;
672+
659673 this . addModeledMethodsFromArray ( modeledMethods ) ;
660674 } ,
661675 cliServer : this . cliServer ,
@@ -681,15 +695,17 @@ export class ModelEditorView extends AbstractWebview<
681695
682696 protected async generateModeledMethodsOnStartup ( ) : Promise < void > {
683697 const mode = this . modelingStore . getMode ( this . databaseItem ) ;
684- if ( mode !== Mode . Framework ) {
698+ const modelsAsDataLanguage = getModelsAsDataLanguage ( this . language ) ;
699+ const autoModelGeneration = modelsAsDataLanguage . autoModelGeneration ;
700+
701+ if ( autoModelGeneration === undefined ) {
685702 return ;
686703 }
687704
688- const modelsAsDataLanguage = getModelsAsDataLanguage ( this . language ) ;
689- const modelGeneration = modelsAsDataLanguage . modelGeneration ;
690- const autoRun = modelGeneration ?. autoRun ;
691-
692- if ( modelGeneration === undefined || autoRun === undefined ) {
705+ if (
706+ autoModelGeneration . enabled &&
707+ ! autoModelGeneration . enabled ( { mode, config : this . modelConfig } )
708+ ) {
693709 return ;
694710 }
695711
@@ -701,22 +717,23 @@ export class ModelEditorView extends AbstractWebview<
701717 message : "Generating models" ,
702718 } ) ;
703719
704- const parseResults =
705- autoRun . parseResults ?? modelGeneration . parseResults ;
720+ const extensionFile : ModelExtensionFile = {
721+ extensions : [ ] ,
722+ } ;
706723
707724 try {
708725 await runGenerateQueries ( {
709- queryConstraints : modelGeneration . queryConstraints ( mode ) ,
710- filterQueries : modelGeneration . filterQueries ,
711- parseResults : ( queryPath , results ) =>
712- parseResults (
726+ queryConstraints : autoModelGeneration . queryConstraints ( mode ) ,
727+ filterQueries : autoModelGeneration . filterQueries ,
728+ onResults : ( queryPath , results ) => {
729+ const extensions = autoModelGeneration . parseResultsToYaml (
713730 queryPath ,
714731 results ,
715732 modelsAsDataLanguage ,
716733 this . app . logger ,
717- ) ,
718- onResults : async ( modeledMethods ) => {
719- this . addModeledMethodsFromArray ( modeledMethods ) ;
734+ ) ;
735+
736+ extensionFile . extensions . push ( ... extensions ) ;
720737 } ,
721738 cliServer : this . cliServer ,
722739 queryRunner : this . queryRunner ,
@@ -733,7 +750,25 @@ export class ModelEditorView extends AbstractWebview<
733750 asError ( e ) ,
734751 ) `Failed to auto-run generating models: ${ getErrorMessage ( e ) } ` ,
735752 ) ;
753+ return ;
736754 }
755+
756+ progress ( {
757+ step : 4000 ,
758+ maxStep : 4000 ,
759+ message : "Saving generated models" ,
760+ } ) ;
761+
762+ const fileContents = `# This file was automatically generated from ${ this . databaseItem . name } . Manual changes will not persist.\n\n${ modelExtensionFileToYaml ( extensionFile ) } ` ;
763+ const filePath = join (
764+ this . extensionPack . path ,
765+ "models" ,
766+ `${ this . language } ${ GENERATED_MODELS_SUFFIX } ` ,
767+ ) ;
768+
769+ await outputFile ( filePath , fileContents ) ;
770+
771+ void this . app . logger . log ( `Saved generated model file to ${ filePath } ` ) ;
737772 } ,
738773 {
739774 cancellable : false ,
0 commit comments