英語版
このページの英語版を見る

dmd.funcsem

関数の意味解析を行う。

仕様 関数

Authors:

ソースfuncsem.d

適用範囲 https://codecov.io/gh/dlang/dmd/src/master/src/dmd/funcsem.d

void funcDeclarationSemantic(Scope* sc, FuncDeclaration funcdecl);
関数の主な意味論ルーチン。
bool functionSemantic(FuncDeclaration fd);
関数シグネチャの前方参照を解決する - パラメータ型、戻り値の型、属性。
Parameters:
FuncDeclaration fd 関数宣言
Returns: シグネチャにエラーがある場合は false を返す。
シグネチャにエラーがある場合は false を返す。
bool functionSemantic3(FuncDeclaration fd);
関数本体の前方参照を解決する。 本体にエラーが存在する場合は false を返す。
void declareThis(FuncDeclaration fd, Scope* sc);
この関数宣言の隠しパラメータを作成し、返す。
隠しパラメータには、クラス、構造体、ネストされた関数のthis パラメータ、 Objective-Cメソッドのセレクタパラメータが含まれる。
bool checkForwardRef(FuncDeclaration fd, const ref Loc loc);
この関数型が適切に解決されていることを確認する。 解決されていない場合は、「前方参照エラー」を報告し、trueを返す。
int findVtblIndex(FuncDeclaration fd, Dsymbol[] vtbl);
この関数が上書きするvtbl[0..length]内の関数のインデックスを 見つける。 共変よりも厳密な一致を優先する。
Parameters:
FuncDeclaration fd 関数
Dsymbol[] vtbl 使用するvtable
Returns:
-1 該当なし -2 前方参照があるため判断できない
BaseClass* overrideInterface(FuncDeclaration fd);
関数がベースクラスの関数である場合、 そのベースクラスを返す。
Parameters:
FuncDeclaration fd 関数
Returns:
ベースクラスをオーバーライドする場合はそのクラスを返し、オーバーライドしない場合はnullを返す
enum FuncResolveFlag: ubyte;
フラグが使用される resolveFuncCall
standard
エラーメッセージを表示する、コールを解決する。
quiet
一致しない場合はエラーメッセージを出さず、null を返す。
overloadOnly
オーバーロードのみを解決する。すなわち、あいまいな一致に対してはエラーを発行せず
ufcs
一致した場合にエラーを発行せず、明示的なthisが必要
UFCS呼び出しを解決しようとしている
FuncDeclaration resolveFuncCall(const ref Loc loc, Scope* sc, Dsymbol s, Objects* tiargs, Type tthis, ArgumentList argumentList, FuncResolveFlag flags);
FuncDeclarationまたは関数テンプレートである可能性があるシンボルが与えられた場合、 それを関数シンボルとして解決する。
Parameters:
Loc loc インスタンス化の場所
Scope* sc インスタンス化スコープ
Dsymbol s シンボルをインスタンス化する
Objects* tiargs テンプレート引数の初期リスト
Type tthis NULLでない場合、this 引数の型
ArgumentList argumentList 関数への引数
FuncResolveFlag flags 参照 FuncResolveFlag
Returns:
一致が見つかれば関数シンボル、そうでなければnull
Expression addInvariant(AggregateDeclaration ad, VarDeclaration vthis);
不変を呼び出すための式を生成する。

入力 ad 集合で不変式 vthis 'this' 変数

Returns: 不変条件を呼び出すvoid式
不変式を呼び出す式
FuncDeclaration overloadExactMatch(FuncDeclaration thisfd, Type t);
tに正確に一致するオーバーロードリスト内の関数を見つける。
FuncDeclaration overloadModMatch(FuncDeclaration thisfd, const ref Loc loc, Type tthis, ref bool hasOverloads);
'this'修飾子に一致するオーバーロードリストの関数を見つける。 結果の型は4つある。
  1. tthis"が1つの候補のみに一致する場合、それは「完全一致」である。 関数を返し、'hasOverloads'はfalseに設定される。 例: 'tthis"が変更可能で、変更可能なメソッドが1つだけ存在する場合。
  2. 一致する候補が2つ以上あるが、候補となる関数は "より良い一致"となる。 より良い一致となる関数が返されるが、'hasOverloads'はtrueに設定される。 例:'tthis'が変更可能であり、変更可能メソッドとconstメソッドの両方がある場合、 変更可能メソッドがより良い一致となる。
  3. 一致する候補が複数あるが、より良い一致する候補がない場合、 nullを返し、"hasOverloads"をtrueに設定して「あいまいな一致」を表す。 例えば、'tthis'が変更可能で、変更可能なメソッドが複数ある場合。
  4. 候補がなければ「一致なし」となり、エラー報告とともにnullが返される。 例えば、'tthis'がconstであるがconstメソッドが存在しない場合など。
int getLevelAndCheck(FuncDeclaration fd, const ref Loc loc, Scope* sc, FuncDeclaration target, Declaration decl);
()()レベルの違いを判断する fdネストされた関数かどうかを判断する target。 呼び出しができない場合はエラーを返す fd呼び出せない target
Parameters:
FuncDeclaration fd 関数
Loc loc エラーメッセージの表示先
Scope* sc コンテキスト
FuncDeclaration target 呼び出し先
Declaration decl このチェックを実行したDeclaration 。 より適切なエラーメッセージのみを提供するために使用される。
Returns: 0 同じレベル
0 同じレベル

