private void buildFromParameter(
      @NotNull final TypeEvalContext context,
      @Nullable final PsiElement outerElement,
      @NotNull final PsiElement elementDefinition) {
    myBody.addItem(combUp("Parameter " + PyUtil.getReadableRepr(elementDefinition, false)));
    boolean typeFromDocstringAdded =
        addTypeAndDescriptionFromDocstring((PyNamedParameter) elementDefinition);
    if (outerElement instanceof PyExpression) {
      PyType type = context.getType((PyExpression) outerElement);
      if (type != null) {
        String typeString = null;
        if (type instanceof PyDynamicallyEvaluatedType) {
          if (!typeFromDocstringAdded) {
            typeString = "\nDynamically inferred type: ";
          }
        } else {
          if (outerElement.getReference() != null) {
            PsiElement target = outerElement.getReference().resolve();

            if (target instanceof PyTargetExpression) {
              final String targetName = ((PyTargetExpression) target).getName();
              if (targetName != null
                  && targetName.equals(((PyNamedParameter) elementDefinition).getName())) {
                typeString = "\nReassigned value has type: ";
              }
            }
          }
        }
        if (typeString == null && !typeFromDocstringAdded) {
          typeString = "\nInferred type: ";
        }
        if (typeString != null) {
          myBody.addItem(combUp(typeString));
          PythonDocumentationProvider.describeTypeWithLinks(
              myBody, elementDefinition, type, context);
        }
      }
    }
  }