Why does clang-format wrap this long line the way it does? - clang-format

In clang-format the following template function declaration gets wrapped to three lines. I think it should only be wrapped to two. Is the problem in my .clang-format file or a bug in the tool?
template <class VEC3_T, class FLOAT_T>
FLOAT_T functionNamedBlahBlahhh(const VEC3_T blabla, const VEC3_T bla, FLOAT_T blah1,
FLOAT_T blah2) // foo
{
}
I am using clang-format version 10.0.0.
My .clang-format file is:
BasedOnStyle: LLVM # (LLVM, Google, Chromium, Mozilla, WebKit)
AccessModifierOffset: -4
AlignEscapedNewlines: Left
AllowShortBlocksOnASingleLine: true
AllowShortCaseLabelsOnASingleLine: true
AllowShortFunctionsOnASingleLine: true
AllowShortIfStatementsOnASingleLine: true
AllowShortLoopsOnASingleLine: true
BreakBeforeBraces: Custom # If this is "Custom" then use the BraceWrapping settings
BraceWrapping:
AfterClass: false
AfterStruct: false
AfterUnion: true
AfterEnum: true
AfterNamespace: false
AfterControlStatement: false
AfterFunction: true
AfterExternBlock: false
BeforeCatch: true
BeforeElse: false
IndentBraces: false
SplitEmptyFunction: true
SplitEmptyRecord: true
SplitEmptyNamespace: true
BreakConstructorInitializers: AfterColon
ColumnLimit: 130 # Drawback: AllowShort*OnASingleLine kind of goes crazy with it. Is there a Penalty property to adjust this?
IncludeBlocks: Regroup
IndentCaseLabels: false
IndentWidth: 4
KeepEmptyLinesAtTheStartOfBlocks: false
PointerAlignment: Left
SpaceBeforeCpp11BracedList: true
UseTab: Never
I see a few other cases where it wraps a long line to 3+ lines, as well. Here's one more:
OCLShaderEnv::OCLShaderEnv(OCLEnv* oclEnv, SVMStruct* svm, std::string prog, std::string kernelName, int width, int height,
std::string buildOptions, Camera* camera, void* otherStuff, std::array<float, 4> fillColor) :
m_device(oclEnv->getDevice()),
m_context(oclEnv->getContext()), m_cmdQ(oclEnv->getCmdQ()), m_prog(prog), m_kernelName(kernelName), m_width(width),
m_height(height), m_camera(camera), m_svmStructPtr(svm), m_oclEnv(oclEnv)
{
}
Note the three lines of initializers that could easily fit on two.

In your first example, there appears to be an interaction between 1) starting with just one of the parameters on a line, and 2) having a comment on that line. If you remove the comment, it formats to:
template <class VEC3_T, class FLOAT_T>
FLOAT_T functionNamedBlahBlahhh(const VEC3_T blabla, const VEC3_T bla, FLOAT_T blah1, FLOAT_T blah2)
{
}
as you would expect. If you leave the comment, but start with all parameters on one line, it leaves them all on one line, as you would expect.
It seems like a bug in clang-format to me. Possibly it is intended behavior, thinking that the comment must apply to just that parameter and so shouldn't be moved around? But it's hard to imagine that being very useful.
Workaround: Remove the comment, or manually put all parameter together on one line.
In your second example, this seems to be an interaction between 1) having a constructor with enough parameters that the parameters take multiple lines, 2) having multiple initializers for that constructor, and 3) setting BreakConstructorInitializers: AfterColon. In this case, the first initializer is put on its own line even if it could be combined with the subsequent initializers.
This also seems like a bug in clang-format to me.
Workaround: Reduce the parameters to the constructor so that they fit on one line - which I know you shouldn't have to do, but might make your code cleaner anyway. Or set BreakConstructorInitializers to something other than AfterColon. Or just live with the sub-optimal formatting, which is probably what I would do :(.

Related

Making a frame visible is possible but making invisible is not

script.Parent.MouseButton1Click:Connect(function()
if script.Parent.Parent.Frame.Visible == true then
script.Parent.Parent.Frame.Visible = false
end
if script.Parent.Parent.Frame.Visible == false then
script.Parent.Parent.Frame.Visible = true
end
end)
I am very new to coding (have started practically yesterday ) and ive decided to start with lua in roblox studio. The program here is working i can assure you (some things in code may not be in proper place since im having a bit trouble writing code on this site) but the code works. I have tried to make it seperatly for 2 buttons then I tried this and nothing seems to work. I am starting to think it is caused by the program itself and not the code since I can make other things invisible with that code. I've placed those 2 codes for visibility and invisibility in 1 thing since I've been told that events caused by the code happen at same time so some of them may not work.
Assume Visible is true. The first condition will be true and Visible will be set to false. Then, in the next condition Visible is false and the condition is therefore true, again. And it sets Visible back to true.
Now, in order to fix it you want to execute the second condition only if the first failed. Take a look at elseif https://www.lua.org/pil/4.3.1.html.
script.Parent.MouseButton1Click:Connect(function()
if script.Parent.Parent.Frame.Visible == true then
script.Parent.Parent.Frame.Visible = false
elseif script.Parent.Parent.Frame.Visible == false then
script.Parent.Parent.Frame.Visible = true
end
end)
This code is still quite bulky and can be improved:
script.Parent.MouseButton1Click:Connect(function()
script.Parent.Parent.Frame.Visible = not script.Parent.Parent.Frame.Visible
end)
Now you assign true to Visible if Visible does not evaluate to true. It basically toggles the boolean.

Force function arguments on individual lines

I want to format arguments as one per line, e.g. as follows:
cls.def(
"isHomogeneousElastic",
&SUB::System::isHomogeneousElastic,
"isHomogeneousElastic");
However, clang-format wants to format this as:
cls.def(
"isHomogeneousElastic", &SUB::System::isHomogeneousElastic, "isHomogeneousElastic");
How can I avoid this?
I found this question & answer with the solution of using:
BinPackArguments: false
BinPackParameters: false
ExperimentalAutoDetectBinPacking: false
AllowAllParametersOfDeclarationOnNextLine: false
which works on some parts in my code, but not on this particular example.

Neovim Lua isdirectory vim function

I am hoping to set up keymaps for when I am in a git directory and when I am not. Maybe now that I am using Lua that maybe I cannot do this like this. Any help would be appreciated.
if vim.fn.isdirectory('.git') then
map('n', '<leader>t', '<cmd>lua require(\'telescope.builtin\').git_files({hidden = true})<CR>', options)
else
map('n', '<leader>e', '<cmd>lua require(\'telescope.builtin\').find_files({hidden = true})<CR>', options)
end
Seems like if always hits and never the else.
:h isdirectory
isdirectory({directory})
isdirectory() The result is a Number,
which is non-zero when a directory with the name {directory} exists.
If {directory} doesn't exist, or isn't a directory, the result is
FALSE. {directory} is any expression, which is used as a String.
:h FALSE
For boolean operators Numbers are used. Zero is FALSE, non-zero is
TRUE. You can also use |v:false| and |v:true|. When TRUE is returned
from a function it is the Number one, FALSE is the number zero.
Make sure that FALSE is actually false. It is probably 0 which would be a true value in Lua.
In Lua any values but false or nil are true.
So ideally check if vim.fn.isdirectory('.git') ~= 0 then

LUA - OnUpdate shift modifier

I'm changing something in an Addon for World of Warcraft which are written in Lua.
There is a simple boolean variable which determines if some "all" frames are shown or only specific one.
So when = true then it will only show specific frames
when = false it will show all frames
I want to make a modifier with the shift key to show all frames when the shiftkey is pressed and hide them again when shift is realeased.
if IsShiftKeyDown() then
cfg.aura.onlyShowPlayer = false
else
cfg.aura.onlyShowPlayer = true
end
This is my very simple solution for it which works. The problem here is though it only works on starting of the script. You see in WoW everytime the interface gets loaded it will run the script if not told otherwise. That is not very efficent because I would send my user into a loadingscreen.
OnUpdate should fix my problem here which will run this specific code everytime a frame gets rendered which is pretty handy and is what I want to accomplish.
So this is what I made
local function onUpdate(self,elapsed)
if IsShiftKeyDown() then
cfg.aura.onlyShowPlayer = false
else
cfg.aura.onlyShowPlayer = true
end
end
local shiftdebuffs = CreateFrame("frame")
shiftdebuffs:SetScript("OnUpdate", onUpdate)
My problem is now that it doesn't work. I new to the onUpdate stuff and only copy pasted it from another addon I did which worked fine.
Right it goes straight to = false, which is only happening I think because it is the default.
thanks for the help
Right it goes straight to = false, which is only happening I think because it is the default.
No, there is no "default" branch in the if statement. For the control to get to the then branch the condition has to be evaluated to true. You need to check the logic, but if the script executed cfg.aura.onlyShowPlayer = false, it means that IsShiftKeyDown() was evaluated as true.

Crystal Reports - two print formats

I have two ways to print a report, into a PDF or on letterhead.
Is it possible to have in a report a customization so that in the PDF I have a logo in the header, and on the letterhead I don't have that logo in the header?
You could add a parameter with a boolean to the report. Something like IsPDF and then in the header Click on the Format Graphic (assuming it is an image) of the logo and then choose the X2 across from the Suppress checkbox.
From there you can write code that will suppress the graphic when the IsPDF paramater is False and not suppress when the IsPDF is True.
IF {?IsPDF} = True Then
False
Edit: After writing this out I think I would actually make the boolean parameter be IsLetterHead so that when it was True it would be consistent with the True in the Suppress. In other words
IF {?IsLetterHead} = True Then
True

Resources