0 ネストの数を減らす -1 ネストの数を1増やす (targetfd' にネストされている LevelError エラー

bool canInferAttributes(FuncDeclaration fd, Scope* sc);
この関数の属性が関数本体の調査から推測できるかどうかを判断する。
Returns: できる場合は true
できる場合は true
bool checkNestedReference(FuncDeclaration fd, Scope* sc, const ref Loc loc);
現在の関数では、'this'関数を呼び出している。
  1. 現在の関数が「this」関数を呼び出せるかどうかを確認し、呼び出せない場合はエラーを発行する。
  2. 現在の関数が「this」関数の親でない場合は、 「this」関数の兄弟のリストに現在の関数を追加する。
  3. 現在の関数がリテラルであり、上位スコープにアクセスしている場合は、 それをデリゲートとしてマークする。
エラーが発生した場合は true を返す。
void buildResultVar(FuncDeclaration fd, Scope* sc, Type tret);
結果変数を遅延して宣言する。
Statement mergeFrequire(FuncDeclaration fd, Statement sf, Expressions* params);
この関数がオーバーライドするすべての関数の「in」契約をマージする。 「in」はORで結合される。つまり、そのうちの1つだけが合格すればよい。
Statement mergeFrequireInclusivePreview(FuncDeclaration fd, Statement sf, Expressions* params);
この関数に、オーバーライドするすべての「in」契約をマージする。
void buildEnsureRequire(FuncDeclaration thisfd);
契約を文として書き換える。
Statement mergeFensure(FuncDeclaration fd, Statement sf, Identifier oid, Expressions* params);
この関数に、オーバーライドするすべての「out」契約をマージする。 「out」はANDで結合される。つまり、すべてが通過する必要がある。
void modifyReturns(FuncLiteralDeclaration fld, Scope* sc, Type tret);
return文のすべての式型をtretに変更する。
関数リテラルでは、意味論が完了した後のFuncExp::implicitCastToで、コンテキストの型に基づいて戻り値の型を変更できる。
関数() dg = (){ return new B(); } // OK if is(B : A) == true
BからAへの変換が共変で、オフセット調整が必要な場合、 すべてのreturn文を型Aの戻り値式に調整する必要がある。
bool isRootTraitsCompilesScope(Scope* sc);
関数リテラル呼び出しでトレイト(コンパイル)が使用される場合、 関数の本体が属性に違反していないか考慮する必要があるが、 外部関数の属性推論に影響を与えてはならない。 関数リテラルの属性は依然として推論する必要があるため、 トレイトのコンパイルが導入するスコープをチェックする方法が必要となる。
Parameters:
Scope* sc スコープをチェックする必要がある。
Returns: 提供されたスコープがtraitのコンパイルするスコープのリストのルートである場合
true 提供されたスコープが トレイトのコンパイルするスコープのリストのルートである場合、
bool setUnsafe(Scope* sc, bool gag = false, Loc loc = Loc.init, const(char)* fmt = null, RootObject arg0 = null, RootObject arg1 = null, RootObject arg2 = null);
このスコープ内の文または式は@safe ではないため、 それを囲む関数を@systemとしてマークする。
Parameters:
Scope* sc その安全でない文/式が含まれるスコープを
bool gag エラーメッセージを抑制する(escape.dで使用される)
Loc loc エラーの発生場所
const(char)* fmt printf 形式のフォーマット文字列
RootObject arg0 (オプション)最初の %s フォーマット指定子用の引数
RootObject arg1 (オプション) 2番目の %s フォーマット指定子用の引数
RootObject arg2 (オプション)3番目の %s フォーマット指定子用の引数
Returns:
安全なエラーがあるかどうか
bool setUnsafePreview(Scope* sc, FeatureState fs, bool gag, Loc loc, const(char)* msg, RootObject arg0 = null, RootObject arg1 = null, RootObject arg2 = null);
setUnsafe のように、ただしプレビュースイッチの背後にある安全エラー
与えられた FeatureState fs、例えば dip1000 / dip25 / systemVariables の場合、 設定内容によって挙動が変化する。
  • -revert=fs、何も行われません。
  • の場合、 -preview=fs、それはsetUnsafe
  • デフォルトでは、@safe 関数で非推奨の警告を表示するか、推測された関数で属性違反を記録する。
Parameters:
Scope* sc 影響を受ける関数/変数を見つけ、非推奨/推測スコープの機能状態にあるかどうかを確認するために使用する
FeatureState fs プレビューフラグから
bool gag エラーメッセージを抑制する
Loc loc エラーの位置
const(char)* msg printf 形式のフォーマット文字列
RootObject arg0 (オプション) 最初の %s フォーマット指定子用の引数
RootObject arg1 (オプション) 2番目の %s フォーマット指定子に対する引数
RootObject arg2 (オプション)3番目の %s フォーマット指定子用の引数
Returns:
安全なエラー(非推奨化ではない)が実際に発生したかどうか