diff --git a/CHANGELOG.md b/CHANGELOG.md index f3e2a19..cba41e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ # Change Log -All notable changes to the "flutter-plus" extension will be documented in this file. \ No newline at end of file +All notable changes to the "flutter-plus" extension will be documented in this file. + +## 0.7.1 +- **ADDED**: Error object and StackTrace to generated state's diff --git a/package-lock.json b/package-lock.json index d809294..76ce914 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "flutter-plus", - "version": "0.6.1", + "version": "0.7.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "flutter-plus", - "version": "0.6.1", + "version": "0.7.1", "license": "SEE LICENSE IN LICENSE", "devDependencies": { "@types/mocha": "^10.0.7", diff --git a/package.json b/package.json index e903b9e..71fe71c 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "displayName": "Flutter Plus", "description": "Extension with various improvements for Flutter", "icon": "assets/logo.png", - "version": "0.7.0", + "version": "0.7.1", "pricing": "Free", "engines": { "vscode": "^1.92.0" diff --git a/src/commands/sealed-states.command.ts b/src/commands/sealed-states.command.ts index b7dfd93..be9ac22 100644 --- a/src/commands/sealed-states.command.ts +++ b/src/commands/sealed-states.command.ts @@ -141,6 +141,8 @@ export const sealedStates = async (uri: Uri) => { { label: "Generate property getters", picked: true, id: 'propertyGetters' }, { label: "Generate type alias", picked: true, id: 'typeAlias' }, { label: "Generate equality operator (==)", picked: true, id: 'equalityOperator' }, + { label: "Add error object", picked: false, id: 'error' }, + { label: "Add stackTrace", picked: false, id: 'stackTrace' }, ]; const selectedOptions = await vscode.window.showQuickPick(options, { @@ -155,6 +157,8 @@ export const sealedStates = async (uri: Uri) => { let propertyGettersOption = selectedOptions.find(option => option.id === 'propertyGetters') !== undefined; let typeAliasOption = selectedOptions.find(option => option.id === 'typeAlias') !== undefined; let initialStateOption = selectedOptions.find(option => option.id === 'initialState') !== undefined; + let errorOption = selectedOptions.find(option => option.id === 'error') !== undefined; + let stackTraceOption = selectedOptions.find(option => option.id === 'stackTrace') !== undefined; const dataType = nullableDataOption ? '\${1}Entity?' : '\${1}Entity'; @@ -174,7 +178,7 @@ export const sealedStates = async (uri: Uri) => { // Constructor codeBuilder.push(` /// {@macro \${2}}`); - codeBuilder.push(` const \${1}({required super.data, required super.message});`); + codeBuilder.push(` const \${1}({required super.data, required super.message${errorOption ? ', super.error' : ''}${stackTraceOption ? ', super.stackTrace' : ''}});`); // Generate the factory constructors for each state Object.values(stateFormats).forEach(({ pascalCase, camelCase }) => { @@ -188,6 +192,12 @@ export const sealedStates = async (uri: Uri) => { codeBuilder.push(` required ${dataType} data,`); } codeBuilder.push(` String message,`); + if (errorOption) { + codeBuilder.push(` Object? error,`); + } + if (stackTraceOption) { + codeBuilder.push(` StackTrace? stackTrace,`); + } codeBuilder.push(` }) = \${1}\\$${pascalCase};`); }); @@ -203,6 +213,12 @@ export const sealedStates = async (uri: Uri) => { codeBuilder.push(` required ${dataType} data,`); } codeBuilder.push(` String? message,`); + if (errorOption) { + codeBuilder.push(` Object? error,`); + } + if (stackTraceOption) { + codeBuilder.push(` StackTrace? stackTrace,`); + } codeBuilder.push(` }) =>`); if (Object.values(stateFormats).find(({ camelCase }) => camelCase === 'idle')) { codeBuilder.push(` \${1}\\$Idle(`); @@ -211,6 +227,12 @@ export const sealedStates = async (uri: Uri) => { } codeBuilder.push(` data: data,`); codeBuilder.push(` message: message ?? 'Initial',`); + if (errorOption) { + codeBuilder.push(` error: error,`); + } + if (stackTraceOption) { + codeBuilder.push(` stackTrace: stackTrace,`); + } codeBuilder.push(` );`); } @@ -223,10 +245,11 @@ export const sealedStates = async (uri: Uri) => { codeBuilder.push(`final class \${1}\\$${pascalCase} extends \${1} {`); if (nullableDataOption) { - codeBuilder.push(` const \${1}\\$${pascalCase}({super.data, super.message = '${pascalCase}'});`); + codeBuilder.push(` const \${1}\\$${pascalCase}({super.data, super.message = '${pascalCase}'${errorOption ? ', super.error' : ''}${stackTraceOption ? ', super.stackTrace' : ''}`); } else { - codeBuilder.push(` const \${1}\\$${pascalCase}({required super.data, super.message = '${pascalCase}'});`); + codeBuilder.push(` const \${1}\\$${pascalCase}({required super.data, super.message = '${pascalCase}'${errorOption ? ', super.error' : ''}${stackTraceOption ? ', super.stackTrace' : ''}`); } + codeBuilder.push(`});`); if (typeAliasOption) { codeBuilder.push(''); @@ -248,7 +271,8 @@ export const sealedStates = async (uri: Uri) => { codeBuilder.push(''); codeBuilder.push('@immutable'); codeBuilder.push(`abstract base class _\\$\${1}Base {`); - codeBuilder.push(` const _\\$\${1}Base({required this.data, required this.message});`); + codeBuilder.push(` const _\\$\${1}Base({required this.data, required this.message${errorOption ? ', this.error' : ''}${stackTraceOption ? ', this.stackTrace' : ''}`); + codeBuilder.push(`});`); // Type alias if (typeAliasOption) { @@ -269,6 +293,22 @@ export const sealedStates = async (uri: Uri) => { codeBuilder.push(` @nonVirtual`); codeBuilder.push(` final String message;`); + // Error object + if (errorOption) { + codeBuilder.push(''); + codeBuilder.push(` /// Error object.`); + codeBuilder.push(` @nonVirtual`); + codeBuilder.push(` final Object? error;`); + } + + // Stack trace object + if (stackTraceOption) { + codeBuilder.push(''); + codeBuilder.push(` /// Stack trace object.`); + codeBuilder.push(` @nonVirtual`); + codeBuilder.push(` final StackTrace? stackTrace;`); + } + // Check existence of data if (nullableDataOption) { codeBuilder.push('');