diff --git a/wpiformat/wpiformat/includeorder.py b/wpiformat/wpiformat/includeorder.py index 4f2af6b..5d93728 100644 --- a/wpiformat/wpiformat/includeorder.py +++ b/wpiformat/wpiformat/includeorder.py @@ -262,10 +262,10 @@ def header_sort(self, config_file, lines_list, file_name, start, end, ifdef_leve i = start while i < end: - if "#ifdef" in lines_list[i]: + if "#ifdef" in lines_list[i] or "#ifndef" in lines_list[i]: ifdef_count = 1 for j in range(i + 1, end): - if "#ifdef" in lines_list[j]: + if "#ifdef" in lines_list[j] or "#ifndef" in lines_list[j]: ifdef_count += 1 elif "#endif" in lines_list[j]: ifdef_count -= 1 @@ -419,7 +419,9 @@ def run_pipeline(self, config_file, name, lines): # Write lines from beginning of file to headers i = 0 while i < len(lines_list) and ( - "#ifdef" not in lines_list[i] and "#include" not in lines_list[i] + "#ifdef" not in lines_list[i] + and "#ifndef" not in lines_list[i] + and "#include" not in lines_list[i] ): i += 1 output_list = lines_list[0:i] diff --git a/wpiformat/wpiformat/test/test_includeorder.py b/wpiformat/wpiformat/test/test_includeorder.py index 19290be..9567d0f 100644 --- a/wpiformat/wpiformat/test/test_includeorder.py +++ b/wpiformat/wpiformat/test/test_includeorder.py @@ -949,4 +949,83 @@ def test_includeorder(): ) test.add_latest_input_as_output(True) + # Ensure #ifndef is handled properly + test.add_input( + "./Test.h", + "#ifndef __APPLE__" + + os.linesep + + "#include " + + os.linesep + + "#elif !defined(_WIN32)" + + os.linesep + + "#include " + + os.linesep + + "#endif" + + os.linesep, + ) + test.add_latest_input_as_output(True) + + # Ensure #ifndef is handled properly + test.add_input( + "./Test.h", + "#ifndef _WIN32" + + os.linesep + + "#include " + + os.linesep + + "#endif" + + os.linesep, + ) + test.add_latest_input_as_output(True) + + # Ensure include guards are handled properly + test.add_input( + "./Test.h", + "#ifndef CSCORE_CONFIGURABLESOURCEIMPL_H_" + + os.linesep + + "#define CSCORE_CONFIGURABLESOURCEIMPL_H_" + + os.linesep + + os.linesep + + "#include " + + os.linesep + + "#include " + + os.linesep + + "#include " + + os.linesep + + "#include " + + os.linesep + + "#include " + + os.linesep + + "#include " + + os.linesep + + os.linesep + + "#include " + + os.linesep + + os.linesep + + '#include "SourceImpl.h"' + + os.linesep + + os.linesep + + "namespace cs {" + + os.linesep + + os.linesep + + "class ConfigurableSourceImpl : public SourceImpl {" + + os.linesep + + " protected:" + + os.linesep + + " ConfigurableSourceImpl(std::string_view name, wpi::Logger& logger," + + os.linesep + + " Notifier& notifier, Telemetry& telemetry," + + os.linesep + + " const VideoMode& mode);" + + os.linesep + + "};" + + os.linesep + + os.linesep + + "} // namespace cs" + + os.linesep + + os.linesep + + "#endif // CSCORE_CONFIGURABLESOURCEIMPL_H_" + + os.linesep, + ) + test.add_latest_input_as_output(True) + test.run(OutputType.FILE)