public Analyzer(FileInfo aSettingFile , CodeFileCallBack aOnAnalyzerStartFunc , CodeFileCallBack aOnCalcIncludeCountStartFunc ) { // 初期化 settingFile = aSettingFile; onAnalyzerStartFunc = aOnAnalyzerStartFunc; onCalcIncludeCountStartFunc = aOnCalcIncludeCountStartFunc; // 設定の読み込み try { loadSetting(aSettingFile); } catch (Exception aExp) { throw aExp; } // 強制インクルードファイル foreach (FileInfo fileInfo in forceIncludeFiles) { addCodeFileIfNeccesary(fileInfo); } // ソースファイルの追加 foreach (DirectoryInfo dirInfo in targetDirs) { addCodeFiles(dirInfo); } // 除外フラグの設定 foreach (FileInfo fileInfo in ignoreCodeFiles) { if (!codeFiles.IsExistCodeFile(fileInfo)) {// 存在しない continue; } setIgnoreFragRecursive(codeFiles.GetCodeFile(fileInfo)); } // インクルードカウントの計算 foreach (CodeFile sourceFile in codeFiles.GetCodeFiles()) { onCalcIncludeCountStartFunc(sourceFile.fileInfo); CodeFileTable guardTable = new CodeFileTable(); sourceFile.includeCount = calculateTotalIncludeCount(sourceFile, guardTable); // 強制インクルードファイル foreach (FileInfo fileInfo in forceIncludeFiles) { sourceFile.includeCount += calculateTotalIncludeCountRev(codeFiles.GetCodeFile(fileInfo), guardTable); } if (sourceFile.IsSource()) {// 補正 --sourceFile.includeCount; } } }
// calculateTotalIncludeCountとは逆の方向で計算。 private uint calculateTotalIncludeCountRev(CodeFile aCodeFile, CodeFileTable aGuardTable) { if (aGuardTable.IsExistCodeFile(aCodeFile.fileInfo)) {// 既に計算済み return(0); } aGuardTable.AddCodeFileRef(aCodeFile); uint cnt = 0; if (aCodeFile.IsSource()) {// ソースファイルを数に含める ++cnt; } foreach (CodeFile subCodeFile in aCodeFile.includeCodeFiles.GetCodeFiles()) { cnt += calculateTotalIncludeCountRev(subCodeFile, aGuardTable); } return(cnt); }