This commit applies `strictNullChecks` to the entire codebase to improve maintainability and type safety. Key changes include: - Remove some explicit null-checks where unnecessary. - Add necessary null-checks. - Refactor static factory functions for a more functional approach. - Improve some test names and contexts for better debugging. - Add unit tests for any additional logic introduced. - Refactor `createPositionFromRegexFullMatch` to its own function as the logic is reused. - Prefer `find` prefix on functions that may return `undefined` and `get` prefix for those that always return a value.
28 lines
990 B
TypeScript
28 lines
990 B
TypeScript
import { ScriptingLanguage } from '@/domain/ScriptingLanguage';
|
|
import { assertInRange } from '@/application/Common/Enum';
|
|
import { IScriptingLanguageFactory } from './IScriptingLanguageFactory';
|
|
|
|
type Getter<T> = () => T;
|
|
|
|
export abstract class ScriptingLanguageFactory<T> implements IScriptingLanguageFactory<T> {
|
|
private readonly getters = new Map<ScriptingLanguage, Getter<T>>();
|
|
|
|
public create(language: ScriptingLanguage): T {
|
|
assertInRange(language, ScriptingLanguage);
|
|
const getter = this.getters.get(language);
|
|
if (!getter) {
|
|
throw new RangeError(`unknown language: "${ScriptingLanguage[language]}"`);
|
|
}
|
|
const instance = getter();
|
|
return instance;
|
|
}
|
|
|
|
protected registerGetter(language: ScriptingLanguage, getter: Getter<T>) {
|
|
assertInRange(language, ScriptingLanguage);
|
|
if (this.getters.has(language)) {
|
|
throw new Error(`${ScriptingLanguage[language]} is already registered`);
|
|
}
|
|
this.getters.set(language, getter);
|
|
}
|
|
}
|