abi_specific_integer_invalid 진단: AbiSpecificInteger를 상속한 클래스 규칙
abi_specific_integer_invalid 진단: AbiSpecificInteger를 상속한 클래스 규칙
Dart 분석기가 만들어 내는 abi_specific_integer_invalid 진단에 대한 설명이에요.
본문
AbiSpecificInteger를 상속하는 클래스는 반드시 정확히 하나의 const 생성자만 가져야 하고, 다른 멤버는 없어야 하며, 타입 파라미터도 없어야 해요.
설명
분석기는 AbiSpecificInteger를 상속하는 클래스가 다음 요구 사항을 모두 충족하지 않을 때 이 진단을 만들어요.
- 정확히 하나의 생성자가 있어야 함
- 그 생성자가
const로 표시되어야 함 - 그 하나의 생성자 외에 다른 멤버가 없어야 함
- 타입 파라미터가 없어야 함
예시
다음 코드는 클래스 C가 const 생성자를 정의하지 않기 때문에 이 진단을 만들어요.
import 'dart:ffi';
@AbiSpecificIntegerMapping({Abi.macosX64: Int8()})
final class C extends AbiSpecificInteger {}
다음 코드는 생성자가 const 생성자가 아니기 때문에 이 진단을 만들어요.
import 'dart:ffi';
@AbiSpecificIntegerMapping({Abi.macosX64: Int8()})
final class C extends AbiSpecificInteger {
C();
}
다음 코드는 클래스 C가 여러 개의 생성자를 정의하기 때문에 이 진단을 만들어요.
import 'dart:ffi';
@AbiSpecificIntegerMapping({Abi.macosX64: Int8()})
final class C extends AbiSpecificInteger {
const C.zero();
const C.one();
}
다음 코드는 클래스 C가 필드를 정의하기 때문에 이 진단을 만들어요.
import 'dart:ffi';
@AbiSpecificIntegerMapping({Abi.macosX64: Int8()})
final class C extends AbiSpecificInteger {
final int i;
const C(this.i);
}
다음 코드는 클래스 C가 타입 파라미터를 가지기 때문에 이 진단을 만들어요.
import 'dart:ffi';
@AbiSpecificIntegerMapping({Abi.macosX64: Int8()})
// type parameters
final class C extends AbiSpecificInteger {
const C();
}
흔한 해결 방법
타입 파라미터가 없고, const 생성자 하나만 멤버로 가지는 요구 사항을 충족하도록 클래스를 변경해요.
import 'dart:ffi';
@AbiSpecificIntegerMapping({Abi.macosX64: Int8()})
final class C extends AbiSpecificInteger {
const C();
}