Files
odfstudio/codemaker/source/rustmaker/cpp_include_manager.cxx
T
Michael Weghorn 8b513dcebb rustmaker: Make loplugin:simplifyconstruct happy
Fix this clang plugin error seen in an
--enable-rust-uno build:

    .../libreoffice/codemaker/source/rustmaker/cpp_include_manager.cxx:138:17: error: simplify construction, just use 'Foo a(...);' [loplugin:simplifyconstruct]
      138 |     std::string targetTypeStr = std::string(targetType);
          |     ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    1 error generated.

Change-Id: Idf5e672e65e4029686a6c2cd4ca5b9dde7de3e72
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/190849
Tested-by: Jenkins
Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>
2025-09-12 13:56:51 +02:00

175 lines
5.7 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#include "cpp_include_manager.hxx"
#include "rustfile.hxx"
#include <filesystem>
#include <algorithm>
#include <sal/log.hxx>
CppIncludeManager::CppIncludeManager(const TypeAnalyzer::TypeInfo& typeInfo)
: m_typeInfo(typeInfo)
{
}
void CppIncludeManager::dumpIncludes(CppFile& file, std::string_view interfaceName)
{
// Write file header comment
file.beginLine()
.append("// Auto-generated C++ bridge functions for ")
.append(interfaceName)
.endLine()
.beginLine()
.append("// Generated by rustmaker with dynamic includes")
.endLine()
.endLine();
// Write pragma once directive to prevent multiple inclusions (only for header files)
if (file.getExtension() == ".hxx")
{
file.beginLine().append("#pragma once").endLine().endLine();
}
// Write standard includes
writeStandardIncludes(file);
// Write UNO-specific includes based on type analysis
writeUnoIncludes(file);
// Write interface-specific includes
writeInterfaceIncludes(file, interfaceName);
file.endLine();
}
void CppIncludeManager::dumpNamespaces(CppFile& file)
{
// Generate specific namespace using declarations for only what we need
for (const auto& ns : m_typeInfo.namespaces)
{
file.beginLine().append("using namespace ").append(ns).append(";").endLine();
}
file.endLine();
}
void CppIncludeManager::writeStandardIncludes(CppFile& file)
{
// Always needed for UNO operations
if (m_typeInfo.needsUnoInterface)
{
file.beginLine().append("#include <com/sun/star/uno/XInterface.hpp>").endLine();
file.beginLine().append("#include <com/sun/star/uno/Reference.hxx>").endLine();
file.beginLine().append("#include <com/sun/star/uno/Exception.hpp>").endLine();
file.beginLine().append("#include <sal/log.hxx>").endLine(); // For SAL_WARN macro
}
// Basic type includes
if (m_typeInfo.needsSalTypes)
{
file.beginLine().append("#include <sal/types.h>").endLine();
}
if (m_typeInfo.needsRtlUstring)
{
file.beginLine().append("#include <rtl/ustring.hxx>").endLine();
}
}
void CppIncludeManager::writeUnoIncludes(CppFile& file)
{
// Core UNO types - implemented: Any
if (m_typeInfo.needsAny)
{
file.beginLine().append("#include <com/sun/star/uno/Any.hxx>").endLine();
file.beginLine().append("#include <uno/data.h>").endLine();
file.beginLine().append("#include <cppu/unotype.hxx>").endLine();
}
if (m_typeInfo.needsSequence)
{
file.beginLine().append("#include <com/sun/star/uno/Sequence.hxx>").endLine();
file.beginLine().append("#include <uno/sequence2.h>").endLine();
file.beginLine().append("#include <typelib/typedescription.h>").endLine();
}
if (m_typeInfo.needsPropertyValue)
{
// TODO: implement PropertyValue handling
file.beginLine().append("// TODO: Add PropertyValue includes").endLine();
file.beginLine().append("#include <com/sun/star/beans/PropertyValue.hpp>").endLine();
}
}
void CppIncludeManager::writeInterfaceIncludes(CppFile& file, std::string_view interfaceName)
{
// Include the interface being processed
OString selfInclude = "<" + OString(interfaceName).replaceAll("."_ostr, "/"_ostr) + ".hpp>";
file.beginLine().append("#include ").append(selfInclude).endLine();
// Include headers for all interface types found in the analysis
for (const auto& interfaceType : m_typeInfo.interfaceTypes)
{
// Don't include ourselves twice
if (interfaceType != interfaceName)
{
OString includeFile = "<" + interfaceType.replaceAll("."_ostr, "/"_ostr) + ".hpp>";
file.beginLine().append("#include ").append(includeFile).endLine();
}
}
}
OString CppIncludeManager::calculateRelativeIncludePath(const CppFile& file,
const OString& targetType,
const std::string& extension)
{
namespace fs = std::filesystem;
// Get the current file's directory
fs::path currentFilePath = file.getPath();
fs::path currentDir = currentFilePath.parent_path();
// Convert target type name to path (dots to slashes)
std::string targetTypeStr(targetType);
std::replace(targetTypeStr.begin(), targetTypeStr.end(), '.', '/');
// Find the base directory (cpp)
fs::path baseDir = currentDir;
while (baseDir.has_parent_path() && baseDir.filename() != "cpp")
{
baseDir = baseDir.parent_path();
}
// Create target file path
fs::path target = (baseDir / (targetTypeStr + extension)).lexically_normal();
// If they're in the same directory, just use the filename
if (target.parent_path() == currentDir)
{
std::string result = target.filename().string();
return OString("\"" + result + "\"");
}
// Otherwise calculate relative path from current directory to target file
fs::path rel;
try
{
rel = fs::relative(target, currentDir);
}
catch (const std::exception&)
{
// Fallback: use the path relative to base directory
rel = fs::relative(target, baseDir);
}
std::string result = rel.generic_string();
return OString("\"" + result + "\"");
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */