phpowermove / php-code-generator

PHP code generator library
https://php-code-generator.readthedocs.org
Apache License 2.0
147 stars 43 forks source link

How to preserve new lines in method body? #61

Open matak opened 5 years ago

matak commented 5 years ago

Hi, wonderfull library, but after several hours, i realize that i cant use it.

I would like to use this library to scaffolding my code. With help of AutoIt I want to replace the whole code in text window with scaffolded dependency injection of use statements etc.

But the problem is, that it is not possible to preserve the new lines and whitespaces in the body of methods, is it true? Am I right?

So when i want to update this code

public function renderDefault()
{
    $stockinRow = $this->stockinRepositoryService->findById($this->stockin_id);

    $pageHeader = $this['pageHeader'];
    $pageHeader->setTitle("Naskladnění [" . $stockinRow->id . "] " . $stockinRow->dateArrival->format("d.m.Y") . " , profil dodavatele: " . $stockinRow->supplierProfile->name);

    $template = $this->template;
    $template->dataStockinItems = $this->stockinItemRepositoryService->selectAll()->where("stockin_id = ?", $this->stockin_id)->order("EAN ASC")->fetchAll();
}

I get this code,

public function renderDefault() {
    $stockinRow = $this->stockinRepositoryService->findById($this->stockin_id);
    $pageHeader = $this['pageHeader'];
    $pageHeader->setTitle("Naskladnění [" . $stockinRow->id . "] " . $stockinRow->dateArrival->format("d.m.Y") . " , profil dodavatele: " . $stockinRow->supplierProfile->name);
    $template = $this->template;
    $template->dataStockinItems = $this->stockinItemRepositoryService->selectAll()->where("stockin_id = ?", $this->stockin_id)->order("EAN ASC")->fetchAll();
}

so quite messy. Can I somehow prevent it?

As i searched in code, it seems that builder knows that originally the row was on line 31 and next row was on line 33, so there should be new line string.

gossi commented 5 years ago

For my understanding:

  1. You read in the first block of code into a model
  2. You regenerator the code from the model
  3. The regenerated code doesn't contain the blank lines of the body

Is that the problem you are describing? Can you provide your code generator config?

matak commented 5 years ago

Yes exactly!

$phpClass = PhpClass::fromFile($filePath);

$codeGeneratorConfig = new CodeGeneratorConfig([
            'generateScalarTypeHints' => true,
            'generateReturnTypeHints' => true,
            'generateEmptyDocblock' => false,
            'enableSorting' => false,
            'useStatementSorting' => false,
            'constantSorting' => false,
            'propertySorting' => false,
            'methodSorting' => false,
]);

$generator = new CodeGenerator($codeGeneratorConfig);
return '<?php' . "\n\n" . $generator->generate($phpClass);

this is the most simple sample of my use case, the return is as i desribed in previous post

gossi commented 5 years ago

Ok, thanks. Could be a bug. Isn't even covered by tests, I'll try to tackle it on the weekend.

matak commented 5 years ago

Maybe my pull request is not the best solution, maybe you could inject different PHP PrettyPrinter?

gossi commented 5 years ago

I merged your PR - thanks for that, it's on master. I'll keep this open, since tests for this are missing